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


357

select *  from myView

ビューを作成するためのクエリ自体よりも高速(同じresultSetを持つため):

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

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


7
1つのビューについてはわかりませんが、ネストされたビューは完全なパフォーマンスです。
Muflix 2017

回答:


678

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

更新:少なくとも3人が私にこれに反対票を投じました。すべての敬意をもって、私はそれらが間違っていると思います。マイクロソフト独自のドキュメントでは、ビューによってパフォーマンスが向上することが明確に示されています。

まず、単純なビューが適切に展開されるため、パフォーマンスの向上には直接貢献しません。 ただし、インデックス付きビューはパフォーマンスを劇的に向上させることができます。

直接ドキュメントに行きましょう:

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

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

ここでも、ドキュメント:

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

このドキュメントと、パフォーマンスの向上を示すグラフは、こちらから入手できます

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

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

明らかに、ビュー自体は、インデックスのみの単純な使用よりもパフォーマンス上の利点(3倍)を提供します。私は実際の例を使用しようとしましたが、リトアニアの販売の単純なリストが私たちにさらに大きな利点を与えることに気付くでしょう。

私の例では、まっすぐなbツリーを使用していることに注意してください。SQL ServerがBツリーのバリアントを使用していることはかなり確かですが、詳細はわかりません。それにもかかわらず、ポイントは保持されます。

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

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

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


28
はい、インデックス付きビューはパフォーマンスを劇的に向上させることができます。しかし、インデックス付きビューは単なる「ビュー」ではなく、一般的に言えば、通常の「ビュー」は関連するクエリよりも高速ではありません。
BradC 2009年

10
@Charles-それがインデックスであるかどうかは問題ではありません。ビューがインデックスを利用でき、生のクエリは利用できないという事実で十分です
annakata

193
/ applaud @Markが彼の立場に立ってこれを合理的に論じたことについて
アナカタ09年

17
ああ、これ、私はこれに8つの反対票を獲得しました!少なくともチャールズの主張する勇気がなければ、人々はそれほど速く投票しないことに驚いています。
マークブリッティンガム

8
テーブルは1つのクラスターディーインデックスしか持つことができず、ビューに個別のクラスタードインデックスを作成できるため(クラスタードインデックスのフィールドはインデックスページに独立して永続化されるため)、これはごまかしです(作業方法?) 1つのテーブルで2つのクラスター化インデックスを取得できます。
Charles Bretana、2009年

50

一般的に言えば、いいえ。ビューは、主に利便性とセキュリティのために使用され、(それ自体では)速度の向上にはつながりません。

とはいえ、SQL Server 2000以降には、インデックス付きビューと呼ばれる機能があり、パフォーマンス大幅に向上させることができますが、いくつかの注意点があります。

  1. すべてのビューをインデックス付きビューにできるわけではありません。彼らは従わなければならないガイドラインの特定のセット手段(他の制限の中で)あなたのような一般的なクエリ要素を含めることはできません、COUNTMINMAX、またはをTOP
  2. インデックス付きビューは、テーブルのインデックスと同じように、データベースの物理領域を使用します。

この記事では、インデックス付きビューのその他の利点と制限について説明します

あなたはできる…

  • ビュー定義は、同じデータベース内の1つ以上のテーブルを参照できます。
  • 一意のクラスター化インデックスが作成されると、ビューに対して追加の非クラスター化インデックスを作成できます。
  • 挿入、更新、削除、さらには切り捨てなど、基礎となるテーブルのデータを更新できます。

できません…

  • ビュー定義は他のビューや他のデータベースのテーブルを参照できません。
  • COUNT、MIN、MAX、TOP、外部結合、またはその他のいくつかのキーワードや要素を含めることはできません。
  • 基になるテーブルと列を変更することはできません。ビューは、WITH SCHEMABINDINGオプションを使用して作成されます。
  • クエリオプティマイザが何を行うかを常に予測できるわけではありません。Enterprise Editionを使用している場合は、一意のクラスター化インデックスがクエリのオプションとして自動的に考慮されますが、「より適切な」インデックスが見つかると、それが使用されます。WITH NOEXPANDヒントを使用してオプティマイザにインデックスを強制的に使用させることができますが、ヒントを使用する場合は注意が必要です。

3
まったく同意しない...ビューから読み取ると、SQLを書き換えることができます。一般に、ビューからの読み取り(ビューのダンプからよりも)の方が高速です。
アーロンケンプ2013年

@AaronKempf、私はそれについてのいくつかの参照を参照してください、それは私の経験ではありません。"view SQL rewritten"を検索すると、SQLサーバーではなく、Oracleに関するすべての結果が表示されます。たとえば、docs.oracle.com
cd /

