为什么我的查询在具有索引时执行聚簇索引扫描

时间:2013-11-15 12:22:58

标签: sql indexing sql-server-2012 non-clustered-index

我正在从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

所以当我这样做时,为什么我会得到一个聚簇索引扫描,我读到的是与次优的表扫描相同的?

enter image description here

修改

我做了:

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,所以它不在临界点附近。

1 个答案:

答案 0 :(得分:0)

我已经弄明白了,正如我在一些文章中提到的那样,选择性必须低于1%。我被一篇关于引爆点的文章误导,认为如果它返回30%+

它只会进入扫描模式

但是实际测试表明,任何返回6行以上的行都是扫描,而任何更少的行都是搜索。

因此,如果它返回约0.5%,它将进行搜索,否则进行扫描。我的830行中有0.5%是4.15行。

希望这有助于某人。