PostgreSQL의 **Visibility Map(VM)**은 테이블의 힙 페이지에서 삭제되지 않은 모든 튜플(행)이 가시 상태인지를 추적하기 위한 특수한 데이터 구조입니다.
가시 상태란?
- PostgreSQL은 MVCC 방식을 사용하여 트랜잭션의 격리성과 동시성을 제공합니다.
- 특정 튜플(행)이 트랜잭션의 관점에서 유효하게 보이는지를 의미합니다.
- 각 튜플은 다음 정보를 포함합니다:
- xmin: 튜플을 삽입한 트랜잭션 ID.
- xmax: 튜플을 삭제하거나 갱신한 트랜잭션 ID.
튜플의 가시 여부 결정:
- 현재 트랜잭션이 튜플의 xmin보다 늦게 시작했는지 확인.
- 튜플이 삭제되지 않았거나(xmax가 NULL), 현재 트랜잭션에서 해당 삭제를 아직 커밋하지 않았는지 확인.
Visibility Map의 구조
- 각 테이블은 별도의 VM 파일을 가집니다.
- VM 파일은 테이블과 같은 디렉토리에 저장되며, 파일 이름은 vm 확장자를 가집니다.
- 예: 테이블의 OID가 12345라면 VM 파일은 base/DBOID/12345_vm로 저장.
- 예: 테이블의 OID가 12345라면 VM 파일은 base/DBOID/12345_vm로 저장.
Visibility Map 활성화 및 내용확인
--활성화 방법
CREATE EXTENSION pg_visibility;
--활성화 되었는지 확인
SELECT * FROM pg_available_extensions WHERE name = 'pg_visibility';
--가시상태 확인 pg_visibility의 함수 중 pg_visibility_map을 사용
SELECT blkno, all_visible, all_frozen
FROM pg_visibility_map('테이블명');
--blkno: 테이블 블록 번호.
--all_visible: 해당 블록이 VM에서 "모든 튜플이 가시 상태"로 표시되었는지 여부.
-- all_visible = true: 해당 블록은 VACUUM이 스킵 가능.
--all_frozen: 해당 블록이 "모든 튜플이 변경되지 않고 고정된 상태"인지 여부.
-- all_frozen = true: 변경되지 않음.
Visibility Map 활용
- VACUUM 작업 확인:
- all_visible가 false인 블록이 많다면 VACUUM 작업이 필요할 수 있습니다.
- 쿼리 최적화:
- all_visible가 true인 블록은 Index-Only Scan으로 성능을 최적화할 수 있습니다.
pg_Visibility 함수
더보기
1. pg_visibility_map(테이블명)
- 설명: 지정된 테이블의 Visibility Map(VM) 상태를 확인합니다.
- 주요 정보:
- blkno: 테이블 블록 번호.
- all_visible: 해당 블록이 모든 트랜잭션에서 가시 상태인지 여부.
- all_frozen: 해당 블록의 튜플이 변경되지 않은 상태인지 여부.
- 운영에서의 활용:
- Autovacuum 최적화 여부 점검.
- Index-Only Scan 가능 블록 식별.
2. pg_visibility(테이블명)
- 설명: 테이블의 각 블록에 대한 가시성 정보를 확인합니다.
- 주요 정보:
- blkno: 테이블 블록 번호.
- flags: 블록의 가시 상태를 나타내는 플래그.
- 운영에서의 활용:
- 특정 블록이 변경되었거나 VACUUM 대상인지 점검.
- 디스크 I/O가 높은 블록 식별.
3. pg_truncate_visibility_map(테이블명)
- 설명: 특정 테이블의 Visibility Map(VM) 데이터를 초기화(삭제)합니다.
- 운영에서의 활용:
- VM이 손상되었거나 재구성이 필요한 경우 사용.
- 주의: 성능에 영향을 줄 수 있으므로 신중히 사용.
- all_visible 블록 비율이 높을수록 Index-Only Scan에 유리.
4. pg_check_frozen(테이블명)
- 설명: 테이블의 블록에 대해 all_frozen 상태를 점검합니다.
- 주요 정보:
- 모든 튜플이 "변경되지 않은 상태"인지 확인.
- 운영에서의 활용:
- 오래된 블록이 제대로 관리되고 있는지 점검.
- Freeze 상태를 확인하여 트랜잭션 ID Wraparound 문제 예방.
- 동결되지 않은 블록이 많다면 VACUUM FREEZE 수행 고려.
5. pg_visibility_map_summary(테이블명)
- 설명: 테이블의 VM 상태를 요약한 결과를 제공합니다.
- 주요 정보:
- total_blocks: 테이블의 전체 블록 수.
- visible_blocks: 가시 상태의 블록 수.
- frozen_blocks: 동결 상태의 블록 수.
- 운영에서의 활용:
- 테이블의 전체 VM 상태를 한눈에 확인.
- VACUUM/ANALYZE 주기 설정에 도움.
- 결과를 기반으로 all_visible 블록 비율이 낮으면 VACUUM 조정 필요.
'Postgresql' 카테고리의 다른 글
슬로우쿼리 모니터링 (0) | 2024.12.26 |
---|---|
쿼리성능 분석 툴 pg_stat_statements (0) | 2024.12.17 |
PostgreSQL 15.8 시스템 변수 최적화 (0) | 2024.12.11 |
VACUUM type 에 따른 redo 발생량 차이 (0) | 2024.11.13 |
PostgreSQL architecture (Local Memory) (0) | 2024.11.13 |