Oracle/성능 분석과 인스턴스 튜닝 정리
Buffer Cache 와 Access 메커니즘
Debaeloper
2021. 6. 10. 07:44
오늘은 SGA 컴포넌트 중 Buffer Cache에 대해서 단간한 메커니즘을 알아본다.
1. Buffer Cache 란?
2. DBA와 Hash Bucket 그리고 LRU
3. Buffer Cache Access 메커니즘
Buffer Cache 란?
Buffer Cache는 SGA(공유메모리영역)의 한 부분으로 Storage I/O Access를 최소화 하고 특히 Random I/O 성능 영향을 최소화 하는 중요한 역할을 한다.
우리가 한번 사용한 디스크의 Data Block을 Buffer Cache에 올려놓고 같은 Block이 필요한 경우 디스크에 갈 필요없이 메모리에서 데이터를 바로 사용할 수 있다. ( SQL수행 속도에 가장큰 영향을 미치는 부분이 디스크 I/O 이기 때문에 이부분을 최소화 하는게 성능향상에 도움이 된다. )
DBA와 Hash Bucket 그리고 LRU
- DBA (Data Block Address ) : 실제 Storage 에 물리적인 주소를 이야기하고 해당 주고는 File# + Block# 로 이루어져 있다.
- Hash Bucket : 이름에서 알 수 있듯이 양동에 무언가를 담아 놓았는데 이를 Hash Table로 만들어 놓고 내부의 참조된 영역은 Linked List 된 구조이다. (어려우면 아래 그림으로 !! 보고 이해하기 )
- LRU (Least Recently Used) : 가장 오랫동안 참조되지 않은 페이지를 교체하는 기법 (OS에서 페이징 교체 알고리즘에서 공부했던 내용... 다른 부부은 FIFO/LFU 가 있었다. ) 쉽게 생각해서 오래 안쓰면 버리겠다는 내용
이미지 출처 : 구루비
Buffer Cache Access 메커니즘
- SELECT * FROM CUSTOMER WHERE ID='005' 로 조회한다.
- 데이터 딕셔너리 ( 잘 모르면 지난 포스팅 보고오기 Oracle Data Dictionary 란? ) 에서 DBA(Data Block Address) 정보를 찾는다.
- DBA + Class 로 해쉬함수에 전달하면 Hash Bucket의 위치를 알려준다.
- Hash Bucket의 특정 위치에 해당하는 Linked List 를 순차검색한다.
- 순차 검색에서 원하는 DBA정보가 없다면 ?
- Storage 에 접근해서 (I/O발생 성능에 좋지안음) DBA에 맞는 Block을 가져온다.
- 가져온 Block을 Buffer Cache에 올려둔다.
- Buffer Cache에 올려둔 위치를 알 수 있도록 Hash Bucket에 Buffer Cache위치를 저장해놓는다.
- 순차 검색에서 원하는 DBA정보가 있다면 ?
- Buffer Cache의 위치에 찾아가서 Block정보를 가지고 요청된 SQL에 응답한다.
정리
간단히 말해서 Buffer Cache는 성능에 매우 취약한 I/O Access를 피하도록 하는 방법이다. 이 전략이 가능한 이유는 서버 프로세스들이 서로 공유를 하기 때문에 더욱 효과적이다. Buffer Cache는 SGA(공유메모리 영역) 안에 들어있는 컴포넌트 이기 때문에 모두 공유하고 있다. 따라서 다른 프로세스가 올려놓은 Block를 내가 사용할 수도 있는 것이다.
DB는 공부를 하면 할수록 어렵지만 재미있다.