Key Lookup开销过大导致聚集索引扫描

栏目: 数据库 · 发布时间: 7年前

以前总结过一篇文章 SQL SERVER中什么情况会导致索引查找变成索引扫描 介绍了几种索引查找( Index Seek )变成索引扫描( Index Scan )的情形。昨天写一篇文章的时候,也遇到了一个让人奇怪的执行计划。一时没有想明白为什么优化器会选择聚集索引扫描。案例详情请见 SQL Server OPTION (OPTIMIZE FOR UNKNOWN) 测试总结   如下所示,测试环境为 SQL Server 2014 ,数据库为 AdventureWorks2014

CREATE PROCEDURE test ( @pid int )

AS

SELECT * FROM [Sales] . [SalesOrderDetail]

WHERE ProductID = @pid OPTION ( OPTIMIZE FOR UNKNOWN );

Key Lookup开销过大导致聚集索引扫描

  [Sales].[SalesOrderDetail]的索引信息如下如下。其实这里优化器选择聚集索引扫描是因为Cost缘故。因为走非聚集索引查找(Index Seek)的话,Key Lookup的开销较大。整体开销比聚集索引扫描还大。我们可以测试验证一下

Key Lookup开销过大导致聚集索引扫描

如下所示,我们新增一个 SQL 语句,强制其走索引查找(具体索引为 IX_SalesOrderDetail_ProductID ),然后执行对比查看执行计划的开销

ALTER PROCEDURE test ( @pid int )

AS

SELECT * FROM [Sales] . [SalesOrderDetail]

WHERE ProductID = @pid OPTION ( OPTIMIZE FOR UNKNOWN );

SELECT * FROM [Sales] . [SalesOrderDetail] WITH ( INDEX = IX_SalesOrderDetail_ProductID )

WHERE ProductID = @pid ;

GO

如下测试所示,两种实际执行计划的开销比为 22%   VS   78%   所以优化器肯定会选开销小的执行计划。也就是说如果优化器发现当索引查找时,如果Key Lookup过大,那么优化器会选择聚集索引索引扫描。 这个案例就是一个活生生的案例。 也许有人会反问:不是Index Seek效率表Index Scan要高吗?你这有点不合逻辑,注意,这个特定条件下,虽然Index Seek变成 Index Scan,但是你注意一下上下文,索引变了, 从IX_SalesOrderDetail_ProductID变成了聚集索引 PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID 。

Key Lookup开销过大导致聚集索引扫描

总结: 任何现象背后都有一定的规律,有时候,只要你静下心来,仔细分析一下。就能一窥究竟。如果总是不问为什么,那么你总是不了解背后原理!也就永远止步不前!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算智能导论

计算智能导论

英吉布雷切特 / 谭营 / 清华大学出版社 / 2010-6 / 59.00元

《计算智能导论(第2版)》导论性地介绍了计算智能的5 个典型范例:人工神经网络、进化计算、计算群体智能、人工免疫系统和模糊系统。它们分别是对生物神经系统、生物进化过程、社会组织的群体行为、自然免疫系统和人类思维过程的成功建模。这些范例已经得到了广泛深入的研究,人们在取得了很大的成功之后,已将研究成果广泛地应用到了众多的实际应用领域。极大提高了人们发现问题,求解问题,尤其是求解复杂科学与工程问题的能......一起来看看 《计算智能导论》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具