当扫描势在必行时,为什么索引设置能够影响查询成本

时间:2017-11-20 15:57:58

标签: sql-server clustered-index non-clustered-index adventureworks columnstore

我正在审查性能调优研究和使用AdventureWorks2012进行练习 我从Product表中构建了4个副本,然后使用以下索引进行设置。

--tmpProduct1 nothing
CREATE CLUSTERED INDEX cIdx ON tmpProduct2 (ProductID ASC)
CREATE NONCLUSTERED INDEX ncIdx ON tmpProduct3 (ProductID ASC)
CREATE NONCLUSTERED INDEX ncIdx ON tmpProduct4 (ProductID ASC) INCLUDE (Name, ProductNumber)

然后我用以下查询执行执行计划。

SELECT ProductID FROM tmpProduct1
SELECT ProductID FROM tmpProduct2
SELECT ProductID FROM tmpProduct3
SELECT ProductID FROM tmpProduct4

我预计其中所有四个的效果应该相同,因为它们都需要扫描。另外,我只选择了ProductID列,并且没有WHERE条件 但事实证明是

enter image description here

为什么聚簇索引比非聚簇索引更昂贵?
为什么非聚集索引会降低这种情况下的成本? 为什么列存储使query4的成本高于query3?

1 个答案:

答案 0 :(得分:0)

对于没有索引的query1 ,您正在扫描整个表..

对于query2 ,你有一个聚集索引,但是再次..你正在扫描整个表..只有当你用来消除行时,任何索引都是有用的。所以这是相同的QUERY1

查询4的成本高于查询3的原因可能是由于您拥有的索引和索引的存储方式。知道,知道密钥存储在根级别并且数据存储在叶级别就足够了。 。欲了解更多信息,请阅读:https://www.sqlskills.com/blogs/kimberly/category/indexes/

对于query3,只有密钥,因此存储数据所需的页数将更少,因此需要更少的遍历

对于查询4,您有更多列,因此页面更多,遍历更多

下面的屏幕截图显示了页面tmproduct4(18),tmproduct3(15)..所以额外的成本可能是遍历其他页面所需的IO成本

enter image description here