有哪些方法可以识别覆盖索引中多余的列:从不搜索过的列,因此可以提取到包含中,甚至可以完全删除而不影响索引的适用性?
答案 0 :(得分:2)
澄清事情 覆盖索引 的想法是它还包括可能无法搜索的列(在WHERE子句中使用等)但可以选择(SELECT的一部分)列列表)。
似乎没有任何简单的方法来断言覆盖索引中是否存在未使用的列。我只能想到下面的一个艰苦的过程:
现在,可能还有一些[要删除的列]因为上面的过程没有检查覆盖索引使用的上下文(它可能用于解析where,但是底层表仍然可以访问(例如,获取不在覆盖索引中的列...)
上述临床方法相当缺乏吸引力。 可能更倾向于使用分析方法:
查找可能在使用服务器的所有应用程序中使用的所有查询“模板”。对于这些模式中的每一个,找到可能正在使用覆盖索引的模式。这些(再次是几个漏洞......)查询:
或者......甚至没有去过应用程序:考虑所有用例,如果为这些情况提供服务的查询不会受益于索引中的所有列。这样做意味着您对索引的选择性有一个相对较好的了解,关于它的前几列。
答案 1 :(得分:0)
如果您对用例和数据点进行审核,显然任何未在审核中使用或捕获的内容都是删除的候选对象。如果数据库缺乏这样一个彻底的审计,您可以通过运行跟踪并保存它来保存一个时间窗口的查询数据。您可以分析跟踪并查看哪些类型的查询正在访问数据库,从那里可以删除哪些列。
跟踪分析通常用于查找缺少索引的候选者,但我猜测它也可用于分析使用趋势。