2025. 2. 22. 00:09ㆍIT/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 |