부분범위처리란 어떤 SQL에서 WHERE절에 주어진 조건을 만족하는 전체범위를 처리하지 않고 운반단위(ARRAY SIZE)까지만 먼저 처리하여 그 결과를 추출시킨 뒤 다음 작업을 계속하겠다는 사용자의 요구가 있을 때까지 잠정적으로 수행을 멈추는 처리방식을 말한다.
4.1.부분범위처리의 목적
- 부분범위처리의 목적은 스캔범위를 나누어서 운반단위를 가능한 빨리 채워서 처리속도를 향상시키는 것이다.
- 10,000건의 데이터를 스캔해야 할때 1,000건만 읽어서 필요한 운반단위를 채울 수 있다면 10,000건을 다 읽지 않고 1,000건씩 10번으로 나눠서 처리할 수 있도록 하는 것이다.
- 아래의 그림을 보면 같은 운반단위를 만들기 위해서 전체범위처리는 테이블의 필요한 범위를 모두 읽는 모습을 보여주고 있고, 부분범위처리는 테이블의 필요한 범위 중 일부분만을 읽는 모습을 보여주고 있다.
4.2. 부분범위처리의 적용원칙
부분범위처리의 자격
- 논리적으로 전체범위를 읽어 추가적인 가공을 하지 않고도 동일한 결과를 추출할 수 있다면 자격이 있다.
부분범위처리를 할 수 없는 경우
- SUM, COUNT등의 GROUP함수를 사용한 경우
- ORDER BY가 사용된 경우
- UNION, MINUS, INTERSECT를 사용한 경우
부분범위처리를 할 수 없는 경우의 대체
- UNION \-> 중복제거의 목적이 없다면 UNION ALL로 대체
- ORDER BY \-> INDEX를 이용하여 ORDER BY를 하지 않아도 되는 형태로 대체
- MINUS, INTERSECT \-> EXISTS, NOT EXISTS, IN, NOT IN
부분범위처리의 수행속도 향상원리
- 수행속도는 운반단위를 채우는 속도에 비례한다.
액세스주관 조건의 범위 | 검증조건의 범위 | 수행속도 | 조치사항 |
---|
좁다 | 좁다 | 양호 | |
좁다 | 넓다 | 양호 | |
넓다 | 좁다 | 불량 | 주관조건과 검증조건의 역할을 교체 |
넓다 | 넓다 | 양호 | |
- 엑세스를 주관하는 컬럼의 처리범위는 좁을수록 유리하다
- 액세스를 주관하는 컬럼의 범위가 넓더라도 그 외의 조건을 만족하는 범위가 넓다면 역시 빠른 속도를 보장받는다.
4.4. 부분범위처리로의 유도
인덱스나 클러스터를 이용하여 SORT를 대체한다.
- SQL구문에 order by가 있는 경우 인덱스등을 이용하여 order by를 빼도 되는 형태로 변환한다.
h6.인덱스만으로 엑세스해도 되는 구조를 만든다.
- 결과 컬럼을 얻어올때 인덱스에서 모두 가져올 수 있는 항목인지를 살펴서 인덱스가 다시 테이블을 읽지 않아도 되는 형태로 사용한다.
MAX값을 얻어와야 할 경우 인덱스를 이용한다.
- 보통 사용하는 MAX(seq)+1 형태를 버리고 역순 인덱스를 이용하여 next seq를 구하는 형태로 변경한다.
EXISTS를 활용한다.
- 데이터의 존재여부를 체크하는 등의 로직을 수행해야 할때 count()를 수행하는 것보다는 exists를 이용하여 존재여부를 파악한다.
ROWNUM을 활용한다.
- rownum은 오라클의 pseudo column이다. 이를 이용하여 부분적으로 필요한 데이터만을 얻어올 수 있는 구조로 정의하여 사용한다.
select ..., ROWNUM
from t
where <where clause>
group by <columns>
having <having clause>
order by
- 실행순서
1). FROM/WHERE 절을 처리한다.
2). ROWNUM이 할당되고 FROM/WHERE절에서 전달되는 각각의 출력 로우에 대해 증가한다.
3). SELECT가 적용된다.
4). GROUP BY 조건이 적용된다.
5). HAVING 조건이 적용된다.
6). ORDER BY 조건이 적용된다.
조건의 범위가 너무 넓다면 SQL을 이원화하여 처리한다.