본문으로 건너뛰기

Top 오브젝트

Top 오브젝트는 개별 인스턴스의 오브젝트(테이블, 인덱스)별 Bloating, Scan, DML, Analyze Time, Age, Dead Tuple 등을 분석할 수 있습니다. 또한 관리가 필요한 테이블과 인덱스를 빠르게 식별할 수 있습니다.

  • 하루에 한 번 수집되며(pg_object_hour 설정 시각 기준), 각 Row의 Collection Time 컬럼에서 수집 시각을 확인할 수 있습니다.

  • 6가지 분석 기준(1차 탭)과 Table/Index(2차 탭)를 조합하여 다양한 관점에서 오브젝트를 분석할 수 있습니다.

  • 테이블명 또는 인덱스명을 클릭하면 Object Detail 창에서 컬럼 및 인덱스 구성을 확인할 수 있습니다. (DBX 에이전트 1.6.15 이상)

사전 설정

DB 설정

에이전트가 스키마 정보를 조회할 수 있도록 모니터링 계정에 권한을 부여합니다.

-- 스키마 접근 권한 부여
GRANT USAGE ON SCHEMA {schema_name} TO {DB_User};

-- 기존 테이블 조회 권한 부여
GRANT SELECT ON ALL TABLES IN SCHEMA {schema_name} TO {DB_User};

-- 향후 생성되는 테이블에 대한 조회 권한 자동 부여
ALTER DEFAULT PRIVILEGES FOR USER {owner_name} IN SCHEMA {schema_name} GRANT SELECT ON TABLES TO {DB_User};
구문설명
GRANT USAGE ON SCHEMA스키마에 접근할 수 있는 권한을 부여합니다.
GRANT SELECT ON ALL TABLES IN SCHEMA스키마 내 기존 테이블에 대한 조회 권한을 부여합니다.
ALTER DEFAULT PRIVILEGES ... GRANT SELECT향후 해당 스키마에 새로 생성되는 테이블에도 자동으로 조회 권한이 부여됩니다.

Agent 설정

DBX 에이전트 1.6.13 버전 이상이 필요합니다. pg_object의 기본값이 true이므로 별도 설정 없이 수집이 시작됩니다.

pg_object=true
설정 항목타입기본값설명
pg_objectbooleantrueTop 오브젝트의 정보 수집 여부를 설정합니다.
pg_object_hourint5Top 오브젝트의 정보를 수집 시각을 설정합니다. 기본값은 5이며 새벽 5시에 수집을 시작합니다.
상세 옵션
설정 항목타입기본값설명
table_bloat_ratioint50테이블 Bloating ratio 기준(단위: %)
table_bloat_bytesint10485760테이블 Bloating bytes 기준(10MB)
index_bloat_ratioint50인덱스 Bloating ratio 기준(단위: %)
index_bloat_bytesint10485760인덱스 Bloating bytes 기준(10MB)
autovacuum_list_limitint50가장 오래된 age(relfrozenxid) 순으로 설정값만큼 테이블 정보를 수집합니다.
노트

상세 옵션의 기준값에 따라 데이터가 수집되지 않거나, 너무 많이 수집될 수 있습니다. 워크로드 상황에 맞게 적절히 조정하세요.

데이터 수집 소스

각 분석 탭의 데이터는 PostgreSQL 시스템 카탈로그와 통계 뷰에서 수집됩니다.

주요 소스비고
Bloatingpg_class, pg_stats, pg_stat_user_tables, pg_stat_user_indexesBloat 크기는 컬럼 통계(null_frac, avg_width)를 기반으로 추정 계산합니다.
Scanpg_stat_user_tables, pg_stat_user_indexesseq_scan, idx_scan 등 누적 스캔 횟수를 조회합니다.
DMLpg_stat_all_tablesn_tup_ins, n_tup_upd, n_tup_del 등 누적 DML 수행 수를 조회합니다.
Analyze Timepg_stat_user_tableslast_vacuum, last_autovacuum, last_analyze, last_autoanalyze 등 실행 시각과 횟수를 조회합니다.
Agepg_class, pg_stat_user_tables, pg_settingsage(relfrozenxid)로 테이블별 Transaction Age를 계산하고, autovacuum_freeze_max_age 설정과 비교합니다.
Dead Tuplepg_class, pg_namespacepg_stat_get_live_tuples(), pg_stat_get_dead_tuples() 함수로 Tuple 수를 조회합니다.

