日期:2014-05-16  浏览次数:20878 次

Oracle复合索引建立的问题
Oracle一个表TABLE有A,B,C,D,E字段,有个SQL,用到了WHERE A=:a and B=:b and C=:c and D=:d,还有一个SQL用到了WHERE A=:a and B=:b and C=:c and D=:d and E=:e,如果只建立一个(A,B,C,D)的复合索引,我看到执行计划是:
1 - filter("TABLE"."E"='02')
2 - access("TABLE"."A"='1' AND "TABLE"."B"='1309' AND
  "TABLE"."C"='01SEP10' AND "TABLE"."D"='D')

如果建立(A,B,C,D,E)的复合索引,则执行计划:
2 - access("TABLE"."A"='1' AND "TABLE"."B"='1309' AND
  "TABLE"."C"='01SEP10' AND "TABLE"."D"='D' AND "TABLE"."E"='e')

问题:
1、如果仅建立(A,B,C,D,E)的索引,那仅使用A,B,C,D四个做WHERE条件的SQL也可以使用索引?
2、如果仅建立(A,B,C,D)的索引,那使用A,B,C,D,E五个做WHERE条件的SQL执行计划有1 - filter和2 - access,是否用索引了呢?
3、没必要建立(A,B,C,D,E)和(A,B,C,D)两个复合索引?

注:这个表的DDL操作:INSERT以及每天夜维执行一次DELETE操作。

谢谢!

------解决方案--------------------
最简单的操作就是每个字段建立一个索引
------解决方案--------------------
解答:
1可以
2是
3如果效率要求特别高才有必要,不建议这样,如果十分必要建立ABCDE索引
------解决方案--------------------
建立(A,B,C,D,E)这样的索引才会使你的WHERE A=:a and B=:b and C=:c and D=:d and E=:e,语句进行最优化