Oracle 索引 - 创建一个作为另一个前导列的子集的索引是否有意义

Oracle indexes - Does it make sense to create an index that is a subset of another one's leading columns

我 运行 Oracle 应用程序(12c 第 1 版)中的 Oracle 网格控制来分析一个缓慢的 运行 报告。建议实现一个索引,但是索引(pay_run_results 上的 assignment_action_id)是 table 上已有的另一个索引的子集(由 assignment_action_idelement_type_id, source_type, status).

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

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

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

Would it make the query faster due to having to read less index blocks?

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

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