Postgresql

Visibility Map(가시성 맵)

dbavayne 2024. 12. 17. 15:11

PostgreSQL의 **Visibility Map(VM)**은 테이블의 힙 페이지에서 삭제되지 않은 모든 튜플(행)이 가시 상태인지를 추적하기 위한 특수한 데이터 구조입니다.

가시 상태란?

  • PostgreSQL은 MVCC 방식을 사용하여 트랜잭션의 격리성과 동시성을 제공합니다.
  • 특정 튜플(행)이 트랜잭션의 관점에서 유효하게 보이는지를 의미합니다.
  • 각 튜플은 다음 정보를 포함합니다:
    • xmin: 튜플을 삽입한 트랜잭션 ID.
    • xmax: 튜플을 삭제하거나 갱신한 트랜잭션 ID.

튜플의 가시 여부 결정:

  1. 현재 트랜잭션이 튜플의 xmin보다 늦게 시작했는지 확인.
  2. 튜플이 삭제되지 않았거나(xmax가 NULL), 현재 트랜잭션에서 해당 삭제를 아직 커밋하지 않았는지 확인.

Visibility Map의 구조

  • 각 테이블은 별도의 VM 파일을 가집니다.
  • VM 파일은 테이블과 같은 디렉토리에 저장되며, 파일 이름은 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 활용

 

  1. VACUUM 작업 확인:
    • all_visible가 false인 블록이 많다면 VACUUM 작업이 필요할 수 있습니다.
  2. 쿼리 최적화:
    • 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 조정 필요.