4

我在生产环境中有一个表,表中有 2 个索引,索引中的列相同,但顺序相反。

DDL 是

 - CREATE INDEX IND_1 ON ORDERS (STORE_ID,DIST_ID)  
 - CREATE INDEX IND_DL_1 ON ORDERS (DIST_ID,STORE_ID)

这两个指标是不是本质上不一样。为什么有人会以这种方式创建索引?反转或更改列位置是否在内部执行某些操作?

4

2 回答 2

5

索引与它们正在索引的字段相关联,按照它们在索引中定义的顺序。只要您按照从左到右的顺序使用索引中的字段,那么索引就可用于您的查询。如果您要跳过字段,则无法使用索引。例如,给定以下索引:

CREATE INDEX ind1 ON foo (bar, baz, qux)

那么这些 where 子句将能够使用索引:

WHERE bar=1
WHERE bar=1 AND baz=2
WHERE baz=2 AND bar=1  <--same as before
WHERE bar=1 AND baz=2 AND qux=3

您在查询中使用索引字段的顺序无关紧要,只是您正在使用它们。但是,它们在索引中定义的顺序至关重要。以下子句不能使用索引:

WHERE baz=2  <-- 'bar' not being used
WHERE baz=2 AND qux=3  <-- 'bar' again not being used
WHERE bar=1 AND qux=3  <-- the index can be partially used to find `bar`, but not qux.

对于您的两种情况,它们的索引方式并没有什么问题,但是按如下方式进行索引会更有效:

(STORE_ID, DIST_ID)
(DIST_ID)

在第二个索引中索引 store_id 没有意义,因为 DBMS 可以使用第一个索引来处理 store_id 查找。这不是一个主要的收获,但仍然......维护索引是数据库的开销,减少开销总是一件好事。

于 2013-08-22T19:14:29.450 回答
1

如果在索引中找到所有需要的信息,Oracle 就不必接触表段。在您的情况下,这些索引可以用作快速查找/翻译表 STORE_ID => DIST_ID ,反之亦然。

只需查看查询的执行计划,其中您选择仅基于 DIST_ID 选择 STORE_ID,查询只会通过索引,不会触及表本身。

但也许原因不同(如果有的话)。

于 2013-08-23T07:02:35.700 回答