새로쓴 대용량 데이터베이스솔루션 1 (2011년)
부분범위처리의 수행속도 향상원리 0 0 99,999+

by 구루비스터디 부분범위처리 Partial Range Scan [2013.09.11]


부분범위처리의 수행속도 향상원리



SELECT * FROM ORDER;
-무조건으로 데이블의 첫 번째 블록을 스캔한 모든 로우들을 그대로 운반단위로 보내서 바로 추출


SELECT * FROM ORDER
 ORDER BY ITEM;
-오랜 시간이 지나서야 첫 번째 운반단위가 추출됨(전체 테이블을 모두 액세스하여 임시 저장공간에 저장하고 정렬시킨 후 하나의 운반단위를 추출)


SELECT * FROM ORDER
WHERE ITEM > ' ';
-옵티마이져 목표가 'ALL_ROWS'가 아니라면 ITEM인덱스를 사용하는 실행계획을 수립하며 부분범위 처리
-옵티마이져 목표가 'ALL_ROWS'였다면 전체 테이블을 스캔하는 실행계획(정렬순으로 추출되지 않음)


ALL_ROWS일때
SELECT /*+ index( order item_index ) */ *
 FROM ORDER
WHERE ITEM > ' '
-힌트를 사용하여 인덱스를 사용하게 유도



  • 가정: ORDER테이블 ORDNO조건을 만족하는 로우가 1000건이 있고, CUSTNO를 만족하는 로우가 10건 각각의 컬럼에는 별도의 인덱스가 생성되어 있음

SELECT * 
  FROM ORDER
WHERE ordno between 1 and 1000
  AND custno like 'DN%';

  • 옵티마이져가 현재 어떤 실행계획을 수립했는가에 상관없이 액세스 형태별로 발생될 수 있는 일량



1) ORDNO인덱스를 사용한 경우
  • 1-1. ORDNO인덱스에서 조건을 만족하는 첫번째 로우를 랜덤으로 찾는다.
  • 1-2. 인덱스에 있는 ROWID를 이용하여 ORDER테이블의 해당 로우를 액세스한다.
  • 1-3. 액세스된 테이블의 로우에 있는 CUSTNO가 'DN'으로 시작하는지를 검증하여 만족하는 로우만 운반단위로 보낸다. 즉, CUSTNO는 인덱스를 사용하지 않고 검증 기능으로만 사용
  • 1-4. ORDNO인덱스의 다음 로우를 액세스하여 1-2~1-3을 반복하여 운반단위가 채워지거나 인덱스의 처리범위가 끝나면 수행을 멈춘다.


결론
  • 1000회의 처리를 해야 1000건의 로우들은 거의다 CUSTNO LIKE 'DN%' 조건을 만족하지 못할 것이다. 운반단위를 채울 수가 없어 계속해서 다음건을 수행해야 하며,


  • 최악의 경우 ORDNO의 모든 범위(1000건)를 완료해야만 멈출 수 있다.

해결방법 :
  • 1. ORDNO의 처리범위를 줄인다
  • 2. CUSTNO의 조건이 오히려 넓어진다면 ORDNO인덱스를 경우한 로우들이 훨씬 쉽게 운반단위를 채울 수 있다.


  • 가정: ORDER테이블 ORDNO조건을 만족하는 로우가 1000건이 있고, CUSTNO를 만족하는 로우가 10건 각각의 컬럼에는 별도의 인덱스가 생성되어 있음
  • 옵티마이져가 현재 어떤 실행계획을 수립했는가에 상관없이 액세스 형태별로 발생될 수 있는 일량

SELECT * 
  FROM ORDER
WHERE ordno between 1 and 1000
  AND custno like 'DN%';



2) CUSTNO 인덱스를 사용한 경우
  • 2-1. CUSTNO인덱스에서 조건을 만족하는 첫번째 로우를 랜덤으로 찾는다.
  • 2-2. 인덱스에 있는 ROWID를 이용하여 ORDER테이블의 해당 로우를 액세스한다.
  • 2-3. 액세스된 테이블의 로우에 있는 ORDNO가 1과 1000사이에 있는지를 검증하여 만족하는 로우만 운반단위로 보낸다. 즉,ORDNO의 범위는 넓으므로 쉽게 조건을 만족할 수가 있어 운반단위로 보낼 수 있는 확률이 높아지는 것에 유의 하기 바란다.
  • 2-4. CUSTNO인덱스의 다음 로우를 액세스하여 2-1~2-3을 반복하여 운반단위가 채워지거나 인덱스의 처리범위가 끝나면 수행을 멈춘다.


액세스 주관조건의 범위검증조건의 범위수행속도조치사항
좁다좁다양호
좁다넓다양호
넓다좁다불량주관조건과 검증조건 역할 교체
넓다넓다양호


  • 판단기준 : WHERE절에 조건을 만족하는 ROW수가 좁다, 넓다에 따라 운반단위가 채워지는 시간으로 판단
"구루비 데이터베이스 스터디모임" 에서 2011년에 "새로쓴 대용량 데이터베이스 솔루션1" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/2620

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

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