ORDER BY, GROUP BY, 분석함수, 해시조인(building) 등은 액세스 해야 할 데이터 범위 모두를 액세스한 후 결과를 리턴할 수 있는 "전체범위 처리" 오퍼레이션이어서 "부분범위 처리"의 잇점을 누릴 수가 없는데, SQL 수정 및 인덱스 변경 등을 통해 "부분 범위 처리" 가능한 실행계획이 수립되도록 한다.
참고로, '부분범위 처리"는 결과 로우 전체를 한꺼번에 리턴하는 대신 FETCH 단위로 리턴할 수 있는 기능이며, Multi-Tier 환경에서는 SQL문에 ROWNUM 조건절을 사용하고, 전체 범위 처리 오퍼레이션이 없어야 그 잇점을 누릴 수 있다.
개선 전
- (문제 상황) 넓은 데이터 범위를 액세스함(STOPKEY 오퍼레이션 전까지 약 24천여건을 유지)
- (문제 원인) SORT ORDER BY 오퍼레이션 후 STOPKEY를 적용하여 101건을 리턴하지만, 24천여건을 만들기 위한 데이터/인덱스 액세스량은 줄이지 못함
개선 방안
- (수정 전) ORDER BY 절로 인해 전체 범위 처리되어서 넓은 데이터 범위를 액세스함
- (수정 후) 전체 범위 처리 영역을 최소화하기 위해 먼저 액세스 되는 테이블에만 ORDER BY 적용하도록 SQL문 ‘구조’를 변경함
- 참고로, 먼저 액세스되는 데이터 집합에 대해서만 ORDER BY를 적용하더라도 이후 NL조인이 수행되면 ORDER BY가 유지됨(단, batched I/O가 아니어야 함)
개선 후
- (개선 결과) 전체 범위(24천건) 처리 영역이 줄어들었고, 읽은 전체 블록도 종전 82천건에서 2천여건으로 크게 감소함
잘봤습니다.
답글삭제