我一直试图摆脱查询计划中昂贵的查找,但似乎无法理解它。我理解创建覆盖索引以消除查找需要的想法,但我不知道如何使用这样的复杂计划来处理它。
任何关于如何解决这个问题的想法都将不胜感激。
查询计划可以在这里找到: https ://www.brentozar.com/pastetheplan/?id=HyBbQ0eRr
谢谢
我一直试图摆脱查询计划中昂贵的查找,但似乎无法理解它。我理解创建覆盖索引以消除查找需要的想法,但我不知道如何使用这样的复杂计划来处理它。
任何关于如何解决这个问题的想法都将不胜感激。
查询计划可以在这里找到: https ://www.brentozar.com/pastetheplan/?id=HyBbQ0eRr
谢谢
因此,覆盖索引是包含查询所需的所有列的索引。当优化器使用您的索引获取数据但缺少一列或多列时会发生键查找,因此它会从聚集索引中获取这些列。
例如,您在 Table_22 上使用索引 table_22_promoId_Index 进行索引查找。之后在计划中,您会看到键查找获取了一大堆列。
如果您将键查找的输出列表中的所有列添加到 Table_22_PromoId_Index 作为包含的列,您将停止进行键查找,因为现在它只会从该索引中获取所有内容,而不需要来自集群的额外信息index
然后你可以为其他人重复
一步一步,选择一个查找,并尝试修复它,然后转到下一个。
此外,由于您选择了许多列,请尝试记住,创建庞大的索引也有更新/插入的缺点并占用存储空间,因此请注意不要有太多的索引(不过,这一切都取决于您的具体情况。)
这也是为什么人们建议您只选择您实际需要的列而不是所有内容,因为这会使您的索引更窄且更容易调整。
有关此主题的有用阅读: 昂贵的密钥查找
因此,键查找中的搜索谓词和谓词与索引搜索中的相同。发生的情况是,他将使用 Seek 谓词从他的聚集索引(在键索引的情况下)中获取数据。之后,如果他必须进一步过滤该数据,他将使用谓词进行额外过滤。
Joe Obbish 给出了一个很好的答案,解释得非常好: Seek predicate 和 predicate 之间的区别