728x90

2.1 Database Buffer Cache 구조

Database Buffer Cache는 오라클의 핵심 메모리 영역으로, 디스크 I/O를 줄이고 SQL 실행 성능을 높이기 위한 캐시 역할을 한다. 디스크에서 데이터를 읽을 때는 블록 단위 I/O가 수행되며, 이 블록들은 버퍼 캐시에 로드된다.

🔍 블록 식별 구조: 해시 버킷과 체인

  • 오라클은 데이터 블록을 빠르게 찾기 위해 해시 테이블을 사용한다.
  • 해시 테이블의 각 엔트리는 **해시 버킷(Hash Bucket)**이며, 동일 해시값을 가진 블록들은 **연결 리스트(체인)**로 연결된다.
  • 각 체인은 **버퍼 헤더(Buffer Header)**를 통해 연결되며, 이 버퍼 헤더는 해당 블록의 위치, 상태, LRU 및 해시 체인 포인터 등을 포함한다.
  • 사용자가 특정 블록을 요청하면, 오라클은 해당 블록의 주소를 해시 함수로 계산하여 버킷을 찾고, 그 버킷에 연결된 체인을 따라가며 원하는 블록을 탐색한다.
-- 해시 버킷 개수 확인 SQL 예시
SELECT name, value FROM v$parameter WHERE name = 'db_block_hash_buckets';

🎯 체인 탐색 비용 최소화 전략: 하나의 체인에 여러 버퍼가 걸리면 탐색 비용이 증가하므로, 하나의 체인에 하나의 버퍼만 걸리는 것을 이상적인 상태로 본다. 이를 위해 해시 버킷 수를 충분히 확보하고, 해시 분포가 균등해야 한다.


2.2 Latch(래치) 메커니즘

Buffer Cache는 다수의 세션이 동시에 접근하는 공유 영역이기 때문에, **자료구조에 대한 직렬화(Serialization)**가 필수적이다. 이 역할을 수행하는 것이 바로 **래치(Latch)**이다.

✅ 래치의 특징

  • 래치는 데이터 보호가 아닌, SGA의 공유된 내부 자료구조 보호를 위한 경량 락이다.
  • 사용 시점:
    • 해시 체인을 스캔할 때
    • 버퍼 블록을 추가하거나 제거할 때
    • LRU 리스트를 갱신할 때
  • 래치는 매우 빠르게 작동하는 Spin Lock 형태로 구현되어, 짧은 시간 동안만 유지되며 빠른 자원 접근을 보장한다.

🔄 오라클에서 '읽기 전용 모드'란 단순히 SELECT 문을 실행하는 것이 아니라, 해시 체인을 따라가며 필요한 블록을 찾는 작업 전체를 의미한다. 이 모든 탐색 작업은 래치의 보호 하에 수행된다.


2.3 LRU 체인 구조

Buffer Cache는 재사용 정책을 위해 LRU (Least Recently Used) 리스트를 사용한다. 이 리스트는 크게 두 가지로 나뉜다:

  • Dirty List:
    • 수정된 블록으로, 아직 디스크에 쓰이지 않음.
    • DBWR 프로세스가 디스크에 플러시하기 전까지 유지됨.
  • LRU List:
    • 아직 변경되지 않았거나, 이미 디스크에 반영된 블록들.
    • 재사용 대상이며, 새로운 블록을 로드할 때 가장 오래된 것부터 제거됨.

📌 버퍼 헤더는 이 두 리스트 중 하나에 반드시 소속되어 있으며, 리스트 간 이동 또한 래치의 보호 하에 수행된다.


2.4 버퍼 상태의 3가지 유형

Buffer Cache의 각 블록은 다음 세 가지 상태 중 하나로 존재한다:

상태설명

Free Buffer 어떤 데이터도 없는 초기 상태의 블록. 재사용 가능.
Dirty Buffer 변경되었지만 아직 디스크에 반영되지 않은 블록. DBWR 대상.
Pinned Buffer 현재 세션이 사용 중인 블록. 다른 세션에서 접근 불가.

📘 이 상태들은 Buffer Management, Dirty List 처리, 세션 동기화에 모두 관여하며 성능에 직결되는 요소이다.


2.5 요약 및 실무 팁

  • Buffer Cache는 블록 단위 I/O를 캐싱하여 성능 향상을 꾀한다.
  • 해시 테이블 + 체인 구조를 통해 빠르게 원하는 블록에 접근 가능하다.
  • 버퍼 헤더는 블록 메타데이터와 해시 체인 및 LRU 포인터를 포함하여 탐색과 관리에 핵심적이다.
  • 래치는 SGA 자료구조 보호를 위한 경량 락으로, 모든 체인 탐색, 버퍼 이동 시점에 사용된다.
  • LRU는 Dirty와 Clean 리스트로 구성되어 버퍼 교체 정책을 제어한다.
  • 각 블록은 Free, Dirty, Pinned 상태를 가지며, 이를 통해 작업 흐름이 제어된다.

