在覆盖索引中识别不必要列的方法有哪些?

时间:2009-10-09 19:33:12

标签: database performance indexing covering-index

有哪些方法可以识别覆盖索引中多余的列:从不搜索过的列,因此可以提取到包含中,甚至可以完全删除而不影响索引的适用性?

2 个答案:

答案 0 :(得分:2)

澄清事情 覆盖索引 的想法是它还包括可能无法搜索的列(在WHERE子句中使用等)但可以选择(SELECT的一部分)列列表)。

似乎没有任何简单的方法来断言覆盖索引中是否存在未使用的列。我只能想到下面的一个艰苦的过程:

  • 在代表性的一段时间内,记录在服务器上(或在所需的表格上)运行的所有查询
  • 过滤掉(通过正则表达式)不涉及基础表的查询
  • 对于剩余的查询,获取查询计划;丢弃不涉及有问题索引的查询
  • 对于剩余的查询,或者更确切地说,对于查询的每个“模板”(许多查询是相同的但是对于搜索条件值),请在索引中创建select或where子句中的列的列表(或JOIN ...)
  • 该列表中未找到的索引中的列非常适合。

现在,可能还有一些[要删除的列]因为上面的过程没有检查覆盖索引使用的上下文(它可能用于解析where,但是底层表仍然可以访问(例如,获取不在覆盖索引中的列...)

上述临床方法相当缺乏吸引力。 可能更倾向于使用分析方法

查找可能在使用服务器的所有应用程序中使用的所有查询“模板”。对于这些模式中的每一个,找到可能正在使用覆盖索引的模式。这些(再次是几个漏洞......)查询:

  • 包含对基础表的引用
  • 不要以任何方式引用基础表中不属于索引
  • 列的列
  • 不要使用基础表中比索引列更具选择性的搜索条件(按照它们的顺序......)

或者......甚至没有去过应用程序:考虑所有用例,如果为这些情况提供服务的查询不会受益于索引中的所有列。这样做意味着您对索引的选择性有一个相对较好的了解,关于它的前几列。

答案 1 :(得分:0)

如果您对用例和数据点进行审核,显然任何未在审核中使用或捕获的内容都是删除的候选对象。如果数据库缺乏这样一个彻底的审计,您可以通过运行跟踪并保存它来保存一个时间窗口的查询数据。您可以分析跟踪并查看哪些类型的查询正在访问数据库,从那里可以删除哪些列。

跟踪分析通常用于查找缺少索引的候选者,但我猜测它也可用于分析使用趋势。