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

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

以前总结过一篇文章 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开销过大导致聚集索引扫描

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


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

查看所有标签

猜你喜欢:

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

大数据大创新:阿里巴巴云上数据中台之道

大数据大创新:阿里巴巴云上数据中台之道

邓中华 / 电子工业出版社 / 2018-11 / 99

阿里巴巴云上数据中台正服务着阿里生态中的数十个业务板块、百余家公司、千万级客户,在帮助决策层看清甚至决定业态走向的同时,在上万个业务场景中应用并催生创新。 《大数据大创新:阿里巴巴云上数据中台之道》基于作者在阿里巴巴的十年大数据从业经历,精彩演绎云上数据中台之道。《大数据大创新:阿里巴巴云上数据中台之道》基于大数据探索的大趋势,讲述阿里巴巴云上数据中台顶层设计,再以实际案例详述阿里巴巴云上数......一起来看看 《大数据大创新:阿里巴巴云上数据中台之道》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具