전체범위 처리 : 드라이빙 조건을 만족하는 범위를 모두 스캔하여 체크조건으로 검증한 후 성공한 건에 대해 임시 저장공간에 저장한다.
저장이 완료되면 필요한 2차 가공을 한 수 운반단위만큼 추출시키고 다음 요구가 있을때까지 일단멈추게된다.
부분범위 처리 : 드라이빙 조건을 만족하는 범위를 차례로 스캔하면서 체크조건을 검증하여 성공한 건을 바로 운반단위로 보낸다.
운반단위가 채워지면 수행을 멈추고 그결과를 추출시킨다.
=> 처리할 범위가 아무리 넓다고 하더라도 그 범위 중의 일부만 처리하므로 빠른 수행속도를 보장받을 수가 있다.
- 조건을 만족하는 전체집합이 아닌 일부분만 ACCESS
- DATA량이 많아도 PERFORMANCE에 지장이 없고, 오히려 향상
- INDEX나 CLUSTER를 적절히 활용한 SORT의 대체
- TABLE은 ACCESS하지않고 INDEX만 사용하도록 유도
- EXISTS의 활용
- ROWNUM의 활용
- QUERY를 이원화 하여 일부분씩 SCAN하도록 유도
- Stored Function을 이용
Rows Execution Plan
---------- -----------------------------------------------------------------------
0 SELECT STATEMENT
900421 NESTED LOOPS
596 VIEW
1680 SORT (GROUP BY)
2929 TABLE ACCESS (FULL) PF 'SURVERY'
900421 TABLE ACCESS (BY ROWID) OF 'DA100T'
901612 INDEX (RANGE SCAN) OF 'DA100_IDX1' (UNIQUE)
=> 'SURVEY' 테이블을 먼저 전체범위를 액세스하여 GROUP BY를 한 결과를 아용해 'DA100T'테이블과 부분범위 처리로
Nested lOOPS 조인을 한다.
[TRACE에서 전체범위처리 예]
SORT(UNIQUE), SORT(JOIN), SORT(AGGREGATE), SORT(ORDER BY), SORT(GROUP BY) , VIEW(처리중에 내부적으로 임시 저장공간에 쓰기작업을 하였다는 뜻)
[TRACE에서 부분범위처리 예]
'Execute' 나 'Fetch' 라인에 있는 'Query, Disk, Current'을 확인하여 전체 테이블의 블록 수보다 훨씬 적으면 부분범위처리 하고있다.