안녕하세요.
대용량 데이터 이관관련하여 문의 드립니다.
수GB 대용량 데이터를 select 후 bulk insert하고 있습니다.
이슈는 bulk insert에 대한 속도였는데 의외로 insert속도에는 문제가 없더군요
select, fetch, fetchSize에 대한 문제에 도달하게 되었습니다.
한번 select를 하게되면 전체데이터를 가져오는줄 알았는데
fetchSize 크기만큼 가져와서 fetch처리한다는 정도로 파악되었습니다.
그러다보니 insert보다도 굉장히 시간이 소요됨을 알았습니다.
그래서 process분리후 각 프로세스별로
페이징처리 로직을 변경하여 테스트한 결과 두배정도 빨라지긴했는데(20GB->25분내)
1. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 0 and rn <= 5G
2. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 5G and rn <= 10G
3. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 10G and rn <= 15G
4. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 15G and rn <= 20G
이런식입니다.
로그를 찍어보니
1번 스레드 select완료후 fetch 진행이 한참된 이후에 2번째 select가 완료되어 진행이 됨을 알았습니다.
결국 4번째는 거의 10분 이후에 완료됩니다.
별로 process(java)로 조회를 하고 있는데 같은 테이블을 조회를 해서 그럴까요? 각각 select(toad tool) 2~3분 내 끝나는데
분리해서 4개를 동시에 실행을하면 1->4 순으로 끝나야 select를 진행하고 있다는 느낌이 듭니다.
병렬처리를 위해서 프로세스를 분리하고 있는데 select를 동시적으로 못한다면 의미가 없을것 같은데
작업상 문제인건지, DBMS상 특성인건지, 설정 변경이나 옵션으로 가능한건지 답변 좀 주세요.
|