결합인덱스에 대한 문의 0 1 2,487

by 클리퍼 [Oracle Tuning] 결합인덱스 [2011.12.25 20:03:09]


안녕하십니까..

오라클의 강좌란에 올라와 있는 내용을 보다가 의문이 생겨서 문의 합니다.
아래 URL 에 나와있는 내용중에서 밑에 파란색글씨 부분이 이해가 안됩니다.
실제로 오늘 도서관에서 책을 보니 똑같은 내용이 나와 있었습니다.

질문하려는 문장 :

이 경우, col2 에 대해서는 체크만 하는 이유는 이 컬럼에 대해서는 정렬이 되어있지 않기 때문.

이런 내용이 아래에 있는데요..
왜 col2 컬럼이 정렬이 안되어 있다고 하는지 모르겠습니다.
제 생각에는 col2, col1 컬럼이 결합인덱스이므로, 
col2기준으로 정렬되어 있고, 동일한 col2값이 있을경우에는 col1 기준으로 정렬이 되는 것으로
생각이 됩니다.

좋은 답변감사합니다.



http://wiki.gurubee.net/pages/viewpage.action?pageId=1507462


4.1.4. 결합 인덱스의 특징

* 분포도가 좋지 않은 COL1 컬럼을 복합인덱스의 선행 컬럼으로 설정한 경우 처리 과정(왼쪽 그림)
   1. col1='A' AND col2=113 인 첫번째 로우를 찾는다.
   2. ROWID를 이용하여 테이블의 로우를 엑세스 한다.
   3. 다음 로우를 차례로 스캔하면서 col1 !='A' OR col2 > 115 일 때 까지 테이블의 로우를 엑세스 하고 그렇지 않으면 처리를 종료한다.
   ◎ 이 경우, 첫 번째 컬럼이 Equal 연산이고 두 번째 컬럼에는 정렬이 되어 있으므로 between이 들어갔다 하더라도 필요한 엑세스만 하게 된다.
 
* 분포도가 좋은 COL2 컬럼을 복합인덱스의 선행 컬럼으로 설정한 경우 처리 과정(오른쪽 그림)
  1. col2=113 AND col1='A' 인 첫번째 로우를 찾는다.
  2. ROWID를 이용하여 테이블의 로우를 엑세스 한다.
  3. col2 > 115 일 때 까지 계속해서 스캔한다. 스캔한 로우는 col1='A' 인지 체크하여 성공하면 ROWID를 이용하여 테이블을 엑세스한다.
  4. col2 > 115 이면 처리를 종료한다. 

  이 경우, col2 에 대해서는 체크만 하는 이유는 이 컬럼에 대해서는 정렬이 되어있지 않기 때문.

체크로 인해 ROWID를 이용한 테이블 엑세스만 줄어들 뿐이다.
  아래의 경우에서 col1 컬럼에 대해서만 인덱스가 있는 경우에서 차이를 볼 수 있다.
  11번의 ROWID 스캔에서 3번의 ROWID 스캔으로만 줄고, 실제 인덱스 내부 처리 범위내에서는 효율을 보지 못했다

by finecomp [2011.12.26 07:18:23]
생각하시는게 맞습니다...;

그림과 내용도 약간 상이...아마 오타일듯 합니다...;
내용상 col1이 체크만 하는 컬럼이며, 조건의 전체구간내에서는 col1의 순서가 반복되어 있으니 정렬을 보장할 수 없어, 구간내에서 전부 체크해야 한다는 것이 핵심입니다...;
그리고 본문의 그 다음줄 설명에서도 col1이 아닌 col2만 인덱스로 잡은 경우와 비교 해야겠지요...;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입