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