오라클 대용량 insert 시 트랜잭션 속도 저하 0 2 4,510

by LEe [Oracle 기초] insert 트랜잭션 [2024.06.10 16:43:29]


안녕하세요, 대용량 insert 관련해서 문의드립니다.

 

하루에 130만건 정도에 데이터를 파일로 수신하여 DB에 insert 하는 작업이 있습니다.

Pro c 통해서 insert하고 있으며 10만건 정도 이후로 부터 트랜잭션이 느려지며 최종 130만건 insert하는데 3시간가까이걸립니다.

 

위 내용만으로는 답변해주시기 힘드실거같습니다만 어떤 정보를 드려야할지 모르겠네요 ㅠㅠ

혹시 조언이 가능한 부분이 있거나 제가 추가로 어떤정보를 드리면 될지 말씀 주시면 내용 추가 하겠습니다 감사합니담 ㅜ

by 소고기 [2024.06.11 10:20:51]

안녕하세요 오라클에서 130만건 insert가 대량은 아니라 3시간이 걸릴 작업이 아니긴 합니다.

그래서 먼저 어디서 속도 지연이 나타나는지 확인이 필요해보입니다.

오라클에서는 대기이벤트라는걸 관측할수 있는데 insert 시 어떤 대기이벤트가 발생하는지를 알려주면 분석이 더 용이합니다.

오라클 19c 최근 ash event 확인 쿼리

또는 해당 세션에 잠시나마 10046 트레이스를 걸어 어느부분에서 call이 많이 발생하는지도 확인 가능합니다.(부하가 있을수 있으니 확인 후 설정)

오라클 19c 다른 세션 트레이스 설정

 

이 정보 없이 일단 속도를 빠르게 할 방법을 생각해보자면

1.cpu 사용량이 너무 높지 않은지 확인한다.(insert 작업도 cpu를 소모하기때문에 cpu 사용량이 많은경우 느릴수 있음)

2. insert 시 commit 주기를 변경해본다.(예를들어 n만건 단위로 commit)

3. redo 사이즈가 충분한지 확인해본다.(redo 사이즈가 작아 log switch 가 빠르게 일어나면 이로인해 insert 성능이 저하됩니다.)

4. insert 대상 테이블에 인덱스나 제약조건이 너무 많이 걸려있지 않은지 확인한다.(인덱스가 많을 경우 기본적으로 dml 속도가 저하됩니다.)

5. 네트워크 속도를 점검한다.(db 문제가 아니라 네트워크 속도 문제가 아닌지 점검이 필요합니다)

6. Pro C의 배치 처리를 이용한다(이 방식을 사용하면 보다 빠르게 insert 가능합니다)

7. insert 구문이 단건으로 130만건 insert 하는것이 아닌, a라는 테이블에 있는 데이터 130만건을 b 테이블로 insert하는 경우(itas 방식) 병렬작업도 가능합니다.

alter session enable parallel dml;

insert /*+ parallel(b 2) */ into b select /*+ parallel(a 2) */ * from a;


by LEe [2024.06.11 14:16:45]

와 ,,,,,,, 답변주신내용 토대로 여기저기 부서별로 체크해보니 네트워크단에서 개선이 필요한거로 보이네요 큰 힘이 되었습니다 감사합니다~!~

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