- 정의

부분범위 처리가 되도록 유도하는 페이지 처리는 적절한 ROWNUM 처리와 ORDER BY절, WHERE절, 인덱스 구성정보가 적절하고
테이블 간 조인 방식이 NESTED LOOPS JOIN으로 수행된다면 효율적인 수행이 가능

하지만 부분범위 처리가 불가능한 경우 적절하지 못한 ROWNUM처리를 하더라도, WHERE절, 인덱스 구성정보와 ORDER BY절의
정렬기준이 맞으면, SORT ORDER BY 오퍼레이션이 나타나지 않고, COUNT오퍼레이션이 보인다.

그런데 COUNT오퍼레이션이 마치 전체 데이터 처리를 하지 않고 수행하는것처럼 보이지만, 실제는 전체 데이터를 모두 처리한 후
ROWNUM을 수행하기 때문에 주의해야 한다.

  • ex) 예제

...(생략)
WHERE a.acpt_no   = b.acpt_no
AND   a.acpt_no   = c.acpt_no
AND   b.styl_cd   = 'ACOl'
AND   a.proc_stus IN ('D','E')
AND   a.brof_cd   LlKE TRIM (:B0) || '%'
AND   a.acpt_dt || a.acpt_time < :B1
ORDER BY a.brof_cd DESC,                 ---> 인텍스 컬럼 구성순서와 매징이 됨
         a.proc_stus DESC,
         a.acpt_dt DESC,
         a.acpt_time DESC
) x
WHERE rnum <= :B2 AND rnum >= :B3 ---> ROWNUM 처리가 비효율

Rows Row Source Operation
-------------------------------------------------------------------
50   FILTER (cr=8677 pr=538 pw=O time=1957 us)
50    VIEW (cr=8677 pr=538 pw=0 time=1955 us cost=9 size=159 card=1)
599    COONT (cr=8677 pr=538 pw=0 time=326134B us)                      ---> 전체 데이터 처리함.
599     VIEW (cr=8677 pr=538 pw=0 time=3260896 us cost=9 size=146 card=1)
599      TABLE ACCESS BY INDEX ROWID TRM150 (cr=8677 pr=538 ... )
1199      NESTED LOOPS (cr=8078 pr=538 pw=O time=227759 us)
599        NESTED LOOPS (cr=6874 pr=530 pw=O time=4307258 us ... )
2057        TABLE ACCESS BY INDEX ROWID TRDIOO (cr=2147 pr=10 ... )
2057         INDEX RANGE SCAN DESCENDING IX TRD100 01 (cr=167 pr=O ... )
599         TABLE ACCESS BY INDEX ROWID TRM100 (cr=4727 pr=520 ... )
599          INDEX UNIQUE SCAN IX TRM100 02 (cr=4128 pr=7 pw=O time=56539 ...)

  • 앞의 트레이스 결과를 보면 ROWNUM조건으로 범위를 조회하여 비효율적으로 처리되고 있다.
    하지만 WHERE절의 인덱스 구성정보와 ORDER BY절이 적절히 구성되어 있어 SORT ORDER BY오퍼레이션이 아닌, COUNT 오퍼레이션이 있는것을 확인 할 수 있다.
    그러나, COUNT는 COUNT STOPKEY와는 다르게 전체 데이터를 모두 처리하므로 비효율적으로 수행된다.
    이를 효율적인 페이지 처리로 수행되도록 하기 위해서는 RNM을 치환하기 전에 :B3값에 해당하는 데이터만 가져오도록 ROWNUM조건을 추가 해야 된다.