私は SQL Server 2012 のトレーニング ブックからサンプル データベースを実行しており、インデックスについて少し学んでいるので、それがどのように機能するかを試してみようと思いました。
テーブル Orders には shippostalcode のインデックスがあるので、それを where 句に入れようとしました。そのテーブルには 850 以上のレコードがあることがわかっており、このコードは次のように分割されています。
10328
10195
10342
10318
10196
10139
10294
10354
10199
10157
10137
10258
10274
10286
10158
10167
10329
10351
では、これを行うと、クラスター化されたインデックス スキャンが得られるのはなぜですか?
編集:
やった :
SELECT [orderid]
,[shippostalcode]
FROM [TSQL2012].[Sales].[Orders]
WHERE shippostalcode = '10307'
これにより、インデックスシークが行われました。SQL Server は、残りの列のブックマーク ルックアップを実行するよりもスキャンの方が高速であると考える可能性があるのではないでしょうか?
編集2:
ここで転換点について読んだ後: http://www.sqlskills.com/blogs/kimberly/why-arent-those-nonclustered-indexes-being-used/
約30%と言われています。ここからクエリを使用して、テーブルの合計ページを取得しました。
49 が使用済みで、53 が予約済みです。したがって、49 の 30% = 14.7 * 17 (各ページにこれだけ格納されます) は約 250 行です。しかし、私のクエリは 9 しか返さなかったので、転換点の近くにはありませんでした。