次のようないくつかのアカウントフィールドを持つテーブルがあります。
MAIN_ACCT
GROUP_ACCT
SUB_ACCT
私はしばしばこれらを次のように組み合わせる必要があります:
SELECT MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT
FROM ACCOUNT_TABLE
これを自動的に行う計算フィールドが欲しいので、次のように言うことができます。
SELECT ACCT_NUMBER FROM ACCOUNT_TABLE
これを行うための最良の方法は何ですか?
SQL Server2005を使用しています。
ALTER TABLE ACCOUNT_TABLE
ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT PERSISTED
これにより、計算された列が保持され、レコードが多数ある場合は、ビューまたはUDFでの計算よりも選択でパフォーマンスが向上する可能性があります(列の最初の作成が行われると、非常に遅くなる可能性があり、使用時間が少ないときに発生する可能性があります)。挿入と更新が遅くなります。通常、ロックの問題が発生しない限り、遅い挿入または更新は、選択の遅延よりもユーザーの方が許容できると思います。
これを行うための最良の方法は、使用法と必要なパフォーマンスの種類に大きく依存します。多くのレコードがない場合、または計算列がそれほど頻繁に呼び出されない場合は、永続化された列は必要ないかもしれませんが、その年のすべてのレコードまたはその他の大規模なセットを含むレポートを頻繁に実行している場合データの場合、永続化された計算列の方が適している場合があります。この種のタスクと同様に、状況で何が最も効果的かを知る唯一の方法はテストすることです。
これは、ビューの優れた候補です。
CREATE VIEW vwACCOUNT_TABLE
AS
SELECT MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT AS ACCT_NUMBER
FROM ACCOUNT_TABLE
GO
--now select from the View
SELECT ACCT_NUMBER FROM vwACCOUNT_TABLE
ALTER TABLE ACCOUNT_TABLE ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT;
列はテーブルに永続化されず、参照するたびにオンザクライで再作成されます。ビューを使用しても同じ結果を得ることができます。計算列でフィルタリング述語または順序付けを使用していて、それにインデックスを追加する場合は、 計算列でのインデックスの作成 を参照してください。
そうですね、ACCOUNT_TABLEのビューを作成して、それをクエリすることができます。または、同じことを実行するユーザー定義関数を作成できると思います。