ビュー上のSQLサーバークラスター化インデックス
-
06-07-2019 - |
質問
非常に複雑な選択クエリからビューを作成しようとしていますが、サブクエリといくつかの集計関数を使用する必要があるため、クラスタ化インデックスを配置できません。
クラスター化インデックスを取得する必要があります。取得しないと、ビューを使用するクエリに時間がかかります。明らかに、SQLサーバーは、愚かな量の基準を満たしている場合にのみ結果セットを保存します。
ビューのベーステーブルは読み取り専用であり、バルクインポートによって1日に1回のみ更新されます。結果をキャッシュできない理由がわかりません。
SQLサーバーにビューの結果をキャッシュさせ、後で照会できるようにする方法を知っている人はいますか?私は本当に、あちこちでたくさんの変更に雪だるま式のテーブルcosを作りたくありません。
事前に感謝します。
解決
あなたが探している答えは次のとおりだと思います: これを行うためにビューを使用しないでください。 SQLクエリから返されるフィールドに対応するフィールドを持つテーブルを使用します。 クエリを自動化してこのテーブルに入力します
他のヒント
簡単な答えは、言及した理由により、クラスター化インデックスを作成できないことです。
複雑なクエリの結果をキャッシュする方法を要求する場合、SQL Serverが提供する(そして問題を解決する)他のオブジェクトはテーブルのみです。
自動化に問題がある場合は、ビューの作成を検討する必要がありますが、テーブルに挿入する方法としてのみ使用して、一括挿入。
SSIS(SQL Server Integration Services)を使用する場合、これは比較的簡単に追加できます。
私が知っている限り、実行計画をコンパイルするとき、SQL Serverは基本的にビューの定義をそのコンパイルするクエリにコピーアンドペーストします-基礎となるテーブルにインデックスを追加できる限りクエリから良好なパフォーマンスを取得します。
構築しているものはデータウェアハウスのように聞こえるので、最良のオプションは、データがシステムに入ったら操作することです。非正規化された(または、それ以外の場合はそれを変更している)新しいテーブルを作成し、インデックスを作成してクエリをすばやく実行できます。
必要に応じて、これらのテーブルの上にビューを構築できます。
インデックス付きビュー内で集計を使用する場合、COUNT()の代わりにCOUNT_BIG()を使用する必要があります。そうしないと、ビューは作成されません
また、Enterprise Editionを使用していない場合は、NOEXPANDヒントを提供する必要があります。そうでない場合、オプティマイザーはビューを使用しません
SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....
ビューは必要ないかもしれませんが、テーブルに正しいインデックスがありません。テーブルのDDL(インデックスと制約を含む)を投稿できますか
同じ問題が発生し、サブクエリをクラスター化インデックスビュー自体に配置することになりました。