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



SELECT * FROM ORDER;

=>  SQL은 부분범위 처리를 했기 때문에 실제로 수행한 일은 한 운반단위 만큼 처리하고 멈춘다.

SELECT * FROM  ORDER
ORDER BY item;

=> 전체범위를 처리해야 하기 때문에 전체 테이블을 모두 액세스 하여 임시 저장공간에 저장하고 정렬시킨 후 하나의 운받단위를 추출하고 멈추없다.
    이유는 정렬작업뿐만이 아니라 정렬작업을 위해 전체 범위를 모두 처리해야 했기 때문이다.


SELECT * FROM ORDER
WHERE ITEM > ' ' ;

=> ITEM에 index의 값으로 정렬이 되어있기때문에 구지 order by 를 하여 전체범위를 일으킬일이 없다.



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

이때  ordno 는 1000건,  custno 는 10건



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

   2) CUSTNO 의 INDEX를 사용한경우
       CUSTNO 인덱스에서 조건을 만족하는 첫번째 로우를 랜덤으로 찾는다.
       인덱스에 있는 ROWIN를 이용하여 ORDER 테이블의 해당로우를 액세스한다.
       테이블의 로우에 있는 ORDNO가 1과 1000사이에 있는지를 검증하여 만족하는 로우만 운반단위로 보낸다.
       CUSTNO인덱스의 다음로우를 액세스하여 ② ~ ③ 을 반복하여 운반단위가 재워지거나 인덱스 처리범위가 끝나면 수행을 멈춘다.

SELECT * FROM ORDER
WHERE RTRIM(ordno) BETWEEN  '1'  AND  '1000'
AND   custno  like 'DN%';
=> 좌변을 가공하여 ordno_index를 못타게해  custno_index타 빠르게 수행이된다.


SELECT /*+ index(ORDER custno_index) */* FROM ORDER
WHERE ordno BETWEEN  '1'  AND  '1000'
AND   custno  like 'DN%';

=> 힌트를 사용하여 인위적으로  custno_index 타게한다.




문서에 대하여

  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 이화식님의 새로쓴 대용량 데이터베이스 솔루션을 참고했습니다.*
  • 이 문서를 다른 블로그나 홈페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^