我正在从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%。我使用此处的查询来获取表格中的总页数:
Determining page count on each SQL table without using DBCC
我使用49和53保留。所以49%的30%= 14.7 * 17(每页存储这么多)大约250行。但我的查询只返回9,所以它不在临界点附近。
答案 0 :(得分:0)
我已经弄明白了,正如我在一些文章中提到的那样,选择性必须低于1%。我被一篇关于引爆点的文章误导,认为如果它返回30%+
它只会进入扫描模式但是实际测试表明,任何返回6行以上的行都是扫描,而任何更少的行都是搜索。
因此,如果它返回约0.5%,它将进行搜索,否则进行扫描。我的830行中有0.5%是4.15行。
希望这有助于某人。