오라클 페이징 성능 개선 문의 0 1 1,547

by jason kim [Oracle Tuning] rownum paging [2023.05.31 10:40:15]


안녕하세요 Oracle to Mysql(MariaDB)로 이관하는 프로그램을 만들다 보니 큰 테이블의 경우 추출 쿼리 성능이 많이 나빠지는 문제가 있어 문의 드립니다.

chunk_size를 기준으로 rows를 추출하여 이관하는 프로그램을 만들었습니다.

 

chunk_size =10000 이면 10000rows 씩 추출하면서 테이블의 마지막까지 도는 형태입니다.

 

<추출 쿼리>

SELECT *

 FROM (SELECT A.*, ROWNUM RNUM

           FROM (SELECT * FROM {oracle_talbe}) A

           WHERE ROWNMUM <= {offset + chunk_size}

WHERE rnum > {offset} 

 

10만 20만 같이 크지 않은 테이블의 경우 페이징 처리를 해도 성능이 크게 밀리지 않는데 4000만, 5000만이 넘는 테이블의 경우 페이징 처리에서 성능이 많이 떨어지는 문제가 있는데

 

개선할 수 있는 방법이 있을까요?!

(소스쪽 oracle 버전이 11g다 보니 12c에서 지원하는 offset 기능은 사용하지 못하고 있습니다.)

 

확인 부탁드립니다 ^^

by 마농 [2023.05.31 15:10:30]

PK 항목이나 일자항목 등 인덱스 항목으로 분할하여 보내는 방안.
- 인덱스로 정렬하여 각 페이지의 시작값을 추출
- 페이지를 루프 돌렴서 해당 시작값으로값으로 조건 추출
 

-- 일자(dt) 항목으로 된 인덱스가 존재한다고 가정한 예시
BEGIN
    FOR c1 IN ( SELECT CEIL(ROWNUM / 10000) gb
                     , MIN(dt)  start_dt
                     , MIN(rid) start_rid
                  FROM (SELECT dt
                             , ROWID rid
                          FROM t
                         ORDER BY dt
                        )
                 GROUP BY CEIL(ROWNUM / 10000)
                 ORDER BY gb
                )
    LOOP
        -- 추출 쿼리 --
        SELECT *
          FROM t
         WHERE dt >= c1.start_dt
           AND NOT ( dt = c1.start_dt AND ROWID < c1.start_rid )
           AND ROWNUM <= 
        ;
    END LOOP;
END;
/

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입