私は昨日それについていくつかのベンチマークを行っていました、私はびっくりしました...基本的にビューから(テーブルに)ダンプを取得した場合、実行するクエリはすべて遅いです..ほとんどのクエリはバターのようにビューを通過して書き直されるためクエリオプティマイザーによって..少なくとも、それは私が想定していることです。私はすぐにブログエントリを書こうと思います。ベンチマークはかなり魅力的なものでした。基本的に、ビューはパフォーマンスを大幅に向上させます。
アーロンケンプ、2013年

@AaronKempfこれは、元の質問と同じシナリオ(クエリと同じクエリをビューに配置することに関するもの)でさえありません。とにかく、新しいテーブルに適切なインデックスがない限り、ビューをテーブルに具体化するとどのように遅くなるか(インデックス付きビューの動作とまったく同じです)はわかりません。
BradC 2013年

1
ブラッド; この状況で、ビューが私のパフォーマンスの99%をどのように節約しているかについて、本当に悪いブログ投稿を書きました。他にもいくつか記事を書くつもりですが、TONについてこれ以上詳しく説明する必要があることはわかっています。 。これを見て、私の説明をどう思いますか。他の記事が2〜3件増えるまで、これ以上意味がないことはわかっていますが、私はビューに夢中になっており、長い間使用しています。 accessadp.com/2013/01/22/do-views-increase-performance
アーロンケンプ

14

少なくともSQL Serverでは、クエリ/ビューパラメータに基づいて、ビューと通常のSQLクエリの両方のクエリプランがプランキャッシュに格納されます。どちらの場合も、十分に長い期間使用されておらず、新しく送信された他のクエリにスペースが必要な場合、キャッシュから削除されます。その後、同じクエリが発行されると、それが再コンパイルされ、プランがキャッシュに戻されます。同じSQLクエリと同じビューを同じ頻度で再利用しているのであれば、違いはありません。

明らかに、一般に、ビューはその性質上(ビューにするのに十分な頻度で使用されると考えられていたため)、一般に、任意のSQLステートメントよりも「再利用」される可能性が高くなります。


14

編集:私は間違っていました、そしてあなたは上記のマークスの答えを見るはずです。

SQL Serverの経験から話すことはできませんが、ほとんどのデータベースでは答えはノーです。ビューを使用することで得られるパフォーマンスの点で唯一の潜在的な利点は、ビューがクエリに基づいてアクセスパスを作成する可能性があることです。ただし、ビューを使用する主な理由は、クエリを簡略化するため、またはテーブル内の一部のデータにアクセスする方法を標準化するためです。一般的に言って、パフォーマンス上の利点は得られません。しかし、私は間違っているかもしれません。

私は適度に複雑な例を考え出し、自分で見てみましょう。


1
ビューのもう1つの理由は、役割ベースのモデルでアクセス制御を支援することです
アナカタ09年

1
あなたはパフォーマンスの改善について間違っています。元のコメントで一部の人を説得するのに十分な説明はしていませんでしたが、MSには、ビューを使用してパフォーマンスを向上させる方法に関する明確なドキュメントがあります。以下の私の(今はかなり反対投票されている)応答を見てください。
マークブリッティンガム

7

マテリアライズドビューを(スキーマバインディングで)作成すると、より高速になる場合があります。非実体化ビューは、通常のクエリと同じように実行されます。


schemabindingはパフォーマンスとはほとんど関係がありません。ビューのスキーマを基になるテーブルにバインドするため、同期が維持され、インデックス付きビューの前提条件となります。
サムサフラン

5

私の理解では、SQL Serverは実行プランを保存し、その場で実行プランを理解するのではなく、それを使用するだけなので、ビューはより高速になります。今日のパフォーマンスの向上はおそらく以前ほど大きくはないと思いますが、ビューを使用するには多少の改善があると思います。


これは私の理解でした。以前は問題でしたが、もう問題ではありません
アナカタ09年

パフォーマンスの観点からではなく、アクセス制限の手段として行います。しかし、それは別のトピックになります。;)
AnonJr 2009年

必ずああ、たくさんの P:正当な理由のは、生のクエリを使用するビューではなく、単一のものを使用してする
annakata

4

間違いなく、ビューはSQL Serverのネストされたクエリよりも優れています。(Mark Brittinghamの投稿を読むまで)なぜそれが優れているのかを正確に知ることなく、いくつかのテストを実行し、ビューとネストされたクエリを使用すると、驚くほどパフォーマンスが向上しました。クエリの各バージョンを数百回続けて実行した後、クエリのビューバージョンは半分の時間で完了しました。それは私にとって十分な証拠だと思います。


