Microsoft SQL Serverでは、ビューにインデックスを追加できますが、これを行う理由は何ですか?
私の理解では、ビューは実際には単なるサブクエリである、つまり、SELECT * FROM myViewと言うと、実際にはSELECT * FROM(myViewのクエリ)と言っている
基になるテーブルのインデックスが最も重要なインデックスになるようです。では、なぜビューに別のインデックスが必要なのでしょうか?
ビューにインデックスが付けられている場合、インデックスのみを使用して応答できるクエリは、基になるテーブルを参照する必要はありません。これにより、パフォーマンスが大幅に向上する可能性があります。
基本的に、データベースエンジンは、基になるテーブルを更新するときにクエリの "解決済み"バージョン(クエリのインデックス)を維持し、可能な場合は元のテーブルではなくその解決済みバージョンを使用します。
Database Journalの良い 記事 をご覧ください。
Microsoft SQL Serverでは、ビューにインデックスを追加できますが、これを行う理由は何ですか?
クエリを高速化する。
私の理解では、ビューは実際には単なるサブクエリである、つまり、SELECT * FROM myViewと言うと、実際にはSELECT * FROM(myViewのクエリ)と言っている
常にではない。
ビューでクラスター化インデックスを作成することにより、ビューを具体化し、基礎となるテーブルを更新すると、ビューが物理的に更新されます。このビューに対するクエリは、基になるテーブルにアクセスする場合とアクセスしない場合があります。
すべてのビューにインデックスを付けることができるわけではありません。
たとえば、ビューでGROUP BY
を使用している場合、インデックスを作成するにはCOUNT_BIG
を含める必要があり、その中のすべての集計関数はUNION ALL
(SUM
およびCOUNT_BIG
は実際です)。これは、インデックスを保守可能にするために必要であり、基礎となるテーブルの更新により、タイムリーにビューを更新できます。
次のリンクは、特にパフォーマンスの向上のセクションで言うことができるよりも、より良い言葉遣いの情報を提供します。それが役に立てば幸い
ベーステーブルと同じ理由で、そのビューに対するクエリのパフォーマンスを向上させるために、ビューにインデックスを作成します。それを行うもう1つの理由は、ベーステーブルに対して実装できない一意性制約を実装することです。残念ながら、SQL Serverでは、ビューに制約を作成することはできません。