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수가 좁다, 넓다에 따라 운반단위가 채워지는 시간으로 판단