1. ホーム
  2. sql

[解決済み] ビューは単純なクエリよりも高速ですか?

2022-03-24 06:37:07

質問

select *  from myView

ビューを作成するためのクエリ自体よりも高速になります (同じ結果セットを持つため)。

select * from ([query to create same resultSet as myView])

?

ビューが何らかのキャッシュを使用して、単純なクエリと比較して高速化されているかどうかは、私にはまったくわかりません。

どのように解決するのですか?

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

Microsoft 自身のドキュメントでは、Views がパフォーマンスを向上させることができることを明確にしています。

まず、人々が作成するほとんどのビューは シンプル ビューを作成し、この機能を使用しないため、基本テーブルを直接照会するのと変わりません。シンプルなビューはその場で展開されるため パフォーマンス向上に直接寄与しない - その通りです。 しかし インデックス付きビューは 劇的に は、パフォーマンスを向上させます。

直接ドキュメントを拝見させてください。

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

第二に、これらのインデックス付きビューは、以下のように動作します。 他のクエリから直接参照されない場合でも オプティマイザは、適切な場合にテーブル参照の代わりにそれらを使用するためです。

またまた、ドキュメントです。

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

このドキュメントと、パフォーマンスの向上を示すグラフは、次の場所で見ることができます。 こちら .

アップデート2: この回答は、パフォーマンス上の利点をもたらすのはquot;index" であって、quot;View" ではないという理由で批判されていますが、これには簡単に反論できます。

例えば、私たちは小さな国のソフトウェア会社で、リトアニアを例にしてみましょう。 私たちはソフトウェアを世界中に販売し、その記録をSQL Serverデータベースで管理しています。 私たちは非常に成功しているので、数年後には100万件以上のレコードを保有しています。 しかし、税金の関係で売上を報告する必要があり、自国では100枚しか売れていないことがよくあります。リトアニア語のレコードだけのインデックス付きビューを作成することで、MSのドキュメントに記載されているように、必要なレコードをインデックス付きキャッシュに保持することができます。 2008年のリトアニア語の売上をレポートする場合、クエリは深さわずか7(Log2(100)に未使用の葉をいくつか加えたもの)のインデックスを検索することになります。 もし、VIEWを使用せず、テーブルのインデックスだけを頼りに同じことを行うとしたら、21の深さのインデックスツリーを走査しなければならないでしょう。

明らかに、Viewそのものが、単純にインデックスだけを使用した場合よりも、3倍のパフォーマンス・アドバンテージを提供してくれるでしょう。 ここでは実例を挙げましたが、リトアニアの売上高の単純なリストであれば、さらに大きな利点があることにお気づきでしょう。

なお、この例では、まっすぐなB-treeを使っています。SQL Serverが何らかのB-treeの変種を使用していることは間違いないのですが、詳細はわかりません。 それでも、ポイントは押さえられます。

更新3: Indexed Viewは、基礎となるテーブルに配置されたインデックスを使用するだけなのか、という疑問が湧いてきました。 つまり、言い換えれば、「インデックス付きビューは標準的なインデックスと同等であり、ビューに新しい機能やユニークな機能を提供することはない」ということです。 この批判が妥当でも真実でもないと私が考える理由を、Microsoftのドキュメントから引用して説明しましょう。

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

物理ストレージへのデータの永続化に関する上記の引用や、Viewにインデックスが作成される方法に関するドキュメント内の他の情報と合わせると、Indexed Viewは次のように言ってよいと思います。 ではない は、メイン・テーブルで定義されたインデックスを使用するためにキャッシュされた SQL セレクトに過ぎません。 したがって、私はこの答えを支持し続けます。