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 경합을 줄이고, 성능을 최적화할 수 있습니다. 🚀