p397) 인덱스가 삭제된 이후 생성되었기 때문에 update문 실행계획 cost가 2인 것인지?
p399) truncate, delete 둘 다 redo 파일에 기록되는지?
p401) DML이 이루어 질 때마다 Redo, Undo 둘 다 기록되는 것인지?
TRUNCATE 의 경우 로그가 남지 않음 > DDL이므로 AUTO-COMMIT이 적용되기 때문에 COMMIT 관계없이 바로 비워짐
p402) MVCC모델을 사용하는 오라클의 2가지 모드: Consistent모드, Current모드
Current모드는 디스크에서 캐시로 적재된 원본 블록을 현재 상태 그대로 읽는 방식
Consistent모드는 쿼리가 시작된 이후에 다른 트랜잭션에 의해 변경된 블록을 만나면 원본 블록으루부터 복사본 블록을 만들고, 거기에 Undo 데이터를 적용함으로써 쿼리가 ‘시작된 시점’으로 되돌려서 읽는 방식
자세한 내용은 ‘오라클 성능 고도화 원리와 해법’ 1권에 나옴
p404) Lock LEVEL: 처음엔 로우 레벨을 사용하다가 LOCK 설정 대상이 많아지면 점점 레벨을 올림 ⇒ Lock Escalation 이라고 부르는데, Oracle은 사용하지 않음
로우 레벨
블록 레벨
익스텐트 레벨
테이블 레벨
p405) DML이 Lock에 의해 블로킹된 경우, 커밋은 DML 성능과 직결된다
DB버퍼캐시
Redo 로그버퍼
p406)트랜잭션 데이터 저장 과정 순서를 알아야 머리에 잘 들어올 듯
DML 문을 실행하면 Redo 로그버퍼 내용을 로그파일에 일괄 저장
오라클은 DML 전 항상 로그부터 기록함
버퍼블록에서 데이터를 변경(레코드 추가/수정/삭제)한다. 물론, 버퍼캐시에서 블록을 찾지 못하면, 데이터파일에서 읽는 작업부터 한다.
커밋한다.
LGWR 프로세스가 Redo 로그버퍼 내용을 로그파일에 일괄 저장한다.
Redo 로그를 기록하는 작업은 디스크 I/O 작업이다.
DBWR 프로세스가 변경된 버퍼블록들은 데이터 파일에 일괄 저장한다.
커밋을 하지 않아도 문제, 자주 해도 문제
오랫동안 커밋하지 않고, 데이터를 계속 갱신하면 Undo 공간이 부족해져 시스템 장애 상황을 발생할 수 있음
루프를 돌면서 건건마다 모두 커밋한다면, 프로그램 자체 성능이 느려짐 > 불필요한 커밋
****DBWR, LGWR 에 대한 자세한 설명
DBWR (Database Writer):
DBWR는 데이터베이스의 버퍼 캐시에서 변경된 블록들을 디스크에 기록하는 역할을 담당합니다.
주요 역할은 디스크의 데이터 파일에 변경된 블록들을 일괄적으로 기록하여 데이터 일관성과 내구성을 보장하는 것입니다.
DBWR는 블록이 변경되거나 데이터베이스 버퍼 캐시에 공간이 부족해지면 해당 블록을 디스크에 쓰기 위해 작동합니다.
변경된 블록은 먼저 더티(Dirty) 상태로 마킹되고, DBWR은 이러한 더티 블록들을 비동기적으로 디스크에 기록합니다.
LGWR (Log Writer):
LGWR은 로그 버퍼의 내용을 디스크의 리도 로그 파일에 기록하는 역할을 수행합니다.
로그 버퍼에는 데이터베이스에서 수행된 모든 변경 작업이 기록되어 있으며, 이를 장애 복구와 데이터 일관성을 보장하는 데 사용됩니다.
LGWR은 트랜잭션이 커밋될 때마다 변경된 내용을 로그 버퍼에 기록하고, 주기적으로 로그 파일에 비동기적으로 기록합니다.
로그 파일에는 변경 작업의 세부 정보와 이전 상태로의 롤백에 필요한 정보가 포함되어 있습니다.
LGWR은 데이터베이스에 대한 지속적인 변경 작업을 보장하며, 성능을 향상시키기 위해 로그를 그룹으로 묶어 일괄 처리합니다.
p407) 중간 문단에 ‘서버 프로세스가 변경한 버퍼블록들을 디스크에 기록하지 않았더라도 커밋 시점에 Redo로 그를 디스크에 안전하게 기록했다면’ 의 뜻은 “DBWR가 Dirty블록들을 기록하지 않았어도, LGWR가 Redo 로그버퍼에 로그파일을 기록했다면” 이라는 말인가?
p409)DB Call
SQL은 세 단계로 나누어 실행
Parse Call
Execute Call
Fetch Call
Call 발생 경우에 따라 2가지로 나뉨, 어떤 Call이든 위 세 단계를 거침
User Call
DBMS 외부로부터 인입되는 Call
Recursive Call
DBMS 내부로부터 발생하는 Call
p418) 인덱스와 무결성 제약 조건을 DML 성능에 큰 영향을 끼침 > 대량 데이터를 적재하는 배치프로그램에서 큰 성능 개선 효과를 얻을 수 있음
아래의 케이스 실습해보기
PK+Unique Index 있는 경우
PK+Non Unique Index
p437) 오라클은 버퍼캐시를 경유하지 않고 곧바로 데이터 블록을 읽고 쓸 수 있는 Direct Path I/O 기능을 제공함
작동하는 경우 6가지(첫번째~세번째 가 가장 중요하고 활용도 높음)
병렬 쿼리로 Full Scan 을 수행할 때
병렬 DML을 수행할 때
Direct Path Insert를 수행할 때
Temp 세그먼트 블록들을 읽고 쓸 때
direct 옵션을 지정하고, export를 수행할 때
nocache 옵션을 지정한 LOB 컬럼을 읽을 때
p443)병렬DML 작업을 각 병렬 프로세스가 처리하는지, 아니면 QC(Query Coordinator)가 처리하는지 실행계획에서 확인 가능 > QC에 대해 별도로 찾아보는 것 필요!
‘PX COORDINATOR’ 아래쪽에 DML 명령문이 있다면 각 병렬 프로세스가 처리
‘PX COORDINATOR’ 위쪽에 DML 명령문이 있다면 QC가 처리
p446)파티션
테이블 파티션
Range 파티션
해시 파티션
리스트 파티션
인덱스 파티션
로컬 파티션 인덱스
글로벌 파티션 인덱스
비파티션 인덱스 (=글로벌 비파티션 인덱스)
일반적으로 생성하여 사용하는 인덱스
로컬 비파티션 인덱스는 존재하지 않는다는 뜻??
p453) 테이블 파티션 구성이 변경되면, 물리적인 적재 장소가 바뀌어서 비파티션 인덱스가 비활성화 처리 된다는 뜻? row의 DBA가 바뀌는것?
p453) 글로벌 파티션 인덱스는 항상 Prefixed 인덱스
p456)온라인 상태로 파티션 구조를 빠르게 변경하려면 모든 인덱스가 로컬 파티션 인덱스여야 한다. >> 글로벌 인덱스가 하나라도 있으면 얼마나 느려질지?