기본 DML 튜닝

트랜잭션 데이터 저장 과정

IMG_8411.heic

  1. DML 문 수행 시, Redo 로그버퍼에 변경사항을 기록 → Redo 로그도 파일임. Append 방식(버퍼 캐시 사용안함)으로 기록하더라도 디스크 I/O는 느리기 때문에 로그버퍼를 활용
  2. 버퍼블록에서 데이터를 변경함. 물론 버퍼블록에서 블록을 찾지 못하면 데이터파일에서 읽은 작업부터 수행
  3. 커밋
  4. LGWR(Log Writer) 백그라운드 프로세스가 Redo 로그버퍼 내용을 로그파일에 일괄 저장
  5. DBWR(Database Writer) 백그라운드 프로세스가 변경된 버퍼블록들은 데이터 파일에 일괄 저장

DML을 수행할 때마다 Redo 로그를 생성해야 하므로 Redo 로깅은 DML 성능에 영향을 줌 INSERT 작업에 대해 Redo 로깅 생략 기능을 제공하는 이유임

DML을 수행할 때마다 Undo도 생성해야하므로 Undo 로깅은 DML 성능에 영향을 줌 하지만, Undo는 안 남길 수 없으니(MVCC, 롤백, Crash Recovery) 그런 방법(힌트)은 제공하지 않음

Redo는 변경사항 상태를 저장, Undo는 변경사항 전 상태를 저장

Write Ahead Logging → DBWR가 버퍼캐시로 부터 Dirty 블록들을 디스크에 기록하기 전에 먼저 LGWR가 해당 Redo 엔트리를 모두 Redo 로그 파일에 기록했음을 보장(DBWR 보다 LGWR를 먼저)

Log Force at commit → commit이 들어오면 관련 Redo 엔트리를 Redo Log File에 저장한 후 commit 완료

Fast Commit → commit 될때, 메모리의 변경된 내용을 즉시 데이터 파일에 기록하는 것이 아니라, Redo Log Buffer의 정보를 Redo Log File로 기록하고 commit 하는 방식 (데이터 파일 반영은 DBWR로 백그라운드로 처리)

Delayed Block Cleanout → 커밋 시점에 블록 클린아웃을 수행하지 않고, 해당 블록에 접근하는 다른 세션에서 클린아웃을 수행하는 방식 즉, 커밋된 트랜잭션의 정보를 블록에 즉시 반영하지 않고, 필요할 때까지 미루는 것

Free 버퍼 → 비어 있는 상태이거나, 담긴 데이터가 데이터파일과 동기화된 상태여서 언제든지 overwrite 되어도 무방한 블록 Free 상태인 버퍼에 변경이 발생하면 Dirty 버퍼 상태로 바뀜

Dirty 버퍼 → 버퍼에 캐시된 이후 변경이 발생했지만, 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록 다른 데이터 블록을 위해 재사용되려면 디스크에 먼저 기록되어야 함 디스크에 기록되는 순간 Free 버퍼 상태로 바뀜

Pinned 버퍼 → 읽기 또는 쓰기 작업을 위해 현재 엑세스되고 있는 블록을 말함

Checkpoint → 주기적으로 전체 또는 일정량의 Dirty 버퍼를 데이터파일에 기록하는 이벤트 새로운 데이터 블록을 적재할 버퍼캐시 블록을 확보하기 위해 또는 장애 발생 시 복구 기간을 최소화하기 위해

인덱스 및 제약 해제를 통한 DML 튜닝

동시 트랜잭션 없이 대량 데이터를 적재하는 배치 프로그램에서는 이들 기능을 해제함으로써 큰 성능개선 효과를 얻을 수 있음

[PK 제약 및 인덱스]
1. Unique PK 인덱스인 경우
alter table target modify constraint target_pk disable drop index
-- PK 제약 및 PK 인덱스도 함께 drop
-- Unique PK 인덱스는 일반 인덱스처럼 Unusable 상태에서 데이터 입력이 불가능 하므로 인덱스 drop 해주기

alter table target modify constraint target_pk enable NOVALIDATE
-- PK 제약 활성화!
-- PK 인덱스를 활성화하면 drop된 PK 인덱스는 자동으로 생성됨
-- "NOVALIDATE" 옵션은 데이터 무결성 체크를 생략하는 옵션 → 성능개선에 도움됨(무결성 확신이 없다면 데이터 입력전에 쿼리로 확인하면 됨)

2. Non-Unique PK 인덱스인 경우
alter table target modify constraint target_pk disable keep index
-- PK 제약은 비활성화하고, 인덱스는 유지

alter index target_pk unusable 
-- PK 인덱스 비활성화

alter index target_pk rebuild
-- PK 인덱스 재생성

alter table target modify constraint target_pk enable NOVALIDATE
-- PK 제약 활성화
-- "NOVALIDATE" 옵션은 데이터 무결성 체크를 생략하는 옵션

[일반 인덱스]
alter index target_x1 unusable -- 인덱스 비활성화
alter index target_x1 rebuild -- 인덱스 재생성