2011-01-19 14 views
36

Microsoft SQL Serverでは、ビューにインデックスを追加することができますが、なぜこれを行う必要がありますか?ビューにインデックスを挿入する理由を教えてください。

私の理解では、ビューは本当にただのサブクエリであるということです私はMYVIEW SELECT * FROM言うならば、つまり、私は本当に* SELECT言って

(MYVIEWのクエリ)から、それは根本的にインデックスのように思えますテーブルは最も重要なものになります。だから、なぜあなたはビューに別のインデックスが必要でしょうか?

答えて

32

ビューが索引付けされている場合、索引のみを使用して回答できる問合せは、基礎となる表を参照する必要はありません。これにより、パフォーマンスが大幅に向上する可能性があります。

基本的に、データベースエンジンは、基礎となるテーブルを更新し、可能であれば元のテーブルではなく解決したバージョンを使用して、クエリの「解決済み」バージョン(またはクエリのインデックス)を維持します。

ここにはデータベースジャーナルのarticleがあります。

+0

私はちょうど誰かにこれを説明しようとしてしまった。 – msarchet

+0

ここでは、インデックスビューに関する優れたドキュメントがあります。http://msdn.microsoft.com/en-us/library/ms187864.aspx –

+3

+1:非マテリアライズドビューには情報が格納されていると想定していますが、実際にはマテリアライズされているだけですビュー(サポートされている場合 - IE:MySQLまたはPostgreSQLではない)のビューです。 –

3

以下のリンクは、特にパフォーマンスの向上のセクションで私が言うことができるよりも良い言葉の情報を提供します。そのビューに対するクエリのパフォーマンスを向上させるために:それはあなたがベーステーブル上と同じ理由で、ビューにインデックスを作成

http://technet.microsoft.com/en-us/library/cc917715.aspx

0

お役に立てば幸いです。これを行うもう1つの理由は、基本表に対して実装できない一意制約を実装することです。残念ながら、SQL Serverではビューに制約を作成できません。

4

Microsoft SQL Serverでは、ビューにインデックスを追加することができますが、これはなぜですか?

クエリを高速化します。

私の理解では、ビューは、私がMYVIEW SELECT * FROMを言うならば、私は本当に*(MYVIEWのクエリ)FROM

必ずしもSELECT言っている、すなわち、実際には、サブクエリであるということです。

ビューにクラスタ化インデックスを作成すると、ビューがマテリアライズされ、基になるテーブルの更新によって物理的にビューが更新されます。このビューに対する問合せは、基礎となる表にアクセスする場合とアクセスしない場合があります。

すべてのビューにインデックスを付けることはできません。例えば

、それはCOUNT_BIGが含まれている必要があり、その中のすべての集約関数は(のみSUMCOUNT_BIGが実際にある)UNION ALL上で配布してください刃先交換式であるためにあなたは、ビュー内のGROUP BYを使用している場合。これは、索引をメンテナンス可能にするために必要です。基礎となる表の更新によって、適時にビューが更新される可能性があります。

+0

また、ビューを呼び出すビューのインデックスを作成することもできません。 – HLGEM

+4

@HLGEM:ここでは言及していないより多くの制限があります。 – Quassnoi

+2

それ以上のことがあると思いました。 – HLGEM

関連する問題