INSERT SELECT 성능 개선 기본 전략(ㅇ)

2025. 2. 13. 00:03IT/Oracle

반응형

(1) 병렬 처리 (Parallel DML) 활성화

  • 대량 데이터를 삽입할 때는 병렬 처리를 활성화하여 작업을 분산시킬 수 있습니다.
  • 병렬 DML 활성화
ALTER SESSION ENABLE PARALLEL DML;
  • INSERT 문에 병렬 힌트 추가
INSERT /*+ APPEND PARALLEL(A, 4) */ INTO partitioned_table PARTITION (partition_name)
SELECT /*+ PARALLEL(B, 4) */ *
FROM source_table B;

(2) APPEND 힌트 사용

  • APPEND 힌트를 사용하면 데이터를 직접 테이블의 HWM(High Water Mark) 아래에 추가하므로 로그 생성량을 줄이고 삽입 속도를 크게 향상시킵니다.
INSERT /*+ APPEND */ INTO partitioned_table
SELECT ...
FROM source_table;
  • 주의: APPEND 힌트를 사용할 경우, 테이블이 NOLOGGING 모드로 설정되어 있어야 최대 성능을 낼 수 있습니다.

파티션 테이블 삽입 시 고려 사항

(1) 파티션 키를 효율적으로 사용

  • INSERT SELECT에서 파티션 키가 명확하게 지정되어 있으면 성능이 크게 향상됩니다. 데이터베이스가 파티션 위치를 미리 결정할 수 있기 때문입니다.
INSERT /*+ APPEND PARALLEL(A, 4) */ INTO partitioned_table PARTITION (partition_name)
SELECT ...
FROM source_table
WHERE partition_column = 'specific_partition_value';

(2) 동적 파티션 (Dynamic Partitioning)

  • 만약 삽입되는 데이터가 여러 파티션으로 나뉜다면, 동적 파티션 삽입을 사용해 파티션을 자동으로 할당할 수 있습니다.
INSERT /*+ APPEND PARALLEL(A, 4) */ INTO partitioned_table
PARTITION (partition_column)
SELECT ...
FROM source_table;
  • 주의: 동적 파티션 삽입은 파티션이 많을수록 오버헤드가 발생할 수 있으므로, 병렬 처리를 추가적으로 활용하세요.

원본 데이터 최적화

(1) 원본 데이터 필터링

  • 필요한 데이터만 삽입하도록 원본 데이터를 사전에 필터링하여 삽입 시간을 줄입니다.
SELECT /*+ PARALLEL(B, 4) */ *
FROM source_table B
WHERE created_date >= SYSDATE - 7;

(2) 중복 제거

  • 삽입 전에 중복 데이터를 제거하면 성능이 개선됩니다.
SELECT DISTINCT /*+ PARALLEL(B, 4) */ *
FROM source_table B;

 

파티션 테이블 성능 향상

(1) NOLOGGING 모드 활성화

  • 파티션 테이블을 NOLOGGING 모드로 설정하면 REDO 로그 생성을 최소화하여 삽입 성능을 향상시킬 수 있습니다.
ALTER TABLE partitioned_table NOLOGGING;

(2) 병렬 파티션 처리

  • 각 파티션에 대해 병렬 처리를 수행하여 성능을 극대화합니다.
INSERT /*+ APPEND PARALLEL(A, 4) */ INTO partitioned_table PARTITION (partition_name)
SELECT /*+ PARALLEL(B, 4) */ *
FROM source_table B;

 

임시 테이블 사용

  • 대량 데이터를 한 번에 삽입하지 않고, 임시 테이블에 데이터를 처리한 후 최종 삽입하면 성능이 개선될 수 있습니다.
CREATE GLOBAL TEMPORARY TABLE temp_table AS
SELECT /*+ PARALLEL(B, 4) */ *
FROM source_table B;

INSERT /*+ APPEND PARALLEL(A, 4) */ INTO partitioned_table
SELECT *
FROM temp_table;
반응형