2009-10-09 53 views

回答

2

为了澄清事情
想法覆盖索引是,它也包括可以不被搜索列(WHERE子句和例如在使用),但可以被选择(选择列的一部分列表)。

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

  • 对于一段具有代表性的时期,记录所有查询在服务器上运行(或所需的表格)
  • 过滤掉(通过正则表达式)查询不涉及底层表
  • 对于其余查询,请获取查询计划;丢弃不涉及相关索引的查询
  • 对于其余查询,或者对于查询的每个“模板”(许多查询都是相同的,但是对于搜索条件值),请使索引中列的列表在select或where子句中(或在JOIN中...)
  • 来自该列表中未找到索引的列非常好。

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

上面的临床方法是相当无吸引力一种分析方法可以是优选的

查找所有查询“模板”都可以在所有使用服务器的应用程序中使用。对于这些模式中的每一个,查找那些可能使用覆盖索引的。这些都是(又来了几个洞...)将查询:

  • 包括对基础表
  • 不以任何方式引用从基础表不是在索引中的列的列的引用
  • 不使用搜索条件从底层表具有更多的选择性,索引的列(在他们很顺序...)

或者......甚至没有去申请:想想所有的用例,如果查询的话将服务于这些案件将不会从索引中的所有列中受益。这样做意味着您对该指数的选择性有一个比较好的想法,就其前几栏而言。

0

如果您对您的用例和数据点进行审计,那么显然任何在审计中未被使用或被捕获的事件都是删除的候选对象。如果数据库缺乏如此彻底的审计,那么可以通过运行跟踪并保存它来保存时间窗口的查询命中数据库。您可以分析跟踪并查看哪些类型的查询正在击中数据库,并从那里查看哪些列可以被丢弃。

痕量分析通常用于找到缺少指数的候选人,但我猜测它也可以用来分析使用趋势。