有什么方法可以识别覆盖索引中的多余列:从不搜索的列,因此可以提取到 Includes 中,甚至完全删除而不影响索引的适用性?
最佳答案
澄清事情
覆盖索引 的想法是,它还包括可能无法搜索(在 WHERE 子句等中使用)但可能被选择(SELECT 的一部分)的列列列表)。
似乎没有任何简单的方法可以断言覆盖索引中未使用的列的存在。我只能想到下面一个艰苦的过程:
- 在一段有代表性的时间段内,记录在服务器上(或在所需的表上)运行的所有查询
- 过滤掉(通过正则表达式)不涉及基础表的查询
- 对于剩余的查询,获取查询计划;丢弃不涉及相关索引的查询
- 对于剩余的查询,或者更确切地说,对于查询的每个"template"(许多查询是相同的,但搜索条件值不同),从索引中列出在 select 或 where 子句(或在加入……)
- 未在该列表中找到的索引列非常好。
现在,可能还有一些[要删除的列],因为上面的过程没有检查覆盖索引在哪个上下文中使用(它可能用于解析 where,但基础表仍然可以访问(例如,访问不在覆盖索引中的列...)
上述临床方法是相当没有吸引力的。 分析方法可能更可取:
查找可能在使用服务器的所有应用程序中使用的所有查询"template"。对于这些模式中的每一个,找到可能使用覆盖索引的模式。这些是(又是一些漏洞......)查询:
- 包括对基础表的引用
- 不要以任何方式引用基础表中不是索引中列的列
- 不要使用比索引列更具选择性的基础表的搜索条件(按它们的顺序......)
或者......甚至不去应用程序:考虑所有用例,如果服务于这些用例的查询将受益于索引中的所有列。这样做意味着您对索引的选择性相对较好地了解了它的前几列。
关于database - 识别覆盖索引中不需要的列的方法有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1545661/