说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

请问orcale层次查询中or条件如何优化?

编辑:说三道四文库 发布时间:2018-07-23 04:07
HTML文档下载 WORD文档下载 PDF文档下载
我有如下一个层次查询:
   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查询。
  请各位帮忙,谢谢。
gz
请高手们指教!
效率应该差不多吧。
layer781010(为了爱) 兄,要知道
"table1很大,有20万条记录.field_id1和field_id2上有索引"
全表扫描和索引查询的速度不在一个数量级的.
field1 is null 
首先这个就无法用到索引
谢谢老兄教导:
请问可不可以将下面的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 ..............

有null的话,oracle就不会用索引,如果程序列上有索引,效率上应该没有问题,勿需优化了
我给你提供一个思路

假定存在一个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


我解决了,我自己用存储过程写了层次查询,建立队列,循环中深度编历,结果集保存在TABLE变量中,返回结果集的游标。
查询效率提高了数十倍。
看来Oracle对start with,Connect by优化不够。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