상세 컨텐츠

본문 제목

2024년 2월 7일 1교시

오라클 퍼포먼스 튜닝

by 병아리 엔지니어 2024. 2. 7. 10:40

본문

아래는 블록 헤더에 exclusive 모드로 찍는 것까지 한 이후의 이야기

(execute 단계)

 

래치 : 공유 메모리를 보호하는 개념

락 : 객체 보호

 

★ 트랜잭션 Transaction 처리

 

- 트랜잭션이란: DML 작업을 하나로 묶어서 처리하는 작업 단위

- 트랜잭션이 발생하면

1. 언두 세그먼트 undo segment 를 할당받는다.

    언두 세그먼트를 할당받지 못하면 할당받을 때까지 기다려야 하는데

    이때 발생하는 대기이벤트가 enq: US - contention

2. 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯 만들기

    트랜잭션 테이블 슬롯 = 트랜잭션 정보를 저장하는 곳

    TX slot: 블록 안의 어떤 row 를 트랜잭션 작업해야 하는지 관리

    TX slot 이 어떤 언두 세그먼트를 사용하고 있는지 관리 > 언두 세그먼트도 어디서 트랜잭션 작업이 일어나는지 관리

    (서로 포인팅하고 있다)

    여기서 TXID (Transaction ID) 를 할당받는다.

3. 트랜잭션 대상이 되는 블록을 DBC 에서 찾는다.

    블록 헤더의 ITL (Interested Transaction List) 에 transaction entry 등록

    (ITL = 트랜잭션 슬롯을 만드는 층)

더보기

트랜잭션 슬롯은 테이블 생성시에 결정된다.

 

select * from dba_tables; 에서

init_trans = 동시에 발생할 수 있는 트랜잭션 수의 초기값 (데이터블록에 동시에 접근 가능한 트랜잭션의 초기 수)

트랜잭션이 많지 않은 경우 낭비하게 되므로 굳이 크게 설정할 이유는 없다.

max_trans = 동시에 발생할 수 있는 트랜잭션 수의 최대값

 

    만약 ITL 에 entry 를 등록할 공간이 없다면 > 공간을 확보할 때까지 대기해야 한다.

    이때 발생하는 대기이벤트가 enq: TX - allocate ITL entry

    위의 대기이벤트가 너무 많이 발생하면 > 트랜잭션이 많이 발생하는 테이블을 찾아

    해당 테이블의 블록 헤더 트랜잭션 레이어에 쓰든 안 쓰든 트랜잭션 슬롯 10개 만들기

    > 공간 낭비 가능성 있음 > pct_free 를 10 으로 지정해놓고 transaction slot 이 만들어질 수 있도록 하면 된다.

4. 변경할 블록들의 변경 정보를 PGA 영역에서 change vector 로 만들기

    change vector = 이력 정보 = 보통 3개가 만들어짐

    이 안에는

    - 언두 세그먼트 정보 (change vector 1)

    - 이전 값을 저장해야 할 언두 블록 (change vector 2)

    - 트랜잭션 대상이 되는 블록 (change vector 3)

    가 들어 있다. 이렇게 체인지 벡터를 만들고 나서

    PGA 영역 안에 change vector 정보를 redo entry 라는 이름으로 redo log buffer 로 복사한다.

    이때 redo copy latch, redo allocation latch, redo writing latch 를 획득해야 하는데

    이 과정에서 래치 경합이 발생하면

    latch: redo copy / latch: redo allocation / latch : redo writing 이라는 대기이벤트가 발생한다.

5. 이전 이미지 (이전값) 에 대한 정보를 언두 블록에 기록하고 데이터 블록을 변경한다.

    변경된 블록은 더티 상태가 된다 > 변경된 블록 헤더에 CR(Consistent Read) 표시를 해놓는다.

    (읽기 일관성으로 읽어들여야 하는 블록이라는 뜻)

6. 변경하는 row 에 대해서 lock 을 생성한다. (row level lock)

    다른 유저가 해당 행에 lock 을 걸고 있으면 > 기다려야 한다.

    이때 발생하는 대기이벤트가 enq: TX row lock contention

 

★ commit 을 수행하면

- SCN 번호가 할당된다.

- 커밋 정보를 리두로그 버퍼에 저장한다.

- 언두 세그먼트 헤더의 트랜잭션 테이블에 커밋이 완료되었다는 정보를 저장한다.

- transaction entry 해제, lock 해제

- 리두로그 버퍼의 내용을 리두로그 파일에 기록한다. (LGWR 작업 발생)

 

※ enq: HW - contention 발생

인서트 작업이 물밀듯이 들어올 때, 대량의 데이터가 부어넣어질 때 주로 발생

관련글 더보기