TOP 오브젝트 분석하기

기본 옵션

상단 필터 영역에서 시간, 대상 인스턴스를 설정할 수 있습니다.

  • 날짜: 조회할 날짜를 선택합니다. 좌우 화살표로 날짜를 이동할 수 있습니다.

  • 인스턴스: 조회 대상 DB 인스턴스를 선택합니다.

  • 조회 기준: 데이터를 정렬할 기준 컬럼을 선택합니다. 선택한 1차 탭에 따라 항목이 달라집니다.

  • 조회 건수: 테이블에 표시할 건수를 설정합니다. (기본값: 50)

1차 탭 - 분석 기준

설명
Bloating테이블/인덱스의 Bloat 상태를 분석합니다. Bloat 비율이 높은 오브젝트를 식별합니다.
Scan테이블/인덱스의 스캔 패턴을 분석합니다. Sequential Scan과 Index Scan 비율을 확인합니다.
DMLINSERT, UPDATE, DELETE 등 DML 수행량을 분석합니다.
Analyze Time마지막 Analyze/Vacuum 실행 시각과 횟수를 확인합니다.
Age테이블의 Transaction Age를 분석합니다. XID Wraparound 위험이 있는 테이블을 식별합니다.
Dead TupleDead Tuple이 많은 테이블을 분석합니다. Vacuum이 필요한 테이블을 식별합니다.

2차 탭 - 오브젝트 유형

설명지원 1차 탭
Table테이블 단위로 분석합니다.모든 탭
Index인덱스 단위로 분석합니다.Bloating, Scan

컬럼 안내

Vacuum 분석 화면에서 제공되는 컬럼입니다.

Bloating - Table

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
Est. Rows추정 Row 수
Table Size테이블 크기
Bloat SizeBloat 크기
Bloat Ratio테이블 크기 대비 Bloat 비율(단위: %)
Collection Time데이터 수집 시각

Bloating - Index

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
Index인덱스 명
Table Size테이블 크기
Index Size인덱스 크기
Bloat SizeBloat 크기
Bloat Ratio인덱스 크기 대비 Bloat 비율(단위: %)
Index Scan Count인덱스 스캔 횟수
Collection Time데이터 수집 시각

Scan - Table

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
Access Count전체 접근 횟수(Full Scan + Index Scan)
Full Scan Ratio(%)전체 접근 중 Sequential Scan 비율
Full Scan CountSequential Scan 횟수
Full Scan TuplesSequential Scan으로 읽은 Tuple 수
Index Scan CountIndex Scan 횟수
Index Scan TuplesIndex Scan으로 읽은 Tuple 수
Collection Time데이터 수집 시각

Scan - Index

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
Index인덱스 명
Index Scan Count인덱스 스캔 횟수
Index Rows Fetched인덱스 스캔으로 테이블에서 가져온 Row 수
Index Entries Read인덱스에서 읽은 엔트리 수
Collection Time데이터 수집 시각

DML

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
dml_count전체 DML 수행 수(INSERT + UPDATE + DELETE)
Inserted TuplesINSERT된 Tuple 수
Updated TuplesUPDATE된 Tuple 수
Deleted TuplesDELETE된 Tuple 수
HOT Updated TuplesHOT(Heap-Only Tuple) Update된 Tuple 수
Collection Time데이터 수집 시각

