Oracle中CONNECT BY优化的结果与问题

28 views
Skip to first unread message

Yidong

unread,
Dec 17, 2008, 6:08:33 AM12/17/08
to Beetle Learns To Hack
在Oracle里面, CONNECT BY 通常用来查询有层次关系的数据, 在链接(http://www.adp-gmbh.ch/ora/
sql/connect_by.html)可以找到一个很好的例子:

set feedback off

create table test_connect_by (
parent number,
child number,
constraint uq_tcb unique (child)
);

5 = 2+3

insert into test_connect_by values ( 5, 2);
insert into test_connect_by values ( 5, 3);

11 = 5+6

insert into test_connect_by values (11,5);
insert into test_connect_by values (11, 6);

没有父节点的11
insert into test_connect_by values (null,11);
.....

依此类推,然后用CONNECT BY查询:

SELECT level, parent, child
from test_connect_by
START WITH parent is null
CONNECT BY PRIOR child = parent;

然后会得到一个树型的结果:
LEVEL PARENT CHILD
1 11
2 11 5
3 5 2
3 5 3
2 11 6

这比常规的查询已经快很多了. 但是有些应用在新版本的Oracle上还嫌不够快, 加上类似的优化参数:

ALTER SESSION SET "_OLD_CONNECT_BY_ENABLED" = true

区别在于, 这个参数为true的时候, CONNECT BY是靠index来实现的, 而该参数为false的时候, CONNECT BY使用了
buffer sort. 在数据量很大的时候, 使用index方式能明显感觉到速度的提高.

但是这样会有一个危险, 如果查询的对象是一个多表JOIN的VIEW而非TABLE的时候, 你可能会遇到异常:

ORA-01437: cannot have join with CONNECT BY

Reply all
Reply to author
Forward
0 new messages