有两个select:
select * from t where a="a" and b="b" and c="c"select * from t where a="a" and b="b" and d="d" and e="e"请问这种情况下,如果建索引的话,
1、是对a,b,c,d,e建五个单独索引?
2、还是对a,b,c和a,b,c,d,e建立两个复合索引?
3、还是对a和b建立一个复合索引?在存在单独索引与复合索引的情况下,是否先按单独索引来查询?另外,还有一个问题:
可否提供一个例子:
定期(例如隔两周的周二晚上十点),rebuild索引,这样的一个存储过程?谢谢指点!

解决方案 »

  1.   

    2、还是对a,b,c和a,b,c,d,e建立两个复合索引? create or replace procedure rebuild_index
    as
    indName varchar2(100);
    cursor cur is select index_name from user_indexes;
    begin
    open cur ;
      loop
          fetch cur into indName;
          execute immediate 'alter index '||indName||' rebuild';
          exit when cur%NOTFOUND;
      end loop;end;
      

  2.   

    为什么不是:
    还是对a和b建立一个复合索引? 
    这样对两个select中where字段的交集建立复合索引?
    另外,如果同时存在复合索引和单独索引,先使用哪个?谢谢!
      

  3.   

    虽然不知道你的Oracle版本是多少,但是《2、还是对a,b,c和a,b,c,d,e建立两个复合索引? 》
    采用这种方法最好。
    第2个问题,估计你想定期整理索引吧。最好采用删除重建这种方法。
      

  4.   

    如果是10万以内的数据,索引建与不建就没有太大的影响吧?另外,如果建立所以后,这个表会有频繁的update和insert操作,那么索引会影响其效率?如果定期rebuild索引是不是会好些?