페이지

2015년 1월 6일 화요일

대용량 데이터베이스 솔루션 1권 #07 Partial Range Scan

Partial Range Scan (부분 범위 처리)

 EMP Table에 1억건의 Data가 있다고 하자.

 SELECT * FROM EMP;
 라고 실행하면 0.1초도 안되서 바로 결과가 보인다. 왜냐면 Data를 아무런 가공없이 읽는 즉시 바로 보여줄수 있기 때문이다. 이런 식으로 완전하게 다 처리되기 전에 부분적으로 처리해서 결과를 보여줄수 있는 것을 부분 범위 처리라고 한다.
 
 SELECT * FROM EMP ORDER BY NAME;
 SELECT empno, SUM(sal) FROM EMP GROUP BY dept;
 이라고 실행하면 몇시간이 지나도 결과가 안나올수 있다. 왜냐면 다 읽어서 Sorting을 한 뒤에야 결과를 보여줄수 있기 때문이다. 이처럼 모두 다 읽고난 뒤에야 처리가 가능한 것을 전체 범위 처리라고 한다.

 


















부분 범위 처리의 경우 Array Size가 다 차면 그 결과를 보여준다.
조건을 만족하는 전체집합이아닌 일부분만 ACCESS 하므로 DATA량이 많아도 PERFORMANCE에지장이 없고 오히려 향상된다.

부분 범위 처리는 어떨때 활용하면 좋을까 ?

- INDEX 나 CLUSTER를 적절히 활용한 SORT의 대체

  SELECT ename, sal FROM emp ORDER BY ename;  전체범위 처리
  SELECT ename, sal FROM emp WHERE ename > '';  부분범위 처리 (단, ename에 INDEX 필요)




- MAX 처리

 SELECT MAX(ord_date) FROM order;  전체범위 처리
 SELECT /*+ index_desc(orddt) */ ord_date FROM order WHERE ord_date < '99991231' and ROWNUM = 1;
             부분범위 처리 (단, INDEX 필요)



- TABLE은 ACCESS 하지 않고 IDEX만 사용하도록 유도 : SELECT에서 활용하는 모든 컬럼들이 INDEX에 포함된 경우




- EXISTS의 활용

  IF CNT(*) > 0 등은 전체부분 처리해야만 가능하다. EXISTS 를 활용한 SQL문은 부분처리가 된다.



- ROWNUM의 활용 : 해당 ROW만큼만 읽고 처리완료



- 1:M JOIN의 부분 범위 유도


SELECT에서 X Table 정보만 본다면 FROM 에는 X만 있는게 맞다. Y가 있을 필요가 없다.
Y절은 EXISTS를 활용하여 SubQuery로 만드는게 맞다.

SubQuery는 MainQuery의 정보를 사용할수 있지만,
SubQuery의 처리결과를 MainQuery에서 사용할수는 없다.

위의 예제에서 오른쪽 그림 EXISTS 안의 SubQuery는 전체 범위 처리긴하지만 가벼운 전체범위이다.

- QUERY를 이원화하여 일부분씩 SCAN하도록 유도

 

SORT의 범위를 줄일 수 있다.

- Stored Function을 이용



필요한 Data가 전체범위라면 총 작업량은 부분범위 처리의 합보다 전체범위가 훨씬 빠르다.
Online 등의 Response Time이 중요한 경우라면 부분 범위 처리를 써야하지만,
Batch 작업처리등 전체적으로 다 처리를 해야 할 경우에는 전체 범위 처리가 더 효과적이다.

작가
이화식
출판
엔코아컨설팅
발매
1996.03.01
평점
블로거의 오늘의 책에 참여한 포스트 입니다

댓글 없음:

댓글 쓰기