회사에서 개발/테스트 환경에서 사용하는 테이블 중, 특정 컬럼 값을 null로 update 하는 작업이 있었다.
근데 내 파트쪽 테이블 데이터 수가 적은건 100만개,,, 많게는 1억개 정도 됐던걸로 확인을 했다.
다른 파트들에서도 작업을 해서 그런지 select 뿐만 아니라 update 자체도 오래걸렸다...
그래서 pk를 나눠서 처리를 하던 도중 사수님이 UPDATE문에
/*+ enable_parallel_dml parallel(10) */ 힌트를 추가하고 실행해보라고 하셨다.
역시,,, 이렇게 하니깐 실행 시간이 엄청 줄여서 처리를 할 수 있었다!
parallel의 경우, 시스템 자원을 끌어다 써서 최대 효율을 내는 것인데, 당연히 운영이나 서비스에서 사용하면 안되는 작업
(시스템 자원을 많이 잡아먹기 때문에)
parallel을 쓰는 경우를 생각해보자면, 아래와 같다고 생각한다.
1. 배치작업
2. DB툴에서 일괄적으로 대량의 데이터 처리가 필요하는 경우
parallel dml을 사용할 때는 alter session을 해주어야 하는데,
ALTER SESSION PARALLEL DML ENABLE;
명령어로 해당 옵션을 켜야 한다.
Oracle 12c DB 부터는 /*+ enable parallel_dml */을 통하여 힌트를 통해서도 같은 효과를 낼 수 있다.
병렬처리 할 때,
/*+ parallel */
/*+ parallel(병렬프로세스 수) */
/*+ parallel(테이블, 병렬프로세스 수) */
위 세 개의 힌트로 실행이 가능한데, 병렬프로세스 수를 지정하지 않는 경우, 시스템 디폴트 갯수만큼 기동이 될 수 있다.
이 수는 어느 정도인지 모르기에 안전하게 병렬프로세스 수를 지정하여 사용하자.
'DB > Oracle' 카테고리의 다른 글
| [Oracle] WITH절이란? (기본 사용법부터 재귀적 WITH절까지) (0) | 2025.10.16 |
|---|---|
| [Oracle] EXISTS 란? (0) | 2025.10.16 |
| [Oracle] NVL, DECODE, COALESCE (0) | 2025.10.16 |
| [Oracle] 옵티마이저 힌트 LEADING 과 INDEX_SS (0) | 2025.10.16 |
| [Oracle] INSERT 내부에 SELECT절 (0) | 2025.10.16 |