[解決済み] ビューは単純なクエリよりも高速ですか?
質問
は
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 セレクトに過ぎません。 したがって、私はこの答えを支持し続けます。
関連
-
SQL-初心者のためのベスト入門SQLクエリ I
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み] 最初の行への結合方法
-
[解決済み] なぜ[]はlist()よりも速いのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] SQLの結合形式 - 入れ子になった内側join
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] NOT IN vs NOT EXISTS
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?
-
[解決済み] VARCHARとCHARの違いは何ですか?