【问题标题】:Oracle indexes - Does it make sense to create an index that is a subset of another one's leading columnsOracle 索引 - 创建作为另一个前导列的子集的索引是否有意义
【发布时间】:2018-02-09 07:15:33
【问题描述】:

我在 Oracle Applications(12c 第 1 版)中运行 Oracle Grid Control 来分析运行缓慢的报告。建议实现一个索引,但是该索引(pay_run_results 上的assignment_action_id)是表上已有的另一个索引的子集(由assignment_action_idelement_type_idsource_typestatus 组成)。

实施这个索引有什么意义吗?由于必须读取更少的索引块,它会使查询更快吗?

【问题讨论】:

  • 在不知道数据分布的情况下,很难判断优化器将选择什么。我建议您对经常使用和不使用建议索引的查询运行解释计划,并查看每个查询的影响。

标签: oracle database-indexes


【解决方案1】:

这似乎是来自调谐器的有点奇怪的建议。如果您经常运行这个缓慢的报告,那么维护额外索引的成本可能是值得的。

如果您想测试建议的索引是否会为查询提供更好的执行计划,但又不想投入时间和实际处理构建,为什么不使用虚拟测试它索引能力?这是一种将索引定义添加到表并查看生成的计划外观的简洁方法。 Tim Hall 在他的 Oracle-Base 站点上有一个很好的介绍。 Check it out.

由于必须读取更少的索引块,它会使查询更快吗?

如果查询使用索引范围扫描或完全快速扫描,则可能是“是”。但在构建其他索引之前,您应该考虑压缩。给定一个复合索引,其中前导列的选择性最小(而尾随列的选择性最大),压缩可以使索引更小。使用四列索引,您可能会使用compress 3 构建索引。

但是,关于列命名约定,我认为assignment_action_id 不是选择性最少的列,在这种情况下,压缩根本无济于事(而且可能会使事情变得更糟)。

【讨论】:

  • Oracle 索引确实没有被压缩。质疑 Oracle 开发人员的智慧是个好主意吗?根据我的经验,他们非常聪明,通常有充分的理由做事;虽然我有时会看到没有错误处理程序的 apis 之类的残暴的东西。
  • 说实话,Oracle 调优顾问比我聪明多了。但这并不意味着它一直都是正确的 :-D 在这种情况下,我不是在质疑索引是否可以提高查询的运行时间。只是建议孤立地存在。您需要考虑在应用程序范围内构建该索引的总成本。我已经修改了我的答案,建议尝试使用虚拟索引。这会让您更加放心,建议的索引会起作用(或不起作用)。
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多