문서유형ㅣ기술정보
분야ㅣ관리/환경설정
적용제품버전ㅣ-
문서번호ㅣTADTI201
개요
DML FLow
DML 이란?
- DML(Data Manipulation Language)의 약자
- 데이터 조작어 / 데이터베이스에 저장된 데이터를 실질적으로 처리하는데 사용하는 언어입니다.
- Insert/Delete/Update 가 있습니다.
방법
세부 순서
Shared Cache 조회 및 Execution Plan 확인
Library cache 조회하여 동일한 SQL 문장이 있는지 확인 과정이 진행됩니다.(문자,공백,대소문자까지 비교합니다)
Y(동일 SQL 문장 존재) : Soft Parsing 동작(library cache에서 parse-tree와 query execution plan을 가져와서 수행합니다.)
N(동일 SQL 문장 미존재) : Hard Parsing 동작(새로운 parse-tree를 만들고 optimizer가 execution plan을 결정 수행 및 library cache에 이를 저장합니다.)
Undo Segment 확보
Undo Segment 구성
Undo Header(트랜잭션의 정보가 저장됩니다) + Undo Record(실제 트랜잭션의 변경사항이 저장됩니다)
Undo Header에 저장되는 트랜잭션 정보는 트랜잭션의 ID값, 상태, 트랜잭션에 대한 Undo의 Block 주소값을 가집니다.
Undo 확보 과정
- 현재의 Undo Segment에서 Undo Retention(Undo 보관주기)이 지난 영역이 사용되게 됩니다.(파라미타로 보관주기 변경 가능)
- 위의 단계를 3번까지 내부적으로 재시도를 하게 됩니다.(Online 영역 사용 호출)
- 위 단계에서 Online 영역이 확보되지 않는다면 Offline Undo Segment를 Online으로 하여 사용합니다.(파일크기 증가대신 비활성화 영역을 활성화)
- 위 단계에서 할당할 영역을 확보하지 못하였다면 임의의 다른 Undo Segment를 가져옵니다.(USGMT_STEAL_IGNORE_RETENTION=Y 로 설정되었다면 보관주기를 지나지 않은 영역을 가져와 사용합니다. 해당 파라미타는 7.2.4 버전부터 공개 파라미타로 변경되었습니다.)
- 위 과정에서 확보할 영역이 없으면 File 크기를 증가(Extend) 후 Undo Segment영역을 확장합니다.
Buffer Cache에서 Block의 존재 여부 확인
Free Buffer 확인
실제 데이터 변경 전 Free Buffer를 먼저 찾게 됩니다.
해당 Buffer에 Lock을 걸고 이후 Data File에서 변경하려는 Block을 복사합니다.
DBMS에서는 읽으려는 Block을 우선 Buffer Cache에서 찾은 후 없다면 Disk에서 읽어 Buffer Cache에 적재 및 읽기/쓰기 작업을 수행합니다.
관련 파라미타로 DB_CACHE_SIZE(버퍼 캐시 사이즈 조정)이 있습니다.
Redo Buffer에 적용
Redo Buffer에서 변경/입력/삭제
DML에 따른 변화는 버퍼캐시 이전에 Redo Buffer에 저장되며 해당 버퍼를 통하여 Redo Log File에 저장됩니다.
Instance 장애가 발생하면 로그 파일에 기록된 내용을 재현하여 Cache Block을 복구하며 커밋되지 않은 트랜잭션은 롤백하게 됩니다.
Undo Segment에 이전 값 저장
Undo Segment에 트랜잭션 이전 값을 저장
위 단계에서 Redo Log Buffer에 트랜잭션에 필요한 내용이 저장되었다면 3단계에서 확보된 Undo Segment에 변경 전 값이 기록됩니다.
이는 트랜잭션의 필요에 따른 롤백 및 읽기 일관성 유지, 트랜잭션 복구등에 사용됩니다.
Data Buffer 저장
Data Buffer에 변경 값 저장
DB Buffer Cache에 변경된 데이터 값을 저장합니다.
해당 동작으로 DB Buffer Cache에 트랜잭션 요청 값으로 변경되어 저장됩니다.
트랜잭션 종료
최종 변경값 확정(commit) 및 트랜잭션 종료
- commit을 하면 TSN(Tibero System Number : 데이터베이스 버전 또는 commit 버전, 트랜잭션이 commit될때 생성 및 적용됩니다) 및 commit 기록을 Redo Buffer에 기록됩니다.
- LGWR은 Redo Buffer에 있는 변경 내역을 Redo Log file에 기록하게 됩니다.
- Undo에는 Undo Segment 헤더에 있는 트랜잭션 테이블에 commit 정보가 저장됩니다.
- DB Buffer Cache에 있는 값을 DBWR이 Data file의 Block에 쓰게되며 이를 CheckPoint라 합니다.(메모리에 있는 값을 이제 실제 Datafile에 적용 완료)
- 해당 과정에서 데이터가 이미 할당된 이후에 다시 데이터가 수정되었으나, 아직 disk 상의 data file에 write 되지 못한 buffer block을 Dirty Buffer라고 하며 일정 수준 이상의 Dirty buffer가 쌓이거나 사용자가 checkpoint 구문을 사용하여 바로 Data file에 write하도록 할 수 있습니다.(일정이상 쌓인 후 하는 이유는 너무 반복적인 Blcok I/O 발생시 I/O 성능이 문제가 될 수 있어 그렇습니다)
추가 설명
Commit 전 타 Session의 Query 수행시
읽기 일관성을 유지하게 됩니다.(트랜잭션 중 Session의 값은 변경 후 값이 보이나 타 Session에서 조회시는 기존 값으로 보입니다 : Read Consistency)
Select 시점에 Query 시점에 대한 TSN을 부여하고 조회하고자 하는 Block의 TSN을 비교하여 일관성을 유지하게 됩니다.(물론, commit후에는 변경된 값으로 확인)