2. 컴퓨터 이야기/데이타베이스

connect by ~ start with ~ order siblings by ~ 문에 대한 Oracle 9i Plan (실행계획)

래빗 크리스 2009. 8. 2. 14:19


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 에 기술된 순서로 버퍼에 담는다고 한다.

 
이상..