繁体   English   中英

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

[英]Why is my query doing a clustered index scan when it has an 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

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

在此输入图像描述

编辑:

我做了:

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%。 我使用此处的查询来获取表格中的总页数:

在不使用DBCC的情况下确定每个SQL表的页数

我得到49使用和53保留。 所以49%的30%= 14.7 * 17(每页存储这么多)大约250行。 但我的查询只返回9,所以它不在临界点附近。

我已经弄清楚了,正如我在一些文章中提到的那样,选择性必须低于1%。 我被一篇关于引爆点的文章误导,认为如果返回30%以上它只会进入扫描模式

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

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

希望这有助于某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM