3. 버퍼 Lock
2010.05.24 02:11
1. 버퍼 Lock 이란? - 자신이 현재 그 버퍼를 사용 중임을 표시 (버퍼 헤더에 Pin 설정)
- 두 개 이상의 프로세스가 동시에 버퍼 내용을 읽고 쓴다면 문제가 발생
- 캐쉬된 버퍼 블록을 읽거나 변경하려는 프로세스는 버퍼헤더로부터 버퍼 Lock 획득
- 버퍼 Lock 획득 후 래치 해제 → 다른 안정장치(버퍼Lock) 획득으로 안심하고 블록 Read/Write
- 모드
- Share 모드 : 버퍼 내용을 읽기만 할 때 사용
- Exclusive 모드 : 버퍼 내용을 변경 할 때 사용 (Exclusive Lock 은 한 시점에 하나의 프로세스만 얻음)
- 래치 획득후 다른 프로세스가 Exclusive 모드의 버퍼 Lock 으로 내용 갱신 중일 시
- 버퍼 헤더에 있는 버퍼 Lock 대기자
목록(Waiter List)에 등록 후 래치 해제
- 버퍼 Lock 대기자 목록에 등록되어 있는 동안 Buffer busy waits 대기 이벤트 발생
- 사용 중인 버퍼 Lock가 해제되면 대기자 목록의 프로세스가 버퍼 Lock 획득 후 작업 진행
- 작업 완료 후 체인 래치를 재 획득 (버퍼 헤더 액세스 시 다른 프로세스와 충돌 방지)
- 버퍼 Lock 해제
- 래치 해제
- 참 고
- 조나단 루이스 曰
- 버퍼 블록 읽을 시 대부분 두 번의 래치 획득 - 버퍼를 찾아 Pin / Pin 해제
- 몇몇 오퍼레이션에서는 래치를 쥔 채 버퍼 블록 읽어 한 번의 래치 획득
- v$sysstat 뷰에서 consistent gets - examination 통계항목에서 측정
2. 버퍼 핸들 - 버퍼 헤더에 Pin을 설정하려고 사용하는
오브젝트 ? * 버퍼
Pin: 버퍼 Lock의 다른말 (Pined 버퍼) - 변경 시(Exclusive 모드) 하나의 프로세스만 Pin 설정
가능 - 읽기 시(Share 모드) 여러 개 프로세스 동시 Pin 설정 가능
3. 버퍼 Lock의 필요성
- 사용자 데이터 변경 시 DML Lock과 다른 Lock 획득
∵ 하나의 레코드 갱신도 블록 단위로 I/O를 수행
- 필요성
- 값 변경 전 레코드에 로우 단위로 Lock 설정 (레코드의 속성 변경 작업)
- 두 개의 프로세스가 동시에 로우 단위 Lock을 설정하려고 할 시 문제 발생
- 블 록 SCN 변경 또는 ITL 슬롯에 변경을 가하는 블록 헤더 내용 변경 작업이 동시에 발생 할 시
- Lost Update 문제가 생겨 블록 자체의 정합성이 깨짐
- 참고
- Pined 버퍼 블록의 버퍼 캐시 전체가 비워지지 않음
- 9i 에서는 비공식적으로 버커 캐시가 지워짐
4. 버퍼 Pinning - 버퍼 읽기 후 버퍼 Pin을 바로 해제하지 않고 데이터 베이스 Call 진행동안 유지
모든 버퍼 블록에 버퍼 Pinning을 적용하지 않고 같은 블록을 재방문할 가능성이 큰 몇몇 오퍼레이션 수행 시 사용 v$sysstat. v$sesstat,
v$mystat 등 조회, 래치 획득 과정을 통해 블록 액세스
시 session logical reads 항목 증가 래치 획득 과정
없이 버퍼 Pinning을 통해 블록을 곧바로 액세스 시 buffer is prinned count 항목 수치 증가 ☞ Index Range Scan 시 인덱스와 테이블 블록 교차 방문 시 블록 I/O 체크 시 테이블 블록 I/O만 계속 증가 - 클러스터링 팩터가 좋다 = 인덱스 레코드가
가리키는 테이블 rowid 정렬 순서가 인덱스 키 값 정렬 순서와 거의 일치 ☞ 클러스터링 팩터가 좋을 수록 논리적 블록 읽기 횟수가 적게 나타남 - 오라클 버전이 올라갈 수록 버퍼 Pinning 적용하는 지점을 점차 확대 (11g) 1. NL 조인 시 Inner 테이블의 인덱스 루트 블록 뿐 아니라 다른 인덱스 블록에 대해서도 Pinning 적용 2. DML 수행 시 Undo 블록에 대해서도 Pinning 적용 ※ 버퍼 Pinning을 통한 블록 I/O
감소 효과는 SQL 튜닝하는데 있어 중요 ※ 인덱스 클러스터링 팩터와
관련 (버퍼 Pinning 원리 사용) → (예) 액세스 빈도가 높은 인덱스 키 순서대로 테이블 레코드 재정렬
논리적인 블록 읽기 횟수 감소
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
27 | 5. V$SYSSTAT [1] | 토시리 | 2010.06.14 | 9851 |
26 | 1. 블록 단위 I/O | 토시리 | 2010.07.12 | 9381 |
25 | 4. 커서 공유 | balto | 2010.06.28 | 9201 |
24 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.12 | 9172 |
23 | 2. User Call vs. Recursive Call | 토시리 | 2010.07.07 | 9050 |
22 | 10. Dynamic SQL 사용 기준 | balto | 2010.07.04 | 8643 |
21 | 1. 트랜잭션 동시성 제어 | 실천하자 | 2010.05.31 | 8632 |
20 | 2. AutoTrace | 실천하자 | 2010.06.06 | 8599 |
19 | 3. 비관적 vs. 낙관적 동시성 제어 | 휘휘 | 2010.06.07 | 8210 |
18 | 9. Snapshot too old | balto | 2010.05.30 | 8103 |
17 | 11. End-To-End 성능관리 | 휘휘 | 2010.06.14 | 8095 |
16 | 7. Response Time Analysis 방법론과 OWI | balto | 2010.06.13 | 8067 |
15 | 10. 대기 이벤트 | balto | 2010.05.30 | 8012 |
14 | 8. I/O 효율화 원리 | 휘휘 | 2010.07.19 | 7743 |
13 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.12 | 7439 |
12 | 부록 | 휘휘 | 2010.07.19 | 7238 |
11 | 1. SQL과 옵티마이저 | 휘휘 | 2010.06.28 | 7218 |
10 | 12. 데이터베이스 성능 고도화 정석 해법 | 휘휘 | 2010.06.14 | 7153 |
9 | 4장. 라이브러리 캐시 최적화 원리 | 휘휘 | 2010.06.28 | 6916 |
8 | 2장. 트랜잭션과 Lock | 운영자 | 2010.06.01 | 6896 |
* hidden parameter 확인 방법