当前位置: 代码迷 >> Oracle开发 >> 重复目录
  详细解决方案

重复目录

热度:29   发布时间:2016-04-24 06:35:06.0
重复索引
我的table表下有 pk_table_1(主键 Unique) key  cid,datetime
                         idx_table_1(索引 Unique) key  cid,datetime
                      idx_table_2(索引 Normal) key  cid
现在 索引1和主键是重复的。
我查询
 slect * from table datetime = to_date('22-10-2014 21:55:00', 'dd-mm-yyyy hh24:mi:ss') and  cid in (1,2,3) 
时为什么是使用    idx_table_2 索引?
------解决思路----------------------
引用:
我的table表下有 pk_table_1(主键 Unique) key  cid,datetime
                         idx_table_1(索引 Unique) key  cid,datetime
                      idx_table_2(索引 Normal) key  cid
现在 索引1和主键是重复的。
我查询
 select * from table datetime = to_date('22-10-2014 21:55:00', 'dd-mm-yyyy hh24:mi:ss') and  cid in (1,2,3) 
时为什么是使用    idx_table_2 索引?

oracle目前采用最优方案,所以肯定走idx_table_2索引比另外两个效率高。
下面说下我对这个现象的理解:
你这个sql句子对于datetime而言是等值查询,对于cid相当于范围查询,而
oracle的联合索引,字段顺序只有是当等值查询在前,范围查询在后效率才高,
使用联合索引才最优。所以你试试idx_table_1(索引 Unique) key  cid,datetime
这个索引改成这样idx_table_1(索引 Unique) key  datetime,cid,也就是调换索引
列的顺序。(当然如果要看哪种情况查询多一点,如果这个sql只是偶尔执行一次,
那就不要随意改动了。)这样oracle大概就会使用联合索引了。

------解决思路----------------------
优化通过计算得出的走idx_table_2是最优的,如果你可以通过提示是优化器走idx_table_1
/* index(表名,索引名) */ 
------解决思路----------------------
datetime字段选择性不高,或者不是date类型。如果非以上,重新采集表的统计信息
另外,并非重复索引,索引!=约束,只不过主键/唯一键是通过索引来实现了,如果创建时不存在对应的索引,则会自动创建
  相关解决方案