Analyze Time

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
Last Analyze Time마지막 수동 Analyze 실행 시각
Last Autoanalyze Time마지막 자동 Analyze 실행 시각
Last Autovacuum Time마지막 자동 Vacuum 실행 시각
Analyze CountAnalyze 실행 횟수
Last Vacuum Time마지막 수동 Vacuum 실행 시각
Auto Analyze Count자동 Analyze 실행 횟수
Autovacuum Count자동 Vacuum 실행 횟수
Vacuum Count수동 Vacuum 실행 횟수
Rows Modified Since Analyze마지막 Analyze 이후 변경된 Row 수
Collection Time데이터 수집 시각

Age

Vacuum 대상 테이블의 Transaction Age를 표시합니다. Vacuum 대상이 없는 경우 조회되지 않습니다. Vacuum 대상은 다음 조건에 해당하는 테이블입니다.

  • Dead Tuple 수가 vacuum threshold(autovacuum_threshold + autovacuum_scale_factor × number-of-tuples)보다 많은 테이블

  • age(relfrozenxid)autovacuum_freeze_max_age보다 큰 테이블

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
xid_age테이블의 max age(가장 오래된 레코드의 XID age)
per_to_wraparoundXID Wraparound까지의 남은 여유 비율(단위: %)
dead_tuplesDead Tuple 수
autovacuum_vacuum_tuplesAutovacuum 트리거 기준 Tuple 수
Collection Time데이터 수집 시각

Dead Tuple

컬럼설명
DB데이터베이스 명
Schema스키마 명
Table테이블 명
Dead TuplesDead Tuple 수
Dead Tuple Ratio (%)전체 Tuple 중 Dead Tuple 비율
Live TuplesLive Tuple 수
Live Tuple Ratio (%)전체 Tuple 중 Live Tuple 비율
Total Relation Size테이블 전체 크기(인덱스 포함)
Total Tuples전체 Tuple 수(Dead + Live)
Collection Time데이터 수집 시각

Object Detail

테이블명 또는 인덱스명 링크를 클릭하면 Object Detail 창이 열려 오브젝트의 상세 정보를 확인할 수 있습니다. 상세 내용은 Object Detail을 참고하세요.

데이터 해석 가이드

Bloating

  • Bloat Ratio가 높은 테이블/인덱스: 불필요한 공간이 많음 → VACUUM FULL 또는 pg_repack으로 공간 회수 검토

  • Bloat Size가 큰 테이블: 절대적인 낭비 공간이 큼 → 디스크 사용량에 직접적인 영향

  • 인덱스의 Index Scan Count가 0이면서 Bloat Ratio가 높은 경우: 사용되지 않는 비대화된 인덱스 → 삭제 검토

Scan

  • Full Scan Ratio가 높은 테이블: Sequential Scan이 많음 → 인덱스 생성 검토

  • Index Scan Count가 0인 인덱스: 사용되지 않는 인덱스 → 삭제 검토(불필요한 인덱스는 DML 성능 저하 유발)

  • Full Scan Tuples가 높은 테이블: 대량의 Tuple을 순차 스캔 → 쿼리 최적화 또는 인덱스 추가

DML

  • dml_count가 높은 테이블: 시스템의 핵심 테이블 → 성능 영향이 큰 테이블로 우선 관리

  • Updated Tuples가 높은 테이블: Dead Tuple이 빠르게 발생 → Vacuum 주기 점검

  • HOT Updated Tuples가 낮고 Updated Tuples가 높은 테이블: HOT Update가 발생하지 않음 → 인덱스 구성 점검, fillfactor 조정 검토

Analyze Time

  • Last Autoanalyze Time이 오래된 테이블: 통계 정보가 최신이 아닐 수 있음 → 쿼리 플래너가 비효율적인 실행 계획 선택 가능

  • Rows Modified Since Analyze가 높은 테이블: Analyze 이후 많은 변경 발생 → 수동 ANALYZE 실행 검토

Age

  • per_to_wraparound가 높은 테이블: XID Wraparound 위험 → VACUUM FREEZE 실행
  • xid_ageautovacuum_freeze_max_age에 근접한 테이블: 강제 Autovacuum이 트리거될 수 있음 → 서비스 영향 최소화를 위해 사전에 수동 Vacuum 실행 검토

