본문 바로가기
카테고리 없음

latch: cache buffers chains 대기 이벤트 원인 및 해결 방법

by Driving 2025. 3. 26.

latch: cache buffers chains 대기 이벤트 원인 및 해결 방법

latch: cache buffers chains 대기 이벤트는 Oracle의 버퍼 캐시(Buffer Cache)에서 동일한 블록을 여러 프로세스가 동시에 접근할 때 발생하는 경합(Latch Contention) 때문입니다. 일반적으로 높은 동시 읽기 작업 또는 특정 블록에 대한 과도한 액세스가 원인이 됩니다.


1. 원인 (Causes)

다음과 같은 상황에서 latch: cache buffers chains 경합이 발생할 가능성이 높습니다:

1) 특정 블록에 대한 과도한 접근 (Hot Block)

  • 일부 데이터 블록(예: 동일한 인덱스 블록 또는 핫 테이블 블록)에 다수의 세션이 동시에 접근할 때 발생.
  • 인덱스 리프 블록(split이 일어나지 않고 계속 같은 블록에 접근).

2) 비효율적인 SQL (Frequent Full Table Scan)

  • 특정 테이블에 대한 불필요한 인덱스 스캔 또는 풀 테이블 스캔이 발생할 경우.
  • 자주 액세스되는 블록이 메모리 내에서 경합을 유발함.

3) 높은 동시성 (High Concurrency)

  • 여러 사용자가 동일한 블록을 동시에 업데이트하거나 조회할 때.
  • OLTP 환경에서 자주 발생함.

4) 부족한 버퍼 캐시(Buffer Cache Insufficient)

  • SGA의 Buffer Cache가 너무 작아서 LRU(Least Recently Used) 알고리즘에 의해 동일한 블록이 자주 캐싱되고 해제됨.
  • 불필요한 블록 I/O 증가로 인해 경합이 발생함.

2. 해결 방법 (Solutions)

🛠 1) Hot Block 문제 해결

🔹 (1) 블록을 특정 세그먼트에서 분산시키기

  • Hot Block이 특정 인덱스 블록에서 발생할 경우, PCTFREE 설정을 조정하여 블록 Split을 유도
  • ALTER TABLE my_table PCTFREE 20;
  • 테이블의 ROWID를 분산시키는 것도 하나의 방법
  • ALTER TABLE my_table ENABLE ROW MOVEMENT;

🔹 (2) Reverse Key Index 활용

  • Hot Index Block 문제를 완화하기 위해 Reverse Key Index를 사용하면 동일한 리프 블록을 참조하는 것을 방지할 수 있음.
  • CREATE INDEX my_index ON my_table(column_name) REVERSE;
  • 단, 범위 검색(RANGE SCAN)이 불가능하므로 주의.

🛠 2) SQL 튜닝 (SQL Optimization)

🔹 (1) 특정 블록에 대한 불필요한 접근 최소화

  • V$SESSION_WAIT 뷰를 통해 어떤 SQL이 latch: cache buffers chains를 유발하는지 확인.
  • SELECT event, p1, p2, p3, wait_time, seconds_in_wait FROM V$SESSION_WAIT WHERE event = 'latch: cache buffers chains';
  • 많이 조회되는 SQL 튜닝:
    • 인덱스 스캔 최적화
    • 불필요한 테이블 풀 스캔 제거
    • 바인드 변수 활용하여 실행계획 공유

🛠 3) Buffer Cache 크기 조정

  • 버퍼 캐시가 작아서 LRU 알고리즘이 자주 작동하는 경우 SGA 크기를 증가시켜 해결 가능.
  • 현재 버퍼 캐시 크기 확인:
  • SHOW PARAMETER db_cache_size;
  • 버퍼 캐시 크기 증가:
  • ALTER SYSTEM SET db_cache_size = 1G SCOPE=BOTH;

🛠 4) Multi-Block Read 설정 튜닝

  • db_file_multiblock_read_count 값을 조정하여 캐시 효율성을 높임.
  • 현재 설정값 확인:
  • SHOW PARAMETER db_file_multiblock_read_count;
  • 설정 변경:
  • ALTER SYSTEM SET db_file_multiblock_read_count = 128 SCOPE=SPFILE;

3. 결론

🔹 Hot Block 문제 해결 → Reverse Key Index, PCTFREE 조정
🔹 SQL 튜닝 → 인덱스 최적화 및 불필요한 테이블 스캔 제거
🔹 버퍼 캐시 크기 조정 → db_cache_size 증가
🔹 멀티 블록 읽기 최적화 → db_file_multiblock_read_count 설정

이러한 조치를 통해 latch: cache buffers chains 경합을 줄이고, 성능을 최적화할 수 있습니다. 🚀