오라클 인덱스 없는 테이블에 빠른 데이터 저장 방법

2025. 2. 22. 00:09IT/Oracle

인덱스가 없는 테이블에 데이터를 빠르게 삽입하는 방법은 테이블 구조와 데이터 삽입 방식에 따라 달라질 수 있습니다. 다음은 일반적으로 적용할 수 있는 성능 최적화 방법들입니다


1. Direct-Path Insert 사용
  • Direct-Path Insert는 데이터를 테이블의 기존 데이터 영역이 아닌 새로운 데이터 블록에 직접 기록합니다.
  • 이를 통해 REDO/UNDO 로그를 최소화하고 삽입 속도를 크게 향상시킬 수 있습니다.

INSERT /*+ APPEND */ INTO 테이블명
SELECT ...
FROM ...

 

  • 특징
    - 데이터를 데이터 블록에 직접 삽입하여 성능이 크게 향상됩니다.
    - 데이터가 테이블에 추가되기 때문에 테이블이 NOLOGGING 상태일 경우 REDO 로그를 최소화할 수 있습니다.
  • 주의
    - Direct-Path Insert는 COMMIT 이전에 기존 데이터를 조회할 수 없습니다.
    - 테이블에 NOLOGGING 설정을 적용하여 성능을 더욱 향상시킬 수 있지만, 데이터 복구가 어려워질 수 있습니다.



2. NOLOGGING 설정
  • NOLOGGING 옵션을 활성화하면 삽입 시 REDO 로그 생성을 최소화하여 성능을 높일 수 있습니다.

ALTER TABLE 테이블명 NOLOGGING;

  • 삽입 후 LOGGING 복구

ALTER TABLE 테이블명 LOGGING;

  • 주의 : 데이터가 손실될 가능성이 있으므로, 이 옵션은 백업 가능한 환경에서 사용하는 것이 좋습니다.


3. 대량 데이터 삽입 시 병렬 처리
  • Oracle의 병렬 처리 기능을 활용하여 데이터를 병렬로 삽입하면 삽입 속도를 크게 향상시킬 수 있습니다.

INSERT /*+ APPEND PARALLEL(테이블명, 4) */ INTO 테이블명
SELECT ...
FROM ...

  • 병렬 설정

ALTER SESSION ENABLE PARALLEL DML;

  • 주의 : 병렬 작업은 시스템 리소스를 많이 소모하므로, 서버 환경과 워크로드를 고려해야 합니다.


 4. UNDO 영역 최소화
  • 삽입 데이터가 매우 큰 경우, UNDO 테이블스페이스가 가득 차는 것을 방지하기 위해 삽입 작업을 배치로 나누는 것이 유리합니다.

BEGIN
    FOR i IN 1..1000 LOOP
        INSERT INTO 테이블명 (컬럼1, 컬럼2)
        SELECT 컬럼1, 컬럼2
        FROM 원본테이블
        WHERE ROWNUM <= 10000; -- 한 번에 10,000 행씩 처리
        COMMIT;
    END LOOP;
END;

  • 주의 : 데이터가 매우 클 경우 COMMIT을 자주 호출하여 UNDO 공간 사용량을 줄입니다.


5. 제약 조건 비활성화
  • 데이터 삽입 속도를 높이기 위해 테이블에 있는 제약 조건을 임시로 비활성화할 수 있습니다.
  • 제약 조건 비활성화

ALTER TABLE 테이블명 DISABLE CONSTRAINT 제약조건명;

  • 삽입 완료 후 다시 활성화

ALTER TABLE 테이블명 ENABLE CONSTRAINT 제약조건명;

  • 주의 : 제약 조건을 다시 활성화하면 데이터 무결성 검사를 수행하므로 시간이 더 걸릴 수 있습니다.


6. 테이블 파티셔닝 활용
  • 대량 데이터를 삽입할 경우, 데이터를 파티션별로 나누어 삽입하면 성능을 향상시킬 수 있습니다.
  • 파티션 삽입

INSERT INTO 테이블명 PARTITION (파티션명)
SELECT ...
FROM ...

  • 장점 : 특정 파티션에만 데이터를 삽입하므로 데이터 삽입과 관련된 병목현상을 줄입니다.


7. Index와 Constraints를 나중에 생성
  • 테이블에 인덱스나 제약 조건이 없는 상태에 데이터를 삽입한 뒤, 필요한 인덱스와 제약 조건을 생성하면 삽입 속도를 크게 향상가능

DROP INDEX 인덱스명;

  • 데이터 삽입 후 인덱스 재생성

CREATE INDEX 인덱스명 ON 테이블명(컬럼명);

8. 외부 테이블(External Table) 사용
  • Oracle의 외부 테이블 기능을 사용하면 데이터를 디스크에서 직접 읽어 빠르게 로드할 수 있습니다.
  • 외부 테이블 생성

CREATE TABLE 외부테이블명 (
    컬럼1 데이터타입,
    컬럼2 데이터타입
)
ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY 디렉토리명
    ACCESS PARAMETERS (
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    )
    LOCATION ('datafile.csv')
);

  • 데이터 삽입

INSERT INTO 테이블명
SELECT *
FROM 외부테이블명;

9. SQL*Loader 또는 Oracle Data Pump 사용
  • Oracle의 데이터 로딩 도구를 사용하면 대량 데이터를 테이블에 빠르게 삽입할 수 있습니다.
  • SQL*Loader : 데이터 파일을 기반으로 대량 데이터를 로드합니다.

sqlldr username/password control=control_file.ctl

  • Oracle Data Pump : 데이터 덤프 파일을 통해 대량 데이터를 로드합니다.

impdp username/password dumpfile=dump_file.dmp table=테이블명
반응형

'IT > Oracle' 카테고리의 다른 글

오라클 enq: RO - fast object reuse 락  (0) 2025.02.23
GROUP BY를 사용 시 성능과 효율성 향상 방안  (0) 2025.02.22
CONCAT 함수의 인덱스 수행 여부  (0) 2025.02.22
유형별 락(Lock)  (2) 2025.02.20
DBMS_JOB 모니터링  (3) 2025.02.19