SQL Serverプラン:インデックススキャンとインデックスシークの違い


87

SQL Server実行プランで、インデックススキャンとインデックスシークの違いは何ですか

SQL Server 2005を使用しています。

回答:


128

インデックススキャンでは、SQLサーバーがインデックス全体を読み取り、一致を探します。これにかかる時間は、インデックスのサイズに比例します。

インデックスシークとは、SQLサーバーがインデックスのbツリー構造を使用して、一致するレコードを直接シークする場所です(これがどのように機能するかについては、http://mattfleming.com/node/192を参照してください)。所要時間は、一致するレコードの数。

  • 一般に、インデックスシークはインデックススキャンよりも適しています(一致するレコードの数が比例してレコードの総数よりもはるかに少ない場合)。インデックスシークの実行にかかる時間は、レコードの合計数に関係なく一定であるためです。テーブル。
  • 注しかし、特定の状況では、インデックススキャンが速くインデックスよりも(時には求めることができることを非常に速い) -レコードの大部分は、述語が一致したときに、テーブルが非常に小さい、または通常時に。

3
リンクはまだアクティブですか?私にとってはそれは機能しません。更新されたリンクがある場合は助けてください
Ronak Agrawal 2017

2
@RonakAgrawalリンクが実際に無効になっているようです- 代わりにウィキペディアを確認してください。
ジャスティン


76

従うべき基本的なルールは、スキャンは悪く、シークは良いことです。

インデックススキャン

SQL Serverは、スキャンを実行すると、ディスクからメモリに読み込むオブジェクトを読み込み、そのオブジェクトを上から下に読み取り、必要なレコードを探します。

インデックスシーク

SQL Serverがシークを行うと、データのインデックスがどこにあるかがわかっているため、ディスクからインデックスをロードし、必要なインデックスの部分に直接移動して、必要なデータの終わりまで読み取ります。 。SQLは探しているデータがどこにあるかをすでに知っているので、これは明らかにスキャンよりもはるかに効率的な操作です。


スキャンの代わりにシークを使用するように実行プランを変更するにはどうすればよいですか?

SQL Serverがデータを探しているとき、SQL Serverがシークからスキャンに切り替わる最大の原因の1つは、探している列の一部が、使用するインデックスに含まれていない場合です。ほとんどの場合、クラスター化インデックスにはテーブル内のすべての列が含まれているため、SQL Serverはクラスター化インデックスのスキャンにフォールバックします。これは、(少なくとも私の意見では)インデックスのインデックス付きの列にそれらの列を追加せずに、インデックスに列を含めることができるようになった最大の理由の1つです。インデックスに追加の列を含めることで、インデックスのサイズが増加しますが、SQL Serverは、クラスター化インデックスまたはテーブル自体に戻ってこれらの値を取得しなくても、インデックスを読み取ることができます。

参考文献

SQL Server実行プラン内のこれらの各演算子の詳細については、...を参照してください。


7

短い答え:

  • インデックススキャン:特定の列を除くすべての行をタップします。

  • インデックスシーク:特定の行と特定の列をタップします。


4

インデックススキャンでは、インデックス内のすべての行がスキャンされ、一致する行が検索されます。これは小さなテーブルでは効率的です。インデックスシークを使用すると、実際に条件を満たす行のみを操作する必要があるため、一般にパフォーマンスが向上します。


2

インデックススキャンは、インデックス定義が検索述語を満たす単一の行を見つけることができない場合に発生します。この場合、SQL Serverは複数のページをスキャンして、検索述部を満たす行の範囲を見つける必要があります

インデックスシークの場合、SQL Serverはインデックス定義を使用して、検索述語に一致する単一の行を見つけます。

インデックスシークはより効果的です。


0

スキャンの目的が何であっても、スキャンはテーブルのすべての行に影響します

シークは、探している行だけを調べます。

シークはデータの検索方法においてより効率的であるため、スキャンよりも常に優れています。

良い説明はここにあります


3
たとえば、テーブルが比較的小さく、そのテーブル内の行の大部分を返す必要がある場合、シークは必ずしも良いとは限りません。そうすると、インデックススキャンがはるかに効率的になる可能性があります。
ジャスティン

1
こんにちはJustin、私はあなたがテーブルスキャンを時々より良くすることができると思いたいと思います。クラスター化について話さない限り、インデックスシークは常にインデックススキャンよりも優れています。ただし、前述の理由により、テーブルスキャンまたはクラスター化インデックススキャンの方が効率的な場合があります。インデックスを検索してフィールドがテーブルのインデックスにない場合、ms sqlはインデックスに条件フィールドがある場合でもテーブルを使用します。
ホセ・地域
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.