我的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 索引?
------解决思路----------------------
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类型。如果非以上,重新采集表的统计信息
另外,并非重复索引,索引!=约束,只不过主键/唯一键是通过索引来实现了,如果创建时不存在对应的索引,则会自动创建