-
[Oracle] 오라클 DB 버퍼 캐시IT/etc 2022. 3. 28. 19:37
DB 버퍼 캐시
빠른 데이터를 입출력을 위해 SGA 공유 메모리를 이용한다고 설명했는데, 좀 더 구체적으로 말해 사용자가 입력한 데이터를 데이터파일에 저장하고 이를 다시 읽는 과정에서 거쳐 가는 캐시 영역은 SGA 구성요소 중 하나인 DB 버퍼 캐시(DB Buffer Cache) 이다.블록단위 I/O
오라클에서는 I/O는 블록(block) 단위로 이루어지는데, 메모리 버퍼 캐시에서 버퍼 블록을 액세스 할 때뿐만 아니라 데이터파일에 저장된 데이터 블록을 DB 버퍼 캐시로 적재하거나 캐시에서 변경된 블록을 다시 데이터파일에 저장 할 때도 블록 단위로 처리한다. 데이터파일에서 버퍼 캐시로 블록을 적재할 때, 인덱스를 경유한 테이블 액세스 시에는 한 번에 한 블록씩(single block read) 읽어들이지만, Full Scan 시에는 성능 향상을 위해 한 번에 여러 개 블록(multi read)을 읽어들인다. DBWR 프로세스는 버퍼 캐시로부터 변경된 블록(Dirty buffer block)을 주기적으로 데이터파일에 기록하는 작업을 수행하는데, 이때도 성능향상을 위해 한 번에 여러 블록을 처리한다.블록 단위로 읽는다는 의미는, 하나의 레코드에서 하나의 컬럼만을 읽고자 하더라도 레코드가 속한 블록 전체를 읽게 됨을 의미한다. 6장에서 자세히 설명하겠지만, 이는 데이터베이스 I/O 성능과 튜닝 원리를 이해하는 데 있어 아주 중요한 의미를 갖는다. SQL 성능을 좌우하는 가장 중용한 성능지표는 액세스하는 블록 개수이며, 옵티마이저가 인덱스를 이용해 테이블을 액세스 할지 아니면 Full Table Scan 할지를 결정하는 데 있어 가장 중요한 판단 기준은, 읽어야 할 레코드 수가 아니라 블록 개수다.버퍼캐시구조
DB 버퍼 캐시를 설명할 때 흔히 바둑판 모양으로 표현하는데, 가장 직관적이면서 이해하기 쉬운 그림임이 틀림없다. 그러면 바둑판처럼 생긴 버퍼 캐시에서 읽고자 하는 데이터 블록이 담긴 버퍼 블록을 어떻게 찾아내는 것일까?SGA 내에는 수없이 많은 자료구조(Data Structure)가 사용되고 있으며 그 중 가장 많이 사용되는 것이 해시 테이블(or hash map)이고, DB 버퍼 캐시도 해시 테이블 구조로 관리된다. 해싱(Hasing) 알고리즘을 설명할 때 흔히 주소록에 비유하곤 하는데, 고객의 주소와 전화번호를 관히하는 주소록에서 성씨가 같은 고객은 같은 페치지(=해시 버킷)에 묶어서 관리한다. 고객정보가 입수되는 시점이 다르므로 같은 성씨 안에서는 대개 정렬된 상태를 유지하지 않는다. 이 때문에 해시 버킷 내에서는 스캔 방식으로 값을 찾는다. 그렇더라도 키 값을 해시 값으로 변환해 해시 버킷을 찾아가는 속도가 워낙 빨라서 각 버킷에 기록디는 엔트리 개수를 일정 수준으로 유지할 수만 있다면 해싱에 의한 검색 속도가 가장 빠르다고 알려져 있다.DB 버퍼 캐시 내에서 데이터 블록을 해싱하기 위해 사용되는 키 값은 데이터 블록 주소(DBA, data block address)다. 즉, 해시 함수에 데이터 블록 주소를 입력해 리턴받은 해시 값(Hash Value)이 같은 블록들을 같은 해시 버킷(Bucket)에 연결 리스트(Linked List) 구조로 연결하는 것이다. 각각의 연결 리스트를 해시 체인(Hash Chain)이라고 한다. 찾고자 하는 데이터 블록 주소를 해시 값으로 변환해서 해당 해시 버킷에서 체인을 따라 스캔하다가 거기서 찾아지면 바로 읽고, 찾지 못하면 디스크에서 읽어 해시 체인에 연결한 후 읽으면 된다. 자신 만 읽고 버리는 게 아니라 다른 사용자들도 사용할 수 있도록 캐싱해 두는 것이다.지금까지 버퍼 블록이 통째로 해시 구조로 관리되는 것처럼 설명했지만, 정확히 표현하면 버퍼 헤더만 해시 체인에 연결디며, 실제의 데이터 값이 필요해지면 버퍼헤더에 있는 포인터를 이용해 다시 버퍼 블록을 찾아가느 구조다.※ 오라클 아키텍처에 대해 다시 Remind 하기 위해 2009년에 발간된 "오라클 성능 고도화 원리와 해법1" 을 책장에서 꺼내어 블로그로 옮겨 보았다.
'IT > etc' 카테고리의 다른 글
[Oracle] 오라클 DB 버퍼 캐시_(캐시 버퍼 LRU 체인) (0) 2022.03.30 [Oracle] 오라클 DB 버퍼 캐시_(캐시 버퍼 체인) (0) 2022.03.29 [Oracle] 오라클 아키텍처 2 (0) 2022.03.27 [Oracle] 오라클 아키텍처 1 (0) 2022.03.26 [Oracle] DBA_View의 테이블을 생성해보자. (0) 2022.03.24