[ 트랜잭션 데이터 저장 과정 ]
1. DML 문을 실행하면 Redo 로그버퍼에 변경사항을 기록한다.
2. 버퍼블록에서 데이터를 변경(추가/수정/삭제)한다. 물론 버퍼캐시에서 블록을 찾지 못하면 데이터파일에서 읽ㄴㄴ 작업부터 한다.
3. 커밋한다.
4. LGWR 프로세스가 Redo 로그 버퍼 내용을 로그 파일에 일괄 저장한다.
5. DBWR 프로세스가 변경된 버퍼블록들은 데이터파일에 일괄 저장한다.
DBWR : 버퍼 캐시에 변경된 페이지( 더티 페이지 )를 일정한 주기 혹은 버퍼 캐시가 가득찰 경우에 데이터 페이지를 데이터블록에 기록함.
LGWR : 로그 버퍼에 기록된 쿼리 실행이력을 일정한 주기, 로그 버퍼가 가득찼을 경우에 파일로 기록함.
[ Direct Path I/O ]
버퍼 캐시를 경유하지 않고 DBWR을 통해 데이터 블록에 데이터를 읽고 쓰기가 가능한 기능.
Direct Path I/O가 성능에 좋은 이유 ( 물론, 모든 경우에 좋은 것은 아니지만 대량의 데이터를 블록에 쓰거나 읽을때 좋은 성능을 보임 )
Insert 예시
1. 데이터를 입력할 수 있는 블록을 Freelist에서 찾는다.
2. Freelist에 할당받은 블록을 버퍼캐시에서 찾음
3. 버퍼캐시에 없으면 데이터파일을 읽어 버퍼캐시에 적재
4. insert 내용을 undo 세그먼트에 기록
5. insert 내용을 redo로그에 기록.
>> freelist를 거치면서 기존에 가득차지 않은 블록들에 데이터를 기록함.
Direct Path insert : freelist를 거치지 않고 새로운 블록을 만들어서 기록함. 1~3번 단계가 불필요함.
Freelist : 페이지가 가득차지 않은 블록을 리스트 형태로 가지고 있음.
[ Delete 쿼리가 일어나는 과정 ]
1. 테이블 레코드 삭제
2. 테이블 레코드 삭제에 대한 undo logging
3. 테이블 레코드 삭제에 대한 redo logging
4. 인덱스 레코드 삭제
5. 인덱스 레코드 삭제에 대한 undo logging
6. 인덱스 레코드 삭제에 대한 redo logging
7. undo에 대한 redo logging
==============================================
똑같은거 계속 보니까 이제 좀 이해가 된다. 역시 한번보고 이해하면 말이 안되고 계속 반복해서 공부하는게 답인듯.
뭔가 처음 책읽을때는 큰 도화지에 스케치하는 느낌이고, 2번째가 선그리고, 3번째부터가 색입히고 부족한 부분 매꿔가는 느낌
'데이터베이스' 카테고리의 다른 글
실행 계획과 인덱스 다이브 (0) | 2023.10.07 |
---|---|
계층 쿼리 (0) | 2023.10.03 |
SQL 튜닝과 조인 (0) | 2023.06.24 |
jdbc 탐구하기 (0) | 2023.06.18 |
postgresql의 운영에 필요한 테이블과 wait event (1) | 2023.06.11 |