1) 블록 단위 I/O

  • 오라클의 I/O는 블록단위로 이루어 진다
  • 인덱스를 경유한 테이블 액세스 시에는 한번에 한 블록씩(Single Block Read)읽음 Full Scan 시에는 성능 향상을 위해 Multi Block Read를 수행
  • 한번에 하나의 컬럼만 읽고자 하더라도 레코드가 속한 블록 전체를 읽게 됨
  • SQL 성능의 가장 중요한 성능 지표는 액세스하는 블록 개수이며, 옵티마이저가 인덱스를 이용해 테이브을 액세스할지 Full Tale Scan할지를 결정하는데 있어 가장 중요한 판단 기준은, 읽어야 할 레코드 수가 아니라 블록 개수다.


2) 버퍼 캐시 구조

  • DB 버퍼 캐시도 해시 테이블 구조로 관리된다.
  • 해싱 알고리즘을 주소록에 비유하면 고객의 주소와 전화번호를 관리하는 주소록에서 성씨가 같은 고객(= 해싱 알고리즘을 통해 동일한 값을 이용)은 같은 페이지(=해시 버킷)에 묶어서 관리한다.
  • 고객정보가 입수되는 시점이 다르므로 같은 성씨 안에서는 대개 정렬된 상태를 유지하지 않는다.
  • 이런 이유로 해시 버킷 내에서는 스캔 방식으로 값을 찾는다.
  • 그렇더라도 키 값을 해시 값으로 변환해 해시 버킷을 찾아가는 속도가 워낙 빨라서 각 버킷에 기록되는 엔트리 개수를 일정 수준으로 유지할 수만 있다면 해싱에 의한 검색 속도가 가장 빠르다고 알려져 있다.
  • DB버퍼 캐시 내에서 데이터 블록을 해싱하기 위해 사용되는 키 값은 데이터 블록 주소(DBA,Data Block Address)다.
  • 해시함수에 데이터 블록 주소를 입력해 입력받은 해시 값(Hash value)이 같은 블록들을 같은 해시 버킷(Bucket)에 연결 리스트(Linked List)구조로 연결한다.
  • 각각의 연결 리스트를 해시 체인(Hash Chain)이라고 한다.
  • 찾고자 하는 데이터 블록 주소를 해시 값으로 변환해서 해당 해시 버킷에서 체인을 따라 스캔하다가 거기서 찾아지면 바로 읽고, 찾지 못하면 디스크에서 읽어 해시 체인에 연결한 후 읽으면 된다.
  • 전체 블록이 해시 구조로 관리되는 것이 아니라, 버퍼 헤더(Buffer Header)만 해시 체인에 연결되며, 실제의 데이터 값이 필요해지면 버퍼 헤더에 잇는 포인터를 이용해 다시 버퍼 블록을 찾아가는 구조이다.


3) 캐시 버퍼 체인

  • 각 해시 체인으 래치(Latch)에 의해 보호된다.
  • DB 버퍼는 공유 메모리 영역인 SGA내에 존재하므로 여러 프로세스에 의한 동시 액세스가 일어날 가능성이 크다.
  • 따라서 같은 리소스에 대한 액세를 반드시 직렬화(Serialization)해야하고, 이를 위해 구현된 일종의 Lock 매커니즘을 래치(Latch)라고 한다.
  • 래치를 획득한 프로세스만이 그 래치에 의해 보호되는 자료구조로의 진입이 허용된다.
  • 두 개 이상의 프로세스가 같은 해시 체인으로 진입해 새로운 버퍼 블록을 연결하고 해제하는 작업을 동시에 진행한다면 문제가 발생할 수 있고, 이를 방지 하기 위해 사용하는 것이 cache buffer chains 래치다.
  • 하나의 cache buffer chains 래치가 여러 개 해시 체인을 동시에 관리한다.
  • 예) 해시 버킷 개수가 2,097,152개(하나의 해시 버킷과 해시 체인은 1:1관계)이고, 해시 체인을 관리하는 래치 개수는 65,536개라고 하면, 하나의 래치가 32개의 버킷을 관리하고 있음을 알 수 있으며, 이는 버퍼 캐시 크기와 버전에 따라 달라 진다.
  • (_db_block_hash_buckets과 \_db_block_hash_latches를 통해 확인 가능)
  • 하나의 체인에 하나의 버퍼만 달리도록 하는 것을 목표로 삼아야 한다. 그래야 목표한 해시 체인을 찾고서 추가적으로 스캔하는 비용을 최소화 할 수 있다. 그러려면 해시 버킷 개수가 충분히 많아야 한다.
  • Oracle 9i부터 읽기 전용 작업일 때는 cache buffer chains 래치를 Share 모드로 획득할 수 있다. 읽기 전용 작업이란 select문을 의미하는 것이 아니라 해시 체인을 스캔하면서 필요한 블록을 찾는 작업을 말한다.
  • 9i 이후 버전에서 Share 모드 래치를 사용하는 것과 상관 없이, select문장을 동시에 수행하면 여전히 cache buffers chains 래치 경합이 발견된다.
  • 래치는 데이터 자체를 보호하는 게 아니라 SGA에 공유돼 있는 자료구조를 보호하는 것이다.
  • cache buffers chains 래치는 버퍼 캐시에 연결된 체인 구조를 보호한다. 즉, 해시 체인을 스캔하거나 거기에 블록을 추가, 제거할 때 래치가 요구된다.
  • cache buffer chains래치느 버퍼 헤더에 Pin을 설정할 때도 필요하다.