2016-03-07 10 views
5

インデックススキャン/シークに関する基本的な質問があります。索引スキャンは、フェッチする行が多数ある場合に有効です。つまり、インデックススキャンコストは返される行数に反比例します。これは、より多くのIOをもたらすすべてのページをスキャンする必要があるため、クエリがより高価な行の数が少なくなります。インデックスシークがインデックススキャンよりも高価になる理由

シークがスキャンよりも高価になる理由を検索しましたが、シークが高価になる理由はありません。

私が混乱しているのは、インデックスシークです。索引シークが高価になる理由は、より多くの行数が返されます。索引シークは、行を含むページに直接触れるため、スキャンよりも常に高速かつ効率的です。したがって、返される行数が多い場合でも、インデックス検索はインデックス検索より常に効率的でなければなりません。しかし、これは起こりません。私は正確になぜシークが高価になるのかを知りたい。

select id,name,col1,col2 
from TableA -- Will result in index scan. Table has 10000 rows with clustered index on ID column. Query has covering index. 

select id,name,col1,col2 
where ID between 1 and 10 
from TableA -- Optimizer Will use index Seek. 

さて、なぜ、以下のクエリはインデックスが強要されたシーク時に高価になってしまうん - クラスタ化インデックスがシークなぜ

select id,name,col1,col2 
from TableA with (forceseek) 
+0

[こちら](http://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/)が役立つかもしれません。 – Praveen

+0

シークの修飾オーバーヘッドが原因の可能性があります – Ian

+0

インデックスには何が含まれていますか? IDだけ?それはクラスタ化されたインデックスですか?そうでない場合は、他の列を取得するために必要なキー参照がパフォーマンスヒットの理由になります。 – strickt01

答えて

2

理由インデックスは、Bツリーの権利を読んで開始を求めるため、インデックススキャンがあるよりも高価ですルートノードからリーフノードへこれには、リーフノード内のインデックスとページを読み取ることが含まれます。したがって、IOが増えます。したがって、選択性が低い場合、オプティマイザはIndex seekの代わりにIndex scanを選択します。 Seekは、返されるレコードが2〜3%を超えない場合にのみ優れています。

関連する問題