SQL Server実行プランで、インデックススキャンとインデックスシークの違いは何ですか
SQL Server 2005を使用しています。
回答:
インデックススキャンでは、SQLサーバーがインデックス全体を読み取り、一致を探します。これにかかる時間は、インデックスのサイズに比例します。
インデックスシークとは、SQLサーバーがインデックスのbツリー構造を使用して、一致するレコードを直接シークする場所です(これがどのように機能するかについては、http://mattfleming.com/node/192を参照してください)。所要時間は、一致するレコードの数。
従うべき基本的なルールは、スキャンは悪く、シークは良いことです。
インデックススキャン
SQL Serverは、スキャンを実行すると、ディスクからメモリに読み込むオブジェクトを読み込み、そのオブジェクトを上から下に読み取り、必要なレコードを探します。
インデックスシーク
SQL Serverがシークを行うと、データのインデックスがどこにあるかがわかっているため、ディスクからインデックスをロードし、必要なインデックスの部分に直接移動して、必要なデータの終わりまで読み取ります。 。SQLは探しているデータがどこにあるかをすでに知っているので、これは明らかにスキャンよりもはるかに効率的な操作です。
スキャンの代わりにシークを使用するように実行プランを変更するにはどうすればよいですか?
SQL Serverがデータを探しているとき、SQL Serverがシークからスキャンに切り替わる最大の原因の1つは、探している列の一部が、使用するインデックスに含まれていない場合です。ほとんどの場合、クラスター化インデックスにはテーブル内のすべての列が含まれているため、SQL Serverはクラスター化インデックスのスキャンにフォールバックします。これは、(少なくとも私の意見では)インデックスのインデックス付きの列にそれらの列を追加せずに、インデックスに列を含めることができるようになった最大の理由の1つです。インデックスに追加の列を含めることで、インデックスのサイズが増加しますが、SQL Serverは、クラスター化インデックスまたはテーブル自体に戻ってこれらの値を取得しなくても、インデックスを読み取ることができます。
参考文献
SQL Server実行プラン内のこれらの各演算子の詳細については、...を参照してください。
スキャンの目的が何であっても、スキャンはテーブルのすべての行に影響します
シークは、探している行だけを調べます。
シークはデータの検索方法においてより効率的であるため、スキャンよりも常に優れています。
良い説明はここにあります