📎 관련 태그

#Oracle #SGA #BufferCache #Latch #HashChain #LRU #DirtyBuffer #PinnedBuffer #FreeBuffer #BlockIO #BufferHeader #DatabasePerformance #OracleMemoryArchitecture

728x90
728x90

1.1 오라클을 배우기 전에

오라클 데이터베이스는 기업에서 가장 널리 사용되는 RDBMS 중 하나로, 안정성과 성능, 확장성을 기반으로 다양한 산업군에서 활용되고 있다. 오라클을 제대로 배우기 위해서는 단순히 SQL을 실행하는 수준을 넘어, 내부 구조와 아키텍처를 이해하는 것이 중요하다. 이 장에서는 오라클의 핵심 구성 요소들과 이들이 어떤 원리로 작동하는지에 대해 직관적으로 설명한다.


1.2 오라클 아키텍처 개요

오라클 데이터베이스는 크게 두 가지 구성 요소로 이루어진다:

  • 오라클 인스턴스: 메모리 구조(SGA 등)와 백그라운드 프로세스
  • 오라클 데이터베이스: 실제 데이터가 저장되는 파일들의 집합

🔹 인스턴스 = SGA + 백그라운드 프로세스


1.3 SGA(System Global Area)

SGA는 오라클 인스턴스가 작동하기 위해 사용하는 공유 메모리 공간으로, 여러 세션이 동시에 접근하며 SQL 실행, 데이터 캐시, 트랜잭션 처리를 돕는다.

주요 구성 요소:

  • Database Buffer Cache: 디스크에서 읽어온 데이터 블록을 임시로 저장. 반복 조회 시 성능 향상.
  • Redo Log Buffer: 트랜잭션의 변경 내역을 일시 저장. 복구에 사용됨.
  • Shared Pool: SQL 실행 계획, PL/SQL 코드 등을 캐싱하여 파싱 부담 줄임.
  • Large/Java Pool: 병렬 처리, Java 실행을 위한 메모리.

💡 Dirty Buffer란? Buffer Cache 내에서 변경되었지만 아직 디스크에 반영되지 않은 블록을 의미. DBWR 프로세스가 디스크로 플러시할 때까지 메모리에 존재.


1.4 Lock 메커니즘

여러 사용자가 동시에 같은 데이터를 사용할 수 있기 때문에, 오라클은 Lock을 통해 데이터 일관성과 무결성을 보장한다.

주요 Lock 종류:

  • TX Lock: 행 단위 락. DML 트랜잭션 시 발생.
  • TM Lock: 테이블 락. DDL 또는 제약 조건 관련.
  • UL Lock: 사용자 정의 락 (DBMS_LOCK 사용).

💥 Deadlock: 서로 상대방의 락을 기다리는 교착 상태. 오라클은 이를 감지하고 하나의 세션을 종료함으로써 해결한다.


1.5 RAC(Real Application Clusters)

RAC는 여러 대의 서버가 하나의 데이터베이스를 동시에 접근할 수 있도록 구성된 클러스터 구조이다. 고가용성과 확장성이 필요한 엔터프라이즈 환경에서 자주 사용된다.

RAC의 장점:

  • 고가용성: 한 노드 장애 시 다른 노드로 자동 전환 가능
  • 수평 확장성: 서버를 추가하여 성능 향상 가능
  • 로드 밸런싱: 요청을 여러 인스턴스로 분산 처리

핵심 기술 - Cache Fusion:

  • 각 노드의 SGA를 네트워크로 연결해 메모리 블록을 공유. 데이터 일관성을 유지하면서도 빠른 처리 가능.

1.6 커넥션 풀의 필요성

애플리케이션이 DB와 통신할 때, 매번 새로 커넥션을 만드는 것은 성능적으로 비효율적이다. 커넥션 풀은 일정 수의 DB 커넥션을 미리 만들어 두고 재사용함으로써 다음과 같은 장점을 제공한다:

  • 커넥션 생성/소멸 오버헤드 제거
  • DB 자원 사용 제한 및 보호
  • 다수 사용자 처리 능력 향상

💡 실무에서는 HikariCP(Spring Boot), QueuePool(SQLAlchemy) 등을 통해 커넥션 풀을 관리한다.


1.7 요약

구성 요소설명

SGA SQL 실행, 캐시, 트랜잭션 관리를 위한 공유 메모리 공간
Dirty Buffer 수정된 상태이지만 디스크에 반영되지 않은 데이터 블록
Lock 데이터 일관성을 위한 동시성 제어 메커니즘
RAC 다중 서버가 하나의 DB를 공유해 고가용성과 확장성 제공
커넥션 풀 DB 커넥션을 미리 만들어 재사용함으로써 성능 최적화

이제 오라클의 기본 구조를 이해했으니, 다음 장에서는 SQL 실행 흐름과 옵티마이저에 대해 배워보자.

728x90

+ Recent posts