具有OR条件的索引

时间:2017-09-08 08:00:27

标签: sql sql-server indexing

我有类似的查询:

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。因为这些值在索引树中位于不同的部分,所以如何使用一个索引搜索来搜索更多的值?

1 个答案:

答案 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