定义索引时,列的某些顺序有什么好处


13

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

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;

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

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

Answers:


12

是的,当您要查询部分索引时,就会有好处。如果首先使用部分谓词,则索引可用于涉及那些谓词但不是索引中所有列的查询。

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

IDX_2根据表上查询的性质,您的情况不一定是多余的。但是,可能不必包括所有列。例如,如果您在之前进行了很多查询locationdate那么IDX_2可能有助于解决这些查询,因为IDX_1顺序不正确。但是,您可能会发现在上item是多余的IDX_2

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

在更具体的情况下,如果您item通过location和查询并且date不需要任何其他列,则可以通过索引完全解决查询,而不必从表中读取任何内容。您还可以构建包含未索引列的覆盖索引。如果可以从覆盖索引中解析所有需要的列,则查询根本不需要触摸主表。

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


3
@ConcernedOfTunbridgeWells:一种替代方法是使用索引键压缩,并使用较少选择性(较少的不同值)的列作为前导。它有助于产生较小的索引,同时仍允许跳过扫描正常运行。
亚当·穆奇

2

要考虑的另一件事是具有很多空值的列。

如果这些列在索引中在它们之后指定了任何列,则必须索引空值。否则,像往常一样,不索引空值(当然,这是假设您正在使用b树索引)。

因此,如果您的列中包含大量的空值,则将它们放在索引的末尾可以节省大量磁盘空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.