有哪些方法可用于识别覆盖索引中的多余列:从未搜索过的列,因此可能会提取到Includes中,甚至完全删除而不会影响索引的适用性?在覆盖索引中识别不必要的列的方法有哪些?
1
A
回答
2
为了澄清事情
的想法覆盖索引是,它也包括可以不被搜索列(WHERE子句和例如在使用),但可以被选择(选择列的一部分列表)。
似乎没有任何简单的方法来断言覆盖索引中未使用的colums的存在。我只能想到下面一个艰苦的过程:
- 对于一段具有代表性的时期,记录所有查询在服务器上运行(或所需的表格)
- 过滤掉(通过正则表达式)查询不涉及底层表
- 对于其余查询,请获取查询计划;丢弃不涉及相关索引的查询
- 对于其余查询,或者对于查询的每个“模板”(许多查询都是相同的,但是对于搜索条件值),请使索引中列的列表在select或where子句中(或在JOIN中...)
- 来自该列表中未找到索引的列非常好。
现在,可能还有一些[要删除的列],因为上面的过程不检查在哪个上下文中使用覆盖索引(它可能用于解析where,但是基础表仍然访问以及(例如去列未在覆盖索引......)
上面的临床方法是相当无吸引力一种分析方法可以是优选的:
查找所有查询“模板”都可以在所有使用服务器的应用程序中使用。对于这些模式中的每一个,查找那些可能使用覆盖索引的。这些都是(又来了几个洞...)将查询:
- 包括对基础表
- 不以任何方式引用从基础表不是在索引中的列的列的引用
- 不使用搜索条件从底层表具有更多的选择性,索引的列(在他们很顺序...)
或者......甚至没有去申请:想想所有的用例,如果查询的话将服务于这些案件将不会从索引中的所有列中受益。这样做意味着您对该指数的选择性有一个比较好的想法,就其前几栏而言。
0
如果您对您的用例和数据点进行审计,那么显然任何在审计中未被使用或被捕获的事件都是删除的候选对象。如果数据库缺乏如此彻底的审计,那么可以通过运行跟踪并保存它来保存时间窗口的查询命中数据库。您可以分析跟踪并查看哪些类型的查询正在击中数据库,并从那里查看哪些列可以被丢弃。
痕量分析通常用于找到缺少指数的候选人,但我猜测它也可以用来分析使用趋势。
相关问题
- 1. 覆盖方法无法识别
- 2. 识别列表项索引 - 哪种方法更好?
- 3. 如何识别Java字节码中的覆盖方法?
- 4. R For循环不必要的覆盖
- 5. 非聚集索引与覆盖索引之间的区别
- 6. 方法覆盖和功能覆盖/超载有什么区别
- 7. 调用从覆盖方法中覆盖的方法在OO PHP
- 8. 覆盖主要方法
- 9. WPF/MVVM的主要方法有哪些?
- 10. 哪些列在MySQL中编制索引?
- 11. RODBC:SQLUPDATE()不能识别索引列
- 12. 覆盖实例级别的方法
- 13. 需要覆盖的webdriver的方法
- 14. Java方法覆盖 - “方法不会覆盖超级方法...”
- 15. 如何识别哪些索引未被使用?
- 16. 为什么Eclipse的索引器识别一些类,但不识别其他类?
- 17. 关于覆盖主要方法中的GUI的run()方法
- 18. 列出哪些列在SQL Server 2005中具有全文索引
- 19. C++中的覆盖方法
- 20. MySQL的不必要的索引
- 21. 无法在beta5中覆盖OnConfiguring - 找不到合适的方法来覆盖
- 22. 覆盖私有方法
- 23. Java私有方法覆盖
- 24. 应该覆盖哪种数组方法?
- 25. 如何识别或知道方法中引用哪个控件?
- 26. 是否有必要在主键列上具有PRIMARY索引和colname索引?
- 27. 覆盖方法
- 28. 覆盖方法
- 29. 覆盖'+'方法
- 30. 覆盖方法