我有类似的查询:
SELECT * FROM User
WHERE Name = 'Username1' OR Name = 'Username2'
当我执行它并查看执行计划时,我发现有一个NonClustered Index Seek
Number of executions = 1
和一个Key Lookup
Number of executions = 2
,这很好,因为它找到了2个结果。
但我不明白如何在索引中同时搜索2个不同的值。对我来说,NonClustered Index Seek
执行2次是合乎逻辑的。一次为Username1
,一次为Username2
。因为这些值在索引树中位于不同的部分,所以如何使用一个索引搜索来搜索更多的值?
答案 0 :(得分:4)
你必须从左到右考虑查询执行顺序,一旦你理解了这一点,那么事情会更简单..
以下是Paul White对此的引用:Iterators, Query Plans, and Why They Run Backwards
查询计划的执行从根开始,并通过一系列嵌套方法调用向下流动。数据以相反的方向上拉到计划中:从叶子到根,一次一行。
对我来说,NonClustered Index Seek执行2次是合乎逻辑的。
群集索引查找运算符未执行两次(但嵌套循环),因为存储引擎会记住初始搜索位置,然后尝试查找另一个值...如果该值在同一页面上,则零读取,如果它打开另一页,然后再读一遍
在dba.se上查看我的问题以获取更多信息:
https://dba.stackexchange.com/questions/134172/set-statistics-i-o-for-nested-loops