안녕하세요 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 기능은 사용하지 못하고 있습니다.)
확인 부탁드립니다 ^^
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; /