connect by에서 인덱스의 영향이 궁금합니다. 0 3 5,415

by 리뉴사 [SQL Query] Connect By 계층형 쿼리 index 인덱스 [2016.03.23 10:28:32]


select c.cat_no
from category c
start with c.cat_no = '11'
connect by prior c.high_no = c.cat_no 

connect by(계층형 쿼리)는 아래와 같은 순서로 실행된다고 봤는데요.

1. Start With 조건에 맞는 자료로부터 계층구조가 시작되구요
2. Connect By 조건에 맞는 자료를 찾아 계층구조를 전개합니다.
3. Where 조건은 계층 전개 후에 체크됩니다.

인덱스를 생성할 때  (cat_no, high_no) 순서로 만드는 것과

(high_no, cat_no) 의 순서로 만드는 것에 관해 성능적인 차이는 없는건가요?

Start With에서  cat_no = '11' 이라는 조건에 의해 (cat_no, high_no) 이 순서가 더좋다고 할수 잇지만

결국 connect by 절에서 prior high_no = cat_no 때문에 인덱스 풀스캔을 하게된다고 생각하여 성능적 차이가 없다고 생각했습니다.

 

제 생각이 맞는건지 궁금하네요. 

 

by 마농 [2016.03.23 11:31:36]

10g 까지는 위 순서대로 스캔한다고 봐도 될 듯 하구요.
11g 부터는 진화된 방식으로 스캔하는 듯 합니다.
11g 기준으로 몇가지 테스트 해봤는데요.


위 쿼리는 키값만 검색하고 있네요.
키값만 검색한다면? 결합인덱스 풀스캔 하네요.
보통은 키 외에 다른 항목을 함께 조회하죠.
이 경우엔 start with 따로 스캔하고.
connect by 따로 스캔하는 듯 하구요.
둘다 cat_no 인덱스(아마도 PK) 이용하겠죠.


위 쿼리는 bottom-up 방식의 검색이네요.
보통은 top-down 검색 주로 하죠.
이 경우에는 start with 와 connect by 의 조건이 뒤바뀌게 되구요.
이 때 필요한 인덱스는 cat_no 가 아닌 high_no 가 필요하죠.


따라서 여러가지 검색 패턴을 고려하면
cat_no 는 이미 PK 로 존재할 듯 하고
high_no 인덱스가 별도로 필요하다고 보여집니다.
이를 (high_no, cat_no) 로 결합해도 되겠구요.
cat_no 가 이미 PK 로 존재하니 (cat_no, high_no) 까지 만드는 것은 부담일 듯 하네요.


by 리뉴사 [2016.03.25 17:38:02]

언제나 친절하신답변 감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입