このすべての理論が現実の世界でうまくいくと聞いて、ジョーダンに感謝します。
マークブリッティンガム

ネストされたビュー(ビューインビュー)の経験があり、パフォーマンスが非常に悪かった。すべてのビューがサブ選択に書き直されたとき、パフォーマンスは何倍も高速だったので、いくつかの深刻なテストを行う場所があるかもしれません。
Muflix 2017

2

2つのクエリが同じように実行されることを期待します。ビューは保存されたクエリ定義に過ぎず、ビューのデータのキャッシュや保存はありません。オプティマイザは、実行時に最初のクエリを2番目のクエリに効果的に変換します。


ビューが少数のフィールドのセットであり、それらのフィールドがインデックスで覆われている場合、SQL Serverは2番目の形式のクエリを実行するときにそのカバーするインデックスを使用するのに十分なほど賢いですか?
AnthonyWJones 2009年

1

それはすべて状況に依存します。MS SQLのインデックス付きビューは通常のビューやクエリよりも高速ですが、インデックス付きビューはミラーリングされたデータベース環境(MS SQL)では使用できません。

あらゆる種類のループ内のビューは、ループ内で呼び出されるたびに再生成されるため、深刻な速度低下を引き起こします。クエリと同じです。この状況では、ループするデータを保持するために#または@を使用する一時テーブルは、ビューまたはクエリよりも高速です。

したがって、それはすべて状況に依存します。


0

実用的な違いはありません。BOLを読むと、プレーンなSQL SELECT * FROM Xがプランキャッシングなどを利用していることがわかります。


0

実行プランを保存しておくと、多少の利益が得られるはずですが、それはごくわずかです。


0

ビューの目的は、クエリを繰り返し使用することです。そのために、SQL Server、Oracleなどは通常、ビューの「キャッシュ」または「コンパイル」バージョンを提供し、その結果、パフォーマンスが向上します。一般に、これは「単純な」クエリよりもパフォーマンスが良くなるはずですが、クエリが本当に非常に単純なものである場合、利点は無視できるかもしれません。

ここで、複雑なクエリを実行している場合は、ビューを作成します。


0

私の発見では、ビューの使用は通常のクエリよりも少し高速です。私のストアドプロシージャの所要時間は約25分(別の大きなレコードセットと複数の結合を使用)であり、ビュー(非クラスター化)を使用した後のパフォーマンスは少し高速でしたが、まったく重要ではありませんでした。他のクエリ最適化手法/メソッドを使用して、劇的な変更を行う必要がありました。


クエリをどのように作成/設計するかは非常に重要です。
kta

CTEを使用してテーブルから返されるデータを制限し、CTEからすべての作業/結合などを実行することで、多くの場合にパフォーマンスが劇的に向上することが
わかりました

0

ビューまたはテーブルから選択しても、あまり意味がありません。

もちろん、ビューに不要な結合、フィールドなどがない場合。ビューのパフォーマンスを向上させるために使用されるクエリ、結合、およびインデックスの実行計画を確認できます。

より高速な検索要件のために、ビューにインデックスを作成することもできます。http://technet.microsoft.com/en-us/library/cc917715.aspx

ただし、 '%...%'のように検索している場合、SQLエンジンはテキスト列のインデックスからメリットを得られません。ユーザーに「...%」のような検索を強制することができれば、それは高速になります

aspフォーラムで回答を参照:https : //forums.asp.net/t/1697933.aspx? Which+is+faster+when+using+SELECT+query+VIEW+or+Table+


0

すべての期待に反して、状況によってはビューがかなり遅くなります。

これを最近発見したのは、別のフォーマットに変換する必要があるOracleからプルされたデータに問題があったときです。たぶん20kのソース行。小さなテーブル。これを行うために、Oracleデータを変更せずにテーブルにインポートし、ビューを使用してデータを抽出しました。それらの見解に基づく二次見解がありました。多分3-4レベルのビュー。

おそらく200行を抽出した最後のクエリの1つは、45分以上かかります。そのクエリは、一連のビューに基づいていました。多分3-4レベルの深さ。

問題の各ビューを取得し、そのSQLを1つのネストされたクエリに挿入して、数秒で実行できます。

さらに、各ビューを一時テーブルに書き込んで、ビューの代わりにクエリを実行でき、ネストされたビューを使用するよりもはるかに高速であることがわかりました。

さらに奇妙なのは、データベースにプルされるソース行の制限に達するまでパフォーマンスが良好で、数日の間に崖から落ちるだけでパフォーマンスが向上したことです。

したがって、ビューからプルするビューからプルするクエリを使用すると、ネストされたクエリよりもはるかに遅くなります-これは私には意味がありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.