はい:
- SQL Server 2014以降を実行している。そして
- トレースフラグ176をアクティブにしてクエリを実行できます。そして
- 計算列は
PERSISTED
具体的には、少なくとも次のバージョンが必要です。
- SQL Server 2016 SP1用の累積的な更新2
- SQL Server 2016 RTMの累積的な更新4
- SQL Server 2014 SP2用の累積的な更新6
しかし、バグを回避(のためのREFに2014を、そしてために2016年と2017年)の代わりに、それらの修正で導入され、適用されます。
トレースフラグは–T
、を使用するグローバルスコープとセッションスコープの両方でDBCC TRACEON
、およびクエリごとOPTION (QUERYTRACEON)
またはプランガイドで、スタートアップオプションとして有効です。
トレースフラグ176は、永続的な計算列の展開を防ぎます。
クエリのコンパイル時に実行される初期メタデータのロードは、直接参照される列だけでなく、すべての列を取り込みます。これにより、すべての計算列の定義を照合に使用できるようになります。これは一般に良いことです。
不幸な副作用として、ロードされた(計算された)列の1つがスカラーのユーザー定義関数を使用する場合、計算列が実際に使用されていなくても、その存在によりクエリ全体の並列処理が無効になります。
トレースフラグ176は、列が永続化されている場合、定義をロードしないことでこれを支援します(展開がスキップされるため)。この方法では、スカラーのユーザー定義関数はコンパイルクエリツリーに存在しないため、並列処理は無効になりません。
トレースフラグ176の主な欠点(文書化されているだけではないこと)は、永続化された計算列と一致するクエリ式も防ぐことです:クエリに永続化された計算列と一致する式が含まれている場合、トレースフラグ176は式が置換されることを防ぎます計算列への参照。
詳細については、SQLPerformance.comの記事「適切に永続化された計算列」を参照してください。
質問では計算列とスカラー関数を使用して値をプロモートする代わりにXMLに言及しているため、「選択的XMLインデックス:悪くない」で書いたように、選択的XMLインデックスの使用も検討できます。