Oracle 2索引在相同的列上但顺序不同

时间:2013-08-22 19:07:05

标签: oracle oracle11g oracle10g database-performance query-performance

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

DDL

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

这两个指数是否基本相同。为什么有人会这样创建索引?反转或更改列位置是否在内部执行某些操作?

2 个答案:

答案 0 :(得分: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查找。这不是一个重要的收获,但仍然......维护索引是数据库的开销,减少开销总是一件好事。

答案 1 :(得分:1)

在索引中找到所有需要的信息的情况下,Oracle不必触摸表段。 在您的情况下,这些索引可以用作快速查找/转换表STORE_ID =&gt; DIST_ID,反之亦然。

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

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