私は既存のシステムを継承し、いくつかのことを理解しようとしています。
システムは
SELECT * FROM v_myView WHERE mvViewCol = 'someValue'
に基づいてv_myViewの合計を実行しますTable1myViewCol
SQL Server 2005はクエリを最適化しますか、それとも合計は常に全体で発生しますTable1か?
パラメータ化されたビューを使用できることは理解していますが、不必要に変更を加えたくありません。
乾杯ジェフ
私は既存のシステムを継承し、いくつかのことを理解しようとしています。
システムは
SELECT * FROM v_myView WHERE mvViewCol = 'someValue'
に基づいてv_myViewの合計を実行しますTable1myViewCol
SQL Server 2005はクエリを最適化しますか、それとも合計は常に全体で発生しますTable1か?
パラメータ化されたビューを使用できることは理解していますが、不必要に変更を加えたくありません。
乾杯ジェフ
ビューには実行時のコストはまったくありません。ビュー定義をテキストとして貼り付けたかのように、それらは常に周囲のクエリにインライン化されます。それ以外の方法で使用するのは実用的ではありません。
SQL Server(2005)はクエリを最適化しますか、それとも合計は常にTable1全体で発生しますか。
最適化されます。
これは複雑な質問です。一番いい説明はここにあると思います。この点に関して、Microsoftのドキュメントがもう少し明確になっていることを望みます。
ビューが作成されると、クエリが解析されます。これはそれが正しいことを保証します。
実行プランは、クエリが最初に実行されたときに決定されます(近似値)。この実行プランは、後続の呼び出しのためにプランキャッシュに残ります。したがって、適切な列にインデックスがあり、最初の実行にwhereインデックスを使用する句がある場合、後続の呼び出しでもインデックスが使用されます。
プランがプランキャッシュにないときにビューが呼び出されるのは実際には初めてなので、近似的に言います。データベースへの特定の変更は、サーバーの再起動と同様に、計画をフラッシュします。
したがって、where句を使用してビューにのみアクセスする場合、ビューの後続の使用はその目的のために最適化されます。
SQL Server 2005は、クエリで参照されるたびにビューを最適化します:http ://technet.microsoft.com/en-us/library/cc917715.aspx
「ビューの拡張後、SQLServerクエリオプティマイザーは実行中のクエリの単一の実行プランをコンパイルします。」
2005をインストールしていませんが、2008R2と同様に動作します-クエリ最適化プランを表示するには、クエリウィンドウを右クリックし、[推定実行プランの表示]を選択して詳細を確認し、ボトルネックを特定します。
[クエリ]メニューオプションには、[データベースチューニングアドバイザーでクエリを分析する]があり、これも役立つ場合があります。