星空网 > 软件开发 > 数据库

索引扫描总是索引扫描么?

问:使用NC扫描运算符,有方法知道索引是怎么扫描的么?

这个问题的一个答案是非聚集索引扫描总是扫描整个索引。

答:是的,总是100%。扫描运算符总是整个索引……

但是有一些特定的情况并不是这样。在这篇文章里我想专门讲下你总会碰到的一个特定案例——在你的查询里有TOPMIN或者MAX表达式。

TOP,MIN,MAX

我们来看下面2个查询。 

1 SELECT TOP 10 * FROM Person.Person2 GO3 4 SELECT5   MIN(BusinessEntityID) AS 'Min',6   MAX(BusinessEntityID) AS 'Max'7 FROM Person.Person8 GO

第1个查询从Person .Person表返回前10行,第2个查询返回BusinessEntityID列的最小和最大值。当你看执行计划结果时,你会看到有趣的东西: 索引扫描总是索引扫描么?

第1个查询“扫描”聚集索引来获得前10行,对于第2个查询,聚集索引也被“扫描”2次来获得BusinessEntityID的最小值和最大值。但在这些情况里聚集索引扫描(Clustered Index Scan)并不是真正的聚集索引全扫描,因为TOP运算符缩短了聚集索引扫描(Clustered Index Scan)。这是什么意思呢?

一般来说,你知道你应该从右到左阅读执行计划,因为执行计划里的行也是从右流向左的。但在执行计划执行期间,是从左往右执行的。SQL Server内部使用所谓的迭代器模式(Iterator-Model),在那里执行计划里每个运算符从右边的运算符请求新的行。下图说明了这个非常重要的概念。

索引扫描总是索引扫描么? 

因为这个迭代器,最后的数据流是从右到左。现在当你看刚才生成的执行计划,你可以看到TOP运算符有所谓的TOP表达式(Top Expression)

索引扫描总是索引扫描么?

对于第1个查询TOP表达式是10,对于第2个执行计划里的2个TOP表达式是1。这个TOP表达式就定义TOP运算符消耗从右边的输入运算符的行数。当第1个查询里TOP运算符已消耗10行(前10行)后,TOP运算符就会缩短执行计划,且不会返回更多的行给SELECT运算符,这就意味着查询执行计划已经最终结束了。

同样的事情发生在第2个执行计划。为了获得BusinessEntityID的最小值(聚集键值),TOP运算符只消耗来自向前聚集索引扫描(Forward Clustered Index Scan)的第1行,最大值只消耗来自向后聚集索引扫描(Backward Clustered Index Scan)的第1行。

小结

当你在执行计划里看到TOP运算符,你总要想下这个特定场景:TOP运算符只会缩短你的扫描运算符。因此结论就是:在执行计划里,扫描并不总是扫描。

感谢关注!




原标题:索引扫描总是索引扫描么?

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

自述:在TikTok搞钱的那些年,我赚了多少?:https://www.kjdsnews.com/a/1513289.html
海外收入超过国内,石头科技Roborock到底是怎么做到的?:https://www.kjdsnews.com/a/1513290.html
警惕!KEITH律所频频出手!版权画一定要多多排查!:https://www.kjdsnews.com/a/1513291.html
亚马逊下“最后通牒”!新一轮扫号还在继续......:https://www.kjdsnews.com/a/1513292.html
视频号运营实操分享:https://www.kjdsnews.com/a/1514288.html
小红书怎么运营?最新实操方法:https://www.kjdsnews.com/a/1514289.html
亿邦智库观察:产业互联网平台如何搭载新质生产力 :https://www.kjdsnews.com/a/1836307.html
2023年二手服装市场报告:全球销售额达1970亿美元:https://www.kjdsnews.com/a/1836308.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流