加入收藏 | 设为首页 | 会员中心 | 我要投稿 宿州站长网 (https://www.0557zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-01-24 14:43:06 所属栏目:站长百科 来源:网络整理
导读:我在生产环境中有一个表,在表上有2个索引,索引中的列相同,但顺序相反. DDL是 - CREATE INDEX IND_1 ON ORDERS (STORE_ID,DIST_ID) - CREATE INDEX IND_DL_1 ON ORDERS (DIST_ID,STORE_ID) 这两个指数是不是基本相同.为什么有人会这样创建索引?反转或更改

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

DDL是

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

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

解决方法

索引按照它们在索引中定义的顺序与它们索引的字段相关联.只要您使用索引中的字段(按左 – 右)顺序,就可以将索引用于查询.如果要跳过字段,则无法使用索引.例如给出以下指数:

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

(编辑:宿州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读