我有如下一个层次查询:
   select * from table1 start with field1 is null connect by 
   prior field1=field_id1 or prior field2=field_id1 or prior field3=filed_id2
table1很大,有20万条记录.
因为在field_id1和field_id2上有索引,但每次查询connect by后面的or条件时都全表扫描,速度极慢。如果Oracle用多个or条件单独查询出的结果再union的话速度应该会快,但我不知道怎样可以在层次查询中使Oracle把多个or条件变为union查询。
  请各位帮忙,谢谢。

解决方案 »

  1.   

    layer781010(为了爱) 兄,要知道
    "table1很大,有20万条记录.field_id1和field_id2上有索引"
    全表扫描和索引查询的速度不在一个数量级的.
      

  2.   

    field1 is null 
    首先这个就无法用到索引
      

  3.   

    谢谢老兄教导:
    请问可不可以将下面的table1改成视图的
    select * from table1 start with field1 is null connect by 
       prior field1=field_id1 or prior field2=field_id1 or prior field3=filed_id2为:select * from (select * from table1 where field1=field_id1 or prior field2=field_id1 or prior field3=filed_id2) start with ..............
      

  4.   

    有null的话,oracle就不会用索引,如果程序列上有索引,效率上应该没有问题,勿需优化了
      

  5.   

    我给你提供一个思路假定存在一个field1 永远不会被取到的值val
    建一个函数索引CREATE UNIQUE INDEX index1 ON table1 
    (
           nvl(field1,val)          ASC
    ) TABLESPACE INDX 
    STORAGE(INITIAL 1M NEXT 1M MINEXTENTS 1);
    然后把sql语句改写为select * from table1 start with nvl(field1,val) = val  connect by 
       prior nvl(field1,val)=field_id1 or prior field2=field_id1 or prior field3=filed_id2
      

  6.   

    我解决了,我自己用存储过程写了层次查询,建立队列,循环中深度编历,结果集保存在TABLE变量中,返回结果集的游标。
    查询效率提高了数十倍。
    看来Oracle对start with,Connect by优化不够。