1

我正在回顾性能调整研究和 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条件。
然而,事实证明是

在此处输入图像描述

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

4

1 回答 1

0

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

对于查询2,您有一个聚集索引,但又一次..您正在扫描整个表..任何索引仅在您用于消除行时才有用..所以这与查询1相同

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

对于query3,只有key,所以存储数据所需的页数会更少,因此需要更少的遍历

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

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

在此处输入图像描述

于 2017-11-20T16:21:04.270 回答