connect by ~ start with 문에서 정렬하는 방법.
order siblings by ~ 활용.
다음은 connect 문에 넣기 전에 미리 order by 를 해 놓는 경우이다.
Index 힌트를 사용하여 다른 인덱스를 태우지 않도록 제한을 걸었다 (그래도 Optimizer 마음대로 하겠지만..).
그런데, 이렇게 하면.. 실행계획이 복잡하게 된다.
srart with 문이나 connect by 에도 order by 의 sort 계획이 잡히게 된다.
select * from (select /*+ index(a table_category_idx04) */ a.seq_category, a.bef_category, a.name, a.depth, a.ordr, a.link_url from table_category a, (select seq_category from table_acl where resno = ?) b where a.seq_category = b.seq_category||'' and a.open_yn = 'Y' and a.menu_yn = 'Y' order by bef_category, ordr) a connect by a.bef_category = prior a.seq_category start with a.bef_category = '1' |
아래 그림을 보면 알겠지만, SORT (ORDER BY) 가 매번 걸리게 된다.
인덱스를 태운다고는 하지만, 대용량이면 대략 난감해진다.
다음에는
그러면, order siblings by 문을 이용해서 쿼리를 조정해 보자.
select * from (select /*+ index(a table_category_idx04) */ a.seq_category, a.bef_category, a.name, a.depth, a.ordr, a.link_url from table_category a, (select seq_category from table_acl where resno = ?) b where a.seq_category = b.seq_category||'' and a.open_yn = 'Y' and a.menu_yn = 'Y') a connect by a.bef_category = prior a.seq_category start with a.bef_category = '1' order siblings by a.ordr |
그러면 실행계획을 확인해 보자. order by 계획이 모두 빠져서 간결해 진 것을 볼 수 있다.
자료에 의하면, start with 를 수행하면서 order siblings by 에 기술된 순서로 버퍼에 담는다고 한다.
이상..
'컴퓨터 이야기 > 데이타베이스' 카테고리의 다른 글
오라클 DB 에서 between 이용시 유의사항 (3) | 2009.12.04 |
---|---|
오라클 DB 에서 DML 작업시 OCI_NO_DATA 오류가 날때 트리거가 문제라면, 잠시 disable 해 놓자 (1) | 2009.11.19 |
오라클 DB 성능 향상 엑셈 MaxGauge (1) | 2009.07.29 |
여러줄 나오는 쿼리를 한줄로 줄일때 Clob 이 대상이라면 다른 방법을 찾아 봐야.. (2) | 2009.05.12 |
WareValley 의 Orange 와 insert into ~ select ~ 구문을 이용한 데이타 DB 업로드 (3) | 2009.01.27 |