为什么索引设置会影响查询成本当扫描是必须的
Why index setting is able to affect query cost when scan is imperative
我正在复习 AdventureWorks2012 的性能调优学习和练习。
我从产品 table 构建了 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
我预计所有四个的性能应该相同,因为它们都需要扫描。另外,我select只有ProductID
列,没有WHERE
条件。
然而,结果却是
为什么聚集索引比非聚集索引更昂贵?
为什么非聚集索引在这种情况下会降低成本?
为什么列存储使 query4 的成本高于 query3?
对于没有索引的查询 1,您正在扫描整个 table..
对于查询2,你有一个聚簇索引,但是又一次..你正在扫描整个table..任何索引只有在你使用时才有用消除行..所以这与 query1
相同
查询 4 的成本高于查询 3 的原因可能是由于您拥有的索引和索引的存储方式。知道,知道键存储在根级别并且数据存储在叶级别就足够了...有关更多信息,请阅读:https://www.sqlskills.com/blogs/kimberly/category/indexes/
对于query3,只有key,所以需要存储数据的页数会更少,从而需要更少的遍历
对于查询 4,您有更多的列,因此更多的页面和更多的遍历
下面的屏幕截图显示了页面 tmproduct4(18)、tmproduct3(15)..因此额外成本可能是遍历其他页面所需的 IO 成本
我正在复习 AdventureWorks2012 的性能调优学习和练习。
我从产品 table 构建了 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
我预计所有四个的性能应该相同,因为它们都需要扫描。另外,我select只有ProductID
列,没有WHERE
条件。
然而,结果却是
为什么聚集索引比非聚集索引更昂贵?
为什么非聚集索引在这种情况下会降低成本?
为什么列存储使 query4 的成本高于 query3?
对于没有索引的查询 1,您正在扫描整个 table..
对于查询2,你有一个聚簇索引,但是又一次..你正在扫描整个table..任何索引只有在你使用时才有用消除行..所以这与 query1
相同查询 4 的成本高于查询 3 的原因可能是由于您拥有的索引和索引的存储方式。知道,知道键存储在根级别并且数据存储在叶级别就足够了...有关更多信息,请阅读:https://www.sqlskills.com/blogs/kimberly/category/indexes/
对于query3,只有key,所以需要存储数据的页数会更少,从而需要更少的遍历
对于查询 4,您有更多的列,因此更多的页面和更多的遍历
下面的屏幕截图显示了页面 tmproduct4(18)、tmproduct3(15)..因此额外成本可能是遍历其他页面所需的 IO 成本