web-dev-qa-db-ja.com

なぜビューにインデックスを付けたいのですか?

Microsoft SQL Serverでは、ビューにインデックスを追加できますが、これを行う理由は何ですか?

私の理解では、ビューは実際には単なるサブクエリである、つまり、SELECT * FROM myViewと言うと、実際にはSELECT * FROM(myViewのクエリ)と言っている

基になるテーブルのインデックスが最も重要なインデックスになるようです。では、なぜビューに別のインデックスが必要なのでしょうか?

37
Slider345

ビューにインデックスが付けられている場合、インデックスのみを使用して応答できるクエリは、基になるテーブルを参照する必要はありません。これにより、パフォーマンスが大幅に向上する可能性があります。

基本的に、データベースエンジンは、基になるテーブルを更新するときにクエリの "解決済み"バージョン(クエリのインデックス)を維持し、可能な場合は元のテーブルではなくその解決済みバージョンを使用します。

Database Journalの良い 記事 をご覧ください。

36
Larry Lustig

Microsoft SQL Serverでは、ビューにインデックスを追加できますが、これを行う理由は何ですか?

クエリを高速化する。

私の理解では、ビューは実際には単なるサブクエリである、つまり、SELECT * FROM myViewと言うと、実際にはSELECT * FROM(myViewのクエリ)と言っている

常にではない。

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

すべてのビューにインデックスを付けることができるわけではありません。

たとえば、ビューでGROUP BYを使用している場合、インデックスを作成するにはCOUNT_BIGを含める必要があり、その中のすべての集計関数はUNION ALLSUMおよびCOUNT_BIGは実際です)。これは、インデックスを保守可能にするために必要であり、基礎となるテーブルの更新により、タイムリーにビューを更新できます。

4
Quassnoi

次のリンクは、特にパフォーマンスの向上のセクションで言うことができるよりも、より良い言葉遣いの情報を提供します。それが役に立てば幸い

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

3
Daniel Casserly

ベーステーブルと同じ理由で、そのビューに対するクエリのパフォーマンスを向上させるために、ビューにインデックスを作成します。それを行うもう1つの理由は、ベーステーブルに対して実装できない一意性制約を実装することです。残念ながら、SQL Serverでは、ビューに制約を作成することはできません。

0
nvogel