일반적인 Insert가 느린 이유는
- 데이터를 입력할 수 있는 블록을 Freelist에서 찾는다.
(Freelist란? HWM 아래쪽에 있는 블록중 입력이 가능한 블록에 대한 목록)
(HWM란? High-Water-Mart. 즉, 테이블 데이터가 쌓여있는 가장 높은 영역) - Freelist에서 할당받은 블록을 버퍼캐시에서 찾는다.
- 버퍼캐시에 없으면, 데이터파일에서 읽어 버퍼캐시에 적재한다.
- INSERT 내용을 Undo 세그먼트에 기록한다.
(Undo란? 트랜젝션을 롤백하기 위해 기록한 정보) - INSERT 내용을 Redo 로그에 기록한다.
(Redo란? 트랜젝션을 리커버리 하기위한 정보)
Direct Path Insert 방식이 빠른 이유는
- Freelist를 참조하지 않고 HWM 바깥 영역에 데이터를 순차적으로 입력한다.
- 블록을 버퍼캐에서 탐색하지 않는다.
- 버퍼캐시에 적재하지 않고, 데이터파일에 직접 기록한다.
- Undo 로깅을 안 한다.
(HWM 뒤쪽에 데이터를 순차적으로 입력하기 때문이다. 이 데이터는 커밋하기 전까지 다른 세션이 읽지 않으므로 Redo Consistency를 위해 Undo 데이터를 남기지 않아도 된다.) - Redo 로깅을 안하게 할 수 있다.
(alter table t NOLOGGING;)
Direct Path Insert가 가능한 케이스
- INSERT ··· SELECT문에 append 힌트 사용
- parallel 힌트를 이용해 병렬 모드로 INSERT
- direct 옵션을 지정하고 SQL*Loader(sqlldr)로 데이터 적재 (무슨말일까..)
- CTAS(create table ··· as select) 문 수행
Direct Path Insert시 주의할 점
- 성능은 빨라지지만 Exclusive 모드 TM Lock이 걸린다. 즉, 커밋하기 전까지 다른 트랜잭션은 해당 테이블에 DML을 수행하지 못한다.
- Freelist를 조회하지 않고 HWM 바깥 영역에 입력하므로 테이블에 여유 공간이 있어도 재활용하지 않는다.
'# 데이터베이스 > 오라클' 카테고리의 다른 글
[ORACLE] PL/SQL Autonomous (자율 트랜잭션) (0) | 2024.07.30 |
---|---|
[ORACLE] 21C XE에서 ORA-12543: TNS:수신지 호스트에 도달할 수 없습니다. 오류해결방법 (0) | 2024.07.17 |
[ORACLE] 데이터베이스 CALL이 성능에 미치는 영향 테스트 (0) | 2023.07.26 |
[ORACLE] 월별 누적 매출 예제 (0) | 2023.02.22 |
[ORACLE] emp, dept 테이블 생성 스크립트 (0) | 2023.02.22 |