定义索引时,某些列的顺序是否有任何好处

Lew*_*ton 13 index oracle

例如,如果我有两个索引:

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;
Run Code Online (Sandbox Code Playgroud)

这会变得IDX_2多余吗?如果不是,我如何确定声明列的顺序?

我应该为常规查询定制索引吗?

Con*_*lls 12

是的,当您想查询索引的一部分时,好处就来了。如果将部分使用的谓词放在首位,则索引可用于涉及这些谓词但不是索引中的所有列的查询。

此外,除非您有其他要求,否则将最具选择性的谓词放在首位会有所帮助,因为这可以更快地减少索引查找操作。

IDX_2根据表上查询的性质,在您的情况下不一定是多余的。但是,可能没有必要包括所有列。例如,如果您执行了大量查询locationdate然后IDX_2可能有助于解决这些查询,因为IDX_1顺序不正确而对其有用。但是,您可能会发现这item在 上是多余的IDX_2

从 9i 开始,Oracle 引入了“跳过扫描”运算符,可以更有效地查询尾随索引列,从而减少对此类补充索引的需求。

在更具体的情况下,如果您item通过locationand进行查询并且date不需要任何其他列,那么可以通过索引完全解析查询,而无需从表中读取任何内容。您还可以构建附加了非索引列的覆盖索引。如果可以从覆盖索引解析所有需要的列,则查询根本不需要触及主表。

最后,回答您的最后一个问题:如果您有一组经常使用的查询,这些查询消耗了大量资源并且可以使用索引进行调整,那么这当然值得考虑。但是,维护索引会带来插入的开销,因此您必须在查询性能与索引在插入或更新操作上的开销之间进行权衡。

  • @ConcernedOfTunbridgeWells:另一种方法是使用索引键压缩,并让选择性较少(不同值较少)的列领先。它有助于导致较小的索引,同时仍然允许跳过扫描正常运行。 (3认同)