如何确定需要修改的索引以消除执行计划中的Key Lookup?
同表双INNER JOIN场景下Key Lookup对应优化索引的判断方法
- 第一步:定位Key Lookup关联的执行分支
先查看执行计划中Key Lookup的上游节点,确认该回表操作依附于哪次INNER JOIN的执行逻辑:两次JOIN对应独立的执行路径,Key Lookup只会绑定其中一个路径的索引访问操作,直接就能锁定对应的关联分支。 - 第二步:核对对应索引的覆盖范围
分别导出两次JOIN调用的两个非聚集索引的定义,对比Key Lookup操作返回的字段列表,找到不包含这些返回字段的索引:Key Lookup的本质是当前用到的非聚集索引没有覆盖查询所需的全部字段,必须回聚集索引拉取数据,缺失目标字段的索引就是需要调整的对象。 - 第三步:结合执行成本确认优化优先级
如果执行计划显示两个JOIN分支都存在Key Lookup,优先调整预估执行成本占比更高的分支的索引,单次修改就能拿到最大的性能收益;如果两个分支成本相近,建议把缺失的字段分别加入对应索引的INCLUDE列表即可,不要为了省索引数量把无关字段塞进单个索引,避免索引体积过大拉高日常维护成本。
小提示:不需要把缺失的查询字段都加到索引键列中,非关联、非过滤的字段仅放到
INCLUDE列表即可,不会增大索引B树的体积,也不会额外提升索引的更新开销。
内容的提问来源于stack exchange,提问作者TheSQLGuy
相关产品推荐
相关产品推荐

