【问题标题】:Why is my query doing a clustered index scan when it has an index为什么我的查询在有索引时会进行聚集索引扫描
【发布时间】:2013-11-28 20:11:48
【问题描述】:

我正在运行 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,所以它离临界点还很远。

【问题讨论】:

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


    【解决方案1】:

    我已经弄清楚了,正如我阅读的一些文章中提到的,选择性必须低于 1%。我被一篇关于临界点的文章误导了,认为只有在返回 30%+ 时才会进入扫描模式

    但实际测试表明,返回 6+ 行的任何内容都是扫描,而任何返回的内容都是搜索。

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

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2011-06-19
      • 2014-12-18
      • 2010-09-06
      相关资源
      最近更新 更多