Direct-Path Insert: APPEND·HWM·Undo·Redo·NOLOGGING
Buffer Cache 일반 경로를 우회하는 Direct Path I/O와 HWM 위 적재 방식의 성능·Undo·Redo·공간 특성을 이해합니다.
핵심 요약
Conventional Insert는 Segment 내부의 기존 Free Space를 재사용하고 Buffer Cache의 Block을 변경합니다. Direct-Path Insert는 기존 데이터 뒤쪽에 새 공간을 확보해 Data File에 직접 기록하므로 대량 적재에서 Block 탐색과 Buffer Cache 부담을 줄일 수 있습니다. 다만 모든 Direct Path가 동일한 저장 구조를 사용하지는 않습니다.
- Serial Direct Path: Table 또는 대상 Partition의 HWM 이후에 적재
- Partitioned Parallel Direct Path: PX Server가 배정받은 Partition의 HWM 이후에 적재
- Nonpartitioned Parallel Direct Path: PX Server별 Temporary Segment에 적재한 후
COMMIT시 본 Segment에 병합
APPEND는 INSERT ... SELECT, APPEND_VALUES는 INSERT ... VALUES에 사용하는 Direct-Path Hint입니다. 이 Hint는 Insert 경로를 지시할 뿐 Parallel 실행 여부와 DOP를 결정하지 않습니다. NOLOGGING도 모든 Redo·Undo를 제거하는 옵션이 아니라, 조건을 충족한 Direct-Path Operation의 Data Redo를 줄이는 Object 속성입니다.
학습 목표
- Conventional Insert와 Direct-Path Insert의 공간 사용 방식을 비교한다.
- Serial·Partitioned Parallel·Nonpartitioned Parallel Direct Path의 저장 구조를 구분한다.
APPEND,APPEND_VALUES,NOAPPEND의 적용 문법을 판단한다.- Direct Path 선택과 Parallel DML 활성화·DOP 결정을 분리한다.
- Data 변경과 Metadata 변경의 Undo·Redo 규칙을 설명한다.
NOLOGGING,ARCHIVELOG,FORCE LOGGING의 우선순위를 판단한다.- Trigger·Referential Constraint·Object 유형·Distributed Transaction 제한을 확인한다.
- Index·Lock·공간·Transaction 및 복구 비용을 포함해 전체 적재 전략을 선택한다.
- Oracle AI Database 26ai의 동일 객체 재접근 완화 조건을 설명한다.
- Direct Path 적용 여부를 하나의 지표가 아닌 구간 Delta와 운영 결과로 검증한다.
1. Conventional Insert와 Direct-Path Insert
Conventional Insert
INSERT INTO sales(sale_id, sale_date, amount)
VALUES (1, SYSDATE, 10000);
대표 흐름은 다음과 같습니다.
기존 Segment의 사용 가능한 Block 탐색
→ Buffer Cache에서 Block 변경
→ Table Row 저장
→ Index·Constraint 유지
→ Data·Metadata Undo와 Redo 생성
Conventional Insert는 HWM 아래의 기존 Free Space를 재사용할 수 있고 Direct Path처럼 Table Exclusive Lock을 기본 전제로 하지 않으므로, 소량·빈번한 OLTP Insert와 동시 DML에 일반적으로 적합합니다.
Direct-Path Insert
INSERT /*+ APPEND */ INTO sales
(sale_id, sale_date, amount)
SELECT sale_id, sale_date, amount
FROM sales_stage;
대표 특성은 다음과 같습니다.
- 기존 Data 사이의 Free Space를 재사용하지 않고 새 영역에 적재한다.
- 일반적인 Buffer Cache 경로를 우회해 Data File에 기록한다.
- 대량 적재에서 Row 저장 경로를 단순화할 수 있다.
- Index Maintenance, Metadata 변경, Lock, 추가 공간과 복구 정책은 여전히 필요하다.
- 제한 조건을 위반하면 메시지 없이 Serial Conventional Insert로 전환될 수 있다.
2. 실행 형태별 저장 구조
2.1 Serial Direct Path
현재 Table·Partition HWM 이후 새 Block 확보
→ 데이터 직접 기록
→ Index Maintenance
→ COMMIT 시 HWM 갱신과 가시성 확정
HWM은 아직 Row 저장용으로 Format된 적이 없는 Block 경계를 나타냅니다. Serial Direct Path는 이 경계 이후에 적재하므로 과거 DELETE로 HWM 아래에 생긴 Free Space를 재사용하지 않을 수 있습니다.
2.2 Partitioned Table의 Parallel Direct Path
PX Server는 하나 이상의 Partition을 배정받고, 같은 Partition에는 동시에 둘 이상의 PX Server가 적재하지 않는 구조를 사용합니다. 각 PX Server는 담당 Partition Segment의 HWM 이후에 데이터를 기록하며 COMMIT 시 각 Partition HWM이 갱신됩니다.
2.3 Nonpartitioned Table의 Parallel Direct Path
비파티션 Table에서는 PX Server마다 새 Temporary Segment를 할당해 데이터를 적재합니다. COMMIT 시 PX Coordinator가 Temporary Segment들을 본 Table Segment에 병합합니다.
이 방식은 DOP만큼 Temporary Segment가 필요할 수 있으므로 Serial 또는 Partitioned Parallel Direct Path보다 추가 공간 요구가 커질 수 있습니다.
3. APPEND·APPEND_VALUES·NOAPPEND
3.1 INSERT SELECT: APPEND
INSERT /*+ APPEND */ INTO target_order
SELECT *
FROM source_order;
APPEND는 Subquery 형태의 INSERT ... SELECT에 사용합니다. VALUES 절에 APPEND를 지정하면 Hint가 무시되고 Conventional Insert가 수행됩니다.
3.2 VALUES·FORALL: APPEND_VALUES
INSERT /*+ APPEND_VALUES */ INTO target_order(id, amount)
VALUES (:id, :amount);
대량 OCI Array Bind나 PL/SQL FORALL의 INSERT ... VALUES에서 후보가 됩니다.
FORALL i IN 1 .. l_ids.COUNT
INSERT /*+ APPEND_VALUES */ INTO target_order(id, amount)
VALUES (l_ids(i), l_amounts(i));
APPEND_VALUES를 INSERT ... SELECT에 사용하면 Hint가 무시되고 Conventional Insert가 수행됩니다.
3.3 Parallel Insert를 Conventional로 실행: NOAPPEND
INSERT /*+ PARALLEL(t 8) NOAPPEND */ INTO target_order t
SELECT *
FROM source_order;
Parallel Insert에서는 Direct Path가 기본입니다. NOAPPEND는 Parallel Mode에서도 Conventional Insert를 사용하도록 지시합니다.
| SQL 형태 | 경로 Hint | 핵심 의미 |
|---|---|---|
INSERT ... SELECT | APPEND | Serial Mode에서 Direct Path 요청 |
INSERT ... VALUES | APPEND_VALUES | Values·Array·FORALL Direct Path 요청 |
| Parallel Insert | NOAPPEND | Direct Path 대신 Conventional 경로 요청 |
4. Direct Path와 Parallel은 별도 결정
APPEND와 APPEND_VALUES는 Insert 경로를 결정합니다. Parallel 실행에는 다음 조건을 별도로 확인해야 합니다.
- Session의 Parallel DML Mode 활성화
- Target의
PARALLEL속성, Statement Hint 또는 Auto DOP 등 DOP 근거 - Trigger·Remote Object·Distributed Transaction 등 PDML 제한 통과
- 실제 PX Server 할당과 Downgrade 여부
따라서 APPEND가 있다고 자동으로 Parallel이 되는 것도 아니고, Source Query가 Parallel이라고 Target DML까지 반드시 Parallel인 것도 아닙니다.
5. Undo·Redo 규칙
5.1 Conventional Insert
Conventional Insert는 Table의 Logging 속성, Database의 ARCHIVELOG 여부와 무관하게 Data와 Metadata 변경에 대해 충분한 Undo와 Redo를 생성합니다.
5.2 Direct-Path Insert
Direct Path는 다음처럼 Data와 Metadata를 분리해 이해해야 합니다.
| 구분 | Undo | Redo |
|---|---|---|
| Data 변경 | Data Undo를 우회 | Logging 환경에 따라 생성 여부 결정 |
| Metadata 변경 | Operation Recovery에 필요한 Undo 생성 | Operation Recovery에 필요한 Redo 생성 |
| Index 유지 | Index 구조 변경에 필요한 비용 발생 | Index Logging 속성과 환경의 영향 |
Direct Path에서 Data Undo를 우회한다고 해서 Transaction 상태, Segment·Extent·HWM, Dictionary, Index 관련 Undo·Redo까지 사라지는 것은 아닙니다.
5.3 Data Redo 판단표
| Database 상태 | Table 상태 | Direct-Path Data Redo |
|---|---|---|
NOARCHIVELOG, FORCE LOGGING 아님 | LOGGING 또는 NOLOGGING | 생성하지 않음 |
ARCHIVELOG, FORCE LOGGING 아님 | LOGGING | 생성 |
ARCHIVELOG, FORCE LOGGING 아님 | NOLOGGING | 생성하지 않음 |
FORCE LOGGING 적용 | LOGGING 또는 NOLOGGING | 생성 |
Metadata Redo는 위 Data Redo 표와 별도로 남습니다.
6. NOLOGGING과 복구
ALTER TABLE sales NOLOGGING;
INSERT /*+ APPEND */ INTO sales
SELECT *
FROM sales_stage;
NOLOGGING은 Conventional Insert에 적용되지 않으며, Direct-Path Insert·CTAS·일부 Index 작업처럼 지원되는 Operation에서만 Data Redo를 최소화할 수 있습니다.
Database 또는 Tablespace가 FORCE LOGGING이면 Object의 NOLOGGING은 무시됩니다. Data Redo 없이 기록된 Block은 과거 Backup에서 Media Recovery할 때 완전히 재생되지 않을 수 있으며, Invalidation Redo가 해당 Block 범위를 논리적 손상으로 표시할 수 있습니다.
따라서 NOLOGGING 적재 후에는 다음을 운영 절차에 포함합니다.
- 적재 결과 검증
- Backup 또는 Recovery 가능한 재생성 경로 확보
- Data Guard·Standby 정합성 확인
- Object의 Logging 속성 원복 여부 확인
7. 제한 조건과 Fallback
Direct-Path Insert는 다음과 같은 대표 제한을 가집니다.
- Target에 Trigger가 정의됨
- Target에 Referential Integrity Constraint가 정의됨
- Clustered Table
- 일부 Object Type Column·IOT 구조
- Replicated Table
- Distributed Transaction 또는 Remote Object
제한을 위반하면 별도 오류 메시지 없이 Serial Conventional Insert로 수행될 수 있습니다. 따라서 Hint 존재만으로 Direct Path 적용을 확정하지 않습니다.
8. Lock·가시성·Transaction
Direct Path는 Table 또는 대상 Partition에 Exclusive Lock을 사용할 수 있습니다. 적재 중에는 같은 객체의 동시 INSERT, UPDATE, DELETE와 Index 생성·구축이 제한될 수 있습니다. 동시 Query는 가능하지만 COMMIT 전 새 데이터는 보이지 않고 적재 전 정보만 반환합니다.
전통적으로 같은 Transaction에서 Direct Path로 변경한 객체를 다시 Query하거나 DML하면 ORA-12838이 발생할 수 있으므로 COMMIT 후 재접근해야 했습니다.
Oracle AI Database 26ai에서는 다음 조건을 모두 만족하면 동일 Session에서 Direct Path 이후 같은 Table을 즉시 다시 Query하거나 Conventional DML·추가 Direct Load를 수행할 수 있습니다.
- Heap Table
SEGMENT SPACE MANAGEMENT AUTOTablespaceAUTOALLOCATETablespaceCOMPATIBLE >= 23.0
조건을 하나라도 만족하지 않으면 기존 재접근 제한을 전제로 Test해야 합니다.
9. Index Maintenance
Direct Path도 Usable Index가 있으면 적재 종료 단계에서 Index Maintenance를 수행합니다.
빠른 Data 적재
+ Index Entry 생성·정렬·병합
= 실제 전체 적재 시간
매우 큰 격리 Batch에서는 다음 전략을 비교합니다.
- Index를 유지한 채 Direct Path 적재
- Nonunique Index를 Unusable·Drop한 후 적재하고 Parallel Rebuild
- Partition Exchange로 준비된 Data·Local Index를 전환
Unique Constraint, 온라인 조회 요구, Rebuild 공간·시간, 실패 복구 절차를 함께 비교해야 합니다.
10. 공간과 HWM
Direct Path는 Conventional Insert보다 더 많은 공간을 필요로 할 수 있습니다.
- Serial Direct Path와 Partitioned Parallel Direct Path는 HWM 이후에 적재
- Nonpartitioned Parallel Direct Path는 PX별 Temporary Segment 추가
- 과거
DELETE로 생긴 HWM 아래 Free Space를 재사용하지 않을 수 있음 - 작은 Batch를 반복 APPEND하면 Segment가 지속적으로 커질 수 있음
장기 운영 Table에서는 Partition Drop·Truncate·Exchange, Segment Shrink·Move·재구성 정책을 함께 설계합니다.
11. 실제 적용 여부 검증
11.1 Session 통계 Delta
SELECT n.name, s.value
FROM v$sesstat s
JOIN v$statname n
ON n.statistic# = s.statistic#
WHERE s.sid = SYS_CONTEXT('USERENV', 'SID')
AND n.name IN (
'physical writes direct',
'redo size',
'undo change vector size',
'db block changes'
);
반드시 적재 전·후 값을 저장하여 Delta로 비교합니다.
11.2 함께 측정할 항목
- 경과시간과 Rows/sec
physical writes directDelta- Redo/Row와 Undo/Row
- Segment Bytes·Extent·HWM 증가량
- Index Maintenance·Rebuild 시간
- TM·TX Lock과 동시 DML 영향
- 실제 PDML Mode·DOP·PX Server 할당
- 적재 후 Statistics·Backup·Standby 상태
physical writes direct 하나만 증가했다고 특정 Insert가 APPEND로 수행됐다고 단정하지 않습니다. Direct Write는 다른 Operation에서도 발생할 수 있으므로 SQL 실행 구간을 격리하고 전체 지표를 함께 비교해야 합니다.
12. 혼동하기 쉬운 판단
| 잘못된 판단 | 정확한 기준 |
|---|---|
| APPEND가 있으면 무조건 Direct Path | 문법·제한·실제 통계로 검증 |
| APPEND가 Parallel DOP를 설정 | Insert 경로와 Parallel 결정은 별도 |
| 모든 Parallel Direct Path가 HWM 위에 바로 기록 | 비파티션 Parallel은 PX별 Temporary Segment 후 Commit 시 병합 |
| Direct Path는 Undo가 전혀 없음 | Data Undo는 우회하지만 Metadata·Index·Transaction 비용은 남음 |
| NOLOGGING이면 Redo가 0 | Metadata Redo·Index·FORCE LOGGING·Operation 종류 구분 |
| Direct Path는 Index를 유지하지 않음 | Usable Index는 적재 종료 단계에 유지 |
| Direct Path는 기존 Free Space를 재사용 | 일반적으로 새 영역을 사용해 공간이 증가할 수 있음 |
| 모든 Insert에 APPEND가 유리 | 대량·격리 Batch에서 Lock·공간·복구까지 비교 |
13. 적용 판단 순서
- 적재량과 Online 동시 DML 요구를 확인한다.
- Serial·Partitioned Parallel·Nonpartitioned Parallel 중 실제 저장 구조를 판단한다.
- SQL 형태에 맞는
APPEND또는APPEND_VALUES를 선택한다. - Parallel DML Mode와 DOP 근거를 별도로 확인한다.
- Trigger·Constraint·Object·Distributed Transaction 제한을 검사한다.
- ARCHIVELOG·LOGGING·FORCE LOGGING·Standby·Backup 정책을 확인한다.
- Index 유지와 사후 Rebuild의 전체 시간을 비교한다.
- 공간·HWM·Lock·동일 객체 재접근 제한을 Test한다.
- 구간 Delta와 실제 처리량으로 Direct Path 적용 및 이득을 검증한다.
- 적재 후 Index·Constraint·Statistics·Backup·Logging 속성을 확인한다.
개념 확인 문제
문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.
01Conventional Insert와 Direct-Path Insert의 기존 Free Space 사용 차이는 무엇인가?
Conventional Insert는 HWM 아래 기존 Free Space를 재사용할 수 있지만, Direct Path는 기존 Data 사이의 Free Space를 재사용하지 않고 새 영역에 적재합니다. 따라서 Direct Path는 대량 적재에 유리할 수 있으나 반복 사용 시 Segment 공간 증가를 함께 확인해야 합니다.
02Serial Direct-Path Insert와 Partitioned Parallel Direct-Path Insert는 어느 영역에 데이터를 기록하는가?
Serial Direct Path는 Table 또는 대상 Partition의 HWM 이후에, Partitioned Parallel Direct Path는 각 PX Server가 담당하는 Partition Segment의 HWM 이후에 기록합니다. 두 방식 모두 COMMIT 시 HWM 갱신과 데이터 가시성이 확정됩니다.
03Nonpartitioned Table의 Parallel Direct-Path Insert는 PX별 데이터를 어떻게 저장하고 확정하는가?
각 PX Server가 별도의 Temporary Segment에 적재하고, COMMIT 시 PX Coordinator가 Temporary Segment들을 본 Table Segment에 병합합니다. 이 때문에 비파티션 Parallel Direct Path는 추가 공간 요구가 더 커질 수 있습니다.
04APPEND, APPENDVALUES, NOAPPEND의 적용 SQL 형태는 무엇인가?
APPEND는 INSERT ... SELECT, APPEND_VALUES는 INSERT ... VALUES·Array Bind·FORALL, NOAPPEND는 Parallel Insert를 Conventional 경로로 수행할 때 사용합니다. 문법이 맞지 않으면 Hint가 무시될 수 있습니다.
05APPEND Hint와 Parallel DML 활성화·DOP 결정은 왜 분리해서 봐야 하는가?
APPEND는 Insert 경로만 지시하고 Parallel 여부와 DOP는 PDML Mode, Target 속성·Hint·Auto DOP, 제한 조건, PX 할당으로 별도 결정되기 때문입니다. Source Query의 병렬화와 Target 변경의 병렬화도 독립적입니다.
06Direct-Path Insert의 Data 변경과 Metadata 변경은 Undo·Redo 측면에서 어떻게 다른가?
Direct Path는 Data 변경의 Undo를 우회하지만, Segment·Extent·HWM·Dictionary 같은 Metadata 변경에는 Operation Recovery를 위한 Undo와 Redo가 생성됩니다. Index Maintenance와 Transaction 상태 비용도 남습니다.
07ARCHIVELOG, Object의 LOGGING·NOLOGGING, FORCE LOGGING은 Data Redo를 어떻게 결정하는가?
NOARCHIVELOG이며 FORCE LOGGING이 아니면 Table Logging 속성과 관계없이 Direct-Path Data Redo가 생성되지 않습니다. ARCHIVELOG이며 FORCE LOGGING이 아니면 LOGGING Table은 생성하고 NOLOGGING Table은 생성하지 않습니다. FORCE LOGGING이 적용되면 LOGGING·NOLOGGING 모두 Data Redo를 생성합니다. Metadata Redo는 별도로 남습니다.
08Direct-Path Insert 제한을 위반했을 때 발생할 수 있는 Fallback은 무엇인가?
대표적으로 메시지 없이 Serial Conventional Insert로 전환될 수 있습니다. Trigger, Referential Constraint, Clustered Table, 일부 Object·IOT 구조, Replication, Distributed Transaction 등의 제한을 사전에 확인해야 합니다.
09Oracle AI Database 26ai에서 Direct Path 이후 동일 Table 재접근 제한이 완화되는 네 조건은 무엇인가?
Heap Table, SEGMENT SPACE MANAGEMENT AUTO, AUTOALLOCATE Tablespace, COMPATIBLE >= 23.0입니다. 네 조건을 모두 만족해야 동일 Session의 즉시 Query·Conventional DML·추가 Direct Load 제한이 완화됩니다.
10Direct Path 적용 여부를 검증할 때 physical writes direct 외에 함께 비교할 항목은 무엇인가?
경과시간·Rows/sec, Redo·Undo Delta, Segment Bytes·HWM·Extent 증가, Index Maintenance 시간, Lock 대기, 실제 PDML·DOP·PX 할당, 적재 후 Statistics·Backup·Standby 상태를 함께 비교합니다. physical writes direct 하나만으로는 특정 SQL의 APPEND 적용을 확정할 수 없습니다.