오라클 UNDO 최소화 및 데이터 저장 전략(ㅇ)
2025. 2. 15. 09:52ㆍIT/Oracle
반응형
UNDO를 최소화하면서 테이블을 하루에 한 번 업데이트, 삭제, 그리고 신규 데이터 삽입으로 현행화를 유지하는 최적화된 방법은 다음과 같습니다. 이 작업을 효율적으로 수행하려면 MERGE 문과 테이블 파티셔닝 또는 임시 테이블을 활용할 수 있습니다.
1. MERGE를 이용한 UPSERT와 DELETE
- 오라클의 MERGE 문은 기존 데이터의 업데이트와 새로운 데이터의 삽입을 한 번의 SQL 문으로 처리할 수 있습니다. 삭제 작업은 별도로 수행합니다.
- 데이터 흐름
1. 임시 테이블 (STAGING_TABLE): 외부에서 데이터를 로드하여 비교의 기준이 되는 임시 테이블.
2. MERGE:
• STAGING_TABLE과 대상 테이블(TARGET_TABLE)을 비교하여 업데이트 및 삽입 처리.
3. DELETE:
• STAGING_TABLE에 없는 데이터는 삭제.
- 구현 방법
-- 임시 테이블에 최신 데이터를 로드
CREATE TABLE STAGING_TABLE AS SELECT * FROM SOURCE_DATA WHERE 1=0;
-- 하루 동안 데이터 로드
INSERT /*+ APPEND */ INTO STAGING_TABLE
SELECT * FROM SOURCE_DATA;
-- MERGE를 사용하여 업데이트 및 삽입 처리
MERGE INTO TARGET_TABLE T
USING STAGING_TABLE S
ON (T.KEY_COLUMN = S.KEY_COLUMN)
WHEN MATCHED THEN
UPDATE SET
T.COLUMN1 = S.COLUMN1,
T.COLUMN2 = S.COLUMN2
-- 필요한 컬럼 업데이트
WHEN NOT MATCHED THEN
INSERT (T.KEY_COLUMN, T.COLUMN1, T.COLUMN2)
VALUES (S.KEY_COLUMN, S.COLUMN1, S.COLUMN2);
-- STAGING_TABLE에 없는 데이터 삭제
DELETE FROM TARGET_TABLE
WHERE NOT EXISTS (
SELECT 1
FROM STAGING_TABLE S
WHERE TARGET_TABLE.KEY_COLUMN = S.KEY_COLUMN
);
-- 임시 테이블 정리
TRUNCATE TABLE STAGING_TABLE;
2. UNDO 최소화 전략
- DIRECT PATH INSERT: INSERT /*+ APPEND */ 힌트를 사용하면 REDO/UNDO를 최소화할 수 있습니다.
- NOLOGGING 옵션: 임시 테이블과 타겟 테이블 모두에 NOLOGGING 옵션을 설정하면 UNDO와 REDO를 줄일 수 있습니다.
- PARALLEL 처리: 대용량 데이터를 처리할 때 PARALLEL 힌트를 사용하여 병렬로 작업 속도를 향상합니다.
3. 테이블 파티셔닝
- 만약 데이터가 크고 일정한 기간에 따라 갱신된다면 파티셔닝을 통해 데이터 관리 효율성을 높일 수 있습니다.
- 파티션 교체 전략
1. STAGING_TABLE에 데이터를 로드.
2. EXCHANGE PARTITION을 사용하여 파티션을 교체.
3. 오래된 파티션은 삭제.
ALTER TABLE TARGET_TABLE
EXCHANGE PARTITION target_partition
WITH TABLE STAGING_TABLE;
4. PL/SQL로 통합 작업 : 위의 논리를 PL/SQL 블록으로 작성하여 스케줄러에서 매일 자동으로 실행할 수 있습니다.
BEGIN
-- 1. STAGING_TABLE 초기화 및 데이터 로드
EXECUTE IMMEDIATE 'TRUNCATE TABLE STAGING_TABLE';
INSERT /*+ APPEND */ INTO STAGING_TABLE
SELECT * FROM SOURCE_DATA;
-- 2. MERGE로 업데이트 및 삽입
MERGE INTO TARGET_TABLE T
USING STAGING_TABLE S
ON (T.KEY_COLUMN = S.KEY_COLUMN)
WHEN MATCHED THEN
UPDATE SET
T.COLUMN1 = S.COLUMN1,
T.COLUMN2 = S.COLUMN2
WHEN NOT MATCHED THEN
INSERT (T.KEY_COLUMN, T.COLUMN1, T.COLUMN2)
VALUES (S.KEY_COLUMN, S.COLUMN1, S.COLUMN2);
-- 3. STAGING_TABLE에 없는 데이터 삭제
DELETE FROM TARGET_TABLE
WHERE NOT EXISTS (
SELECT 1
FROM STAGING_TABLE S
WHERE TARGET_TABLE.KEY_COLUMN = S.KEY_COLUMN
);
-- 4. STAGING_TABLE 정리
EXECUTE IMMEDIATE 'TRUNCATE TABLE STAGING_TABLE';
END;
/
반응형
'IT > Oracle' 카테고리의 다른 글
| PL/SQL Function / Procedure 실행 오류 확인 방법 (0) | 2025.02.15 |
|---|---|
| 정적 SQL(Static SQL)과 동적 SQL(Dynamic SQL) 비교(ㅇ) (0) | 2025.02.15 |
| Bulk Insert (0) | 2025.02.15 |
| Common Table Expression (CTE)(ㅇ) (1) | 2025.02.14 |
| BETWEEN으로 존재하지 않는 파티션 데이터 조회 (1) | 2025.02.14 |