sql >> データベース >  >> RDS >> Sqlserver

ビューは単純なクエリよりも高速ですか?

    はい 、ビューできます クラスタ化されたインデックスが割り当てられており、割り当てられている場合は、結果のクエリを高速化できる一時的な結果が保存されます。

    Microsoft独自のドキュメントでは、ビューによってパフォーマンスが向上することが非常に明確になっています。

    まず、人々が作成するほとんどのビューはシンプル ビューを表示し、この機能を使用しないため、ベーステーブルを直接クエリするのと同じです。シンプルなビューがその場で拡張されるため、パフォーマンスの向上に直接貢献しない -それだけは真実です。 ただし インデックス付きのビューは劇的に パフォーマンスを向上させます。

    ドキュメントに直接移動します:

    ビューに一意のクラスター化されたインデックスが作成されると、ビューの結果セットがすぐに具体化され、データベースの物理ストレージに保持されるため、実行時にこのコストのかかる操作を実行するオーバーヘッドが節約されます。

    次に、これらのインデックス付きビューは、別のクエリによって直接参照されていない場合でも機能します オプティマイザは、必要に応じてテーブル参照の代わりにそれらを使用するためです。

    繰り返しますが、ドキュメント:

    インデックス付きビューは、2つの方法でクエリの実行に使用できます。クエリはインデックス付きビューを直接参照できます。さらに重要なことに、クエリオプティマイザは、ビューを最低コストのクエリプランのクエリの一部またはすべてに置き換えることができると判断した場合に、ビューを選択できます。 2番目のケースでは、基になるテーブルとその通常のインデックスの代わりに、インデックス付きビューが使用されます。クエリオプティマイザがクエリの実行中にビューを使用するために、クエリでビューを参照する必要はありません。これにより、既存のアプリケーションは、それらのアプリケーションを変更することなく、新しく作成されたインデックス付きビューの恩恵を受けることができます。

    このドキュメント、およびパフォーマンスの向上を示すチャートは、ここにあります。

    更新2: その答えは、「ビュー」ではなく、パフォーマンス上の利点を提供するのは「インデックス」であるという理由で批判されています。ただし、これは簡単に反論されます。

    私たちは小さな国のソフトウェア会社だとしましょう。例としてリトアニアを使用します。ソフトウェアは世界中で販売されており、SQLServerデータベースに記録を保持しています。私たちは非常に成功しているので、数年で1,000,000以上のレコードがあります。ただし、税務上の目的で売上を報告する必要がある場合が多く、母国ではソフトウェアを100部しか販売していないことがわかりました。リトアニアのレコードのみのインデックス付きビューを作成することにより、MSのドキュメントで説明されているように、必要なレコードをインデックス付きキャッシュに保持できます。 2008年にリトアニアの売上に関するレポートを実行すると、クエリは深さ7のインデックス(未使用の葉を含むLog2(100))を検索します。 VIEWを使用せずに同じことを行い、テーブルへのインデックスのみに依存する場合、検索深度21のインデックスツリーをトラバースする必要があります。

    明らかに、ビュー自体は、インデックスのみを使用するだけの場合に比べて、パフォーマンス上の利点(3倍)を提供します。実際の例を使用してみましたが、リトアニアの売上の簡単なリストを使用すると、さらに大きな利点が得られることに気付くでしょう。

    例として、まっすぐなBツリーを使用していることに注意してください。 SQL Serverがbツリーのいくつかのバリアントを使用していることはかなり確信していますが、詳細はわかりません。それでも、要点は成り立ちます。

    更新3: インデックス付きビューが、基になるテーブルに配置されたインデックスのみを使用するかどうかについての質問が出てきました。つまり、言い換えると、「インデックス付きビューは標準のインデックスと同等であり、ビューに新しいものや固有のものは何も提供されません。」もちろん、これが真実である場合、上記の分析は正しくありません。この批判が有効または真実ではないと私が考える理由を示すMicrosoftのドキュメントからの引用を提供させてください:

    インデックスを使用してクエリのパフォーマンスを向上させることは、新しい概念ではありません。ただし、インデックス付きビューには、標準のインデックスでは達成できない追加のパフォーマンス上の利点があります。

    物理ストレージ内のデータの永続性に関する上記の引用や、ビューでのインデックスの作成方法に関するドキュメント内の他の情報と合わせて、インデックス付きビューはないと言っても過言ではありません。 メインテーブルで定義されたインデックスを使用するキャッシュされたSQLSelectだけです。したがって、私はこの答えを支持し続けます。



    1. WHERE句で同じ列を複数回使用する

    2. Neo4jクエリ言語-Cypher

    3. R12.2オンラインパッチでのシードデータの処理

    4. MariaDBでのPERIOD_ADD()のしくみ