我有如下一个层次查询:
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查询。
请各位帮忙,谢谢。
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查询。
请各位帮忙,谢谢。
"table1很大,有20万条记录.field_id1和field_id2上有索引"
全表扫描和索引查询的速度不在一个数量级的.
首先这个就无法用到索引
请问可不可以将下面的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 ..............
建一个函数索引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
查询效率提高了数十倍。
看来Oracle对start with,Connect by优化不够。