Dead Tuple

  • Dead Tuple Ratio가 높은 테이블: Vacuum이 필요한 상태 → VACUUM 실행

  • Dead Tuples가 많고 Total Relation Size도 큰 테이블: Bloat가 심할 가능성 → Bloating 탭에서 함께 확인

Vacuum 분석 활용

Vacuum 분석은 Top 오브젝트에서 제공하는 Bloating, Dead Tuple, Age 정보를 Vacuum 관점에서 시각적으로 재구성한 화면입니다. 두 화면은 동일한 데이터(pg_object_hour 시각에 수집)를 기반으로 하되, 분석 목적에 따라 다른 관점을 제공합니다.

두 화면의 차이점

비교 항목Top 오브젝트Vacuum 분석
분석 관점오브젝트(테이블/인덱스) 중심Vacuum 유지보수 중심
데이터 범위Bloating, Scan, DML, Analyze Time, Age, Dead Tuple 등 6가지Bloating, Dead Tuple, Age + Vacuum 실행 이력
표현 방식정렬 가능한 테이블 목록 (Top N)Summary 카드 + Top 5 차트 + 시계열 이력
고유 기능Scan/DML 분석, Object Detail, 인덱스 분석Vacuum Health Summary, Vacuum 실행 이력, 임계값 알림, DB 파라미터 조회

활용 가이드

  • 전반적인 Vacuum 상태 파악이 목적이라면 Vacuum 분석 화면에서 Summary 카드와 Top 5 차트로 빠르게 현황을 확인하세요.

  • 특정 테이블의 상세 분석이 필요하다면 Top 오브젝트 화면에서 다양한 탭과 정렬 기준으로 세밀하게 분석하세요.

  • Vacuum이 필요한 테이블 식별 후 원인 분석 시에는 두 화면을 함께 활용하면 효과적입니다.

    1. Vacuum 분석의 Dead Tuple Top 5에서 관리가 필요한 테이블을 식별합니다.

    2. Top 오브젝트의 DML 탭에서 해당 테이블의 UPDATE/DELETE 패턴을 확인합니다.

    3. Top 오브젝트의 Analyze Time 탭에서 마지막 Vacuum/Analyze 실행 시각을 확인합니다.

    4. Vacuum 분석의 Vacuum Execution History에서 Vacuum 실행 이력과 패턴을 확인합니다.

실전 활용 시나리오

시나리오 1. Bloat가 심한 테이블 찾기

  1. Bloating 탭 선택, 조회 기준을 bloat_ratio로 설정

  2. Bloat Ratio가 높은 상위 테이블 확인

  3. 해당 테이블의 VACUUM FULL 또는 pg_repack 실행 검토

시나리오 2. 인덱스가 필요한 테이블 찾기

  1. Scan 탭 선택, 조회 기준을 seq_scan으로 설정

  2. Full Scan Ratio가 높고 Access Count도 높은 테이블 확인

  3. 해당 테이블의 주요 쿼리를 분석하여 인덱스 생성 검토

시나리오 3. 불필요한 인덱스 찾기

  1. Scan > Index 탭 선택, 조회 기준을 idx_scan으로 설정

  2. Index Scan Count가 0인 인덱스 확인

  3. 해당 인덱스가 정말 사용되지 않는지 확인 후 삭제 검토(DML 성능 개선 효과)

시나리오 4. Vacuum이 필요한 테이블 찾기

  1. Dead Tuple 탭 선택, 조회 기준을 dead_tuple로 설정

  2. Dead Tuple Ratio가 높은 테이블 확인

  3. Analyze Time 탭에서 해당 테이블의 마지막 Vacuum 시각 확인

  4. 필요 시 수동 VACUUM 실행

시나리오 5. XID Wraparound 위험 테이블 확인

  1. Age 탭 선택, 조회 기준을 xid_age로 설정

  2. per_to_wraparound 비율이 높은 테이블 확인

  3. VACUUM FREEZE 실행으로 Transaction Age 초기화