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_object | boolean | true | Top 오브젝트의 정보 수집 여부를 설정합니다. |
| pg_object_hour | int | 5 | Top 오브젝트의 정보를 수집 시각을 설정합니다. 기본값은 5이며 새벽 5시에 수집을 시작합니다. |
상세 옵션
| 설정 항목 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| table_bloat_ratio | int | 50 | 테이블 Bloating ratio 기준(단위: %) |
| table_bloat_bytes | int | 10485760 | 테이블 Bloating bytes 기준(10MB) |
| index_bloat_ratio | int | 50 | 인덱스 Bloating ratio 기준(단위: %) |
| index_bloat_bytes | int | 10485760 | 인덱스 Bloating bytes 기준(10MB) |
| autovacuum_list_limit | int | 50 | 가장 오래된 age(relfrozenxid) 순으로 설정값만큼 테이블 정보를 수집합니다. |
상세 옵션의 기준값에 따라 데이터가 수집되지 않거나, 너무 많이 수집될 수 있습니다. 워크로드 상황에 맞게 적절히 조정하세요.
데이터 수집 소스
각 분석 탭의 데이터는 PostgreSQL 시스템 카탈로그와 통계 뷰에서 수집됩니다.
| 탭 | 주요 소스 | 비고 |
|---|---|---|
| Bloating | pg_class, pg_stats, pg_stat_user_tables, pg_stat_user_indexes | Bloat 크기는 컬럼 통계(null_frac, avg_width)를 기반으로 추정 계산합니다. |
| Scan | pg_stat_user_tables, pg_stat_user_indexes | seq_scan, idx_scan 등 누적 스캔 횟수를 조회합니다. |
| DML | pg_stat_all_tables | n_tup_ins, n_tup_upd, n_tup_del 등 누적 DML 수행 수를 조회합니다. |
| Analyze Time | pg_stat_user_tables | last_vacuum, last_autovacuum, last_analyze, last_autoanalyze 등 실행 시각과 횟수를 조회합니다. |
| Age | pg_class, pg_stat_user_tables, pg_settings | age(relfrozenxid)로 테이블별 Transaction Age를 계산하고, autovacuum_freeze_max_age 설정과 비교합니다. |
| Dead Tuple | pg_class, pg_namespace | pg_stat_get_live_tuples(), pg_stat_get_dead_tuples() 함수로 Tuple 수를 조회합니다. |
TOP 오브젝트 분석하기
기본 옵션
상단 필터 영역에서 시간, 대상 인스턴스를 설정할 수 있습니다.
-
날짜: 조회할 날짜를 선택합니다. 좌우 화살표로 날짜를 이동할 수 있습니다.
-
인스턴스: 조회 대상 DB 인스턴스를 선택합니다.
-
조회 기준: 데이터를 정렬할 기준 컬럼을 선택합니다. 선택한 1차 탭에 따라 항목이 달라집니다.
-
조회 건수: 테이블에 표시할 건수를 설정합니다. (기본값: 50)
1차 탭 - 분석 기준
| 탭 | 설명 |
|---|---|
| Bloating | 테이블/인덱스의 Bloat 상태를 분석합니다. Bloat 비율이 높은 오브젝트를 식별합니다. |
| Scan | 테이블/인덱스의 스캔 패턴을 분석합니다. Sequential Scan과 Index Scan 비율을 확인합니다. |
| DML | INSERT, UPDATE, DELETE 등 DML 수행량을 분석합니다. |
| Analyze Time | 마지막 Analyze/Vacuum 실행 시각과 횟수를 확인합니다. |
| Age | 테이블의 Transaction Age를 분석합니다. XID Wraparound 위험이 있는 테이블을 식별합니다. |
| Dead Tuple | Dead Tuple이 많은 테이블을 분석합니다. Vacuum이 필요한 테이블을 식별합니다. |
2차 탭 - 오브젝트 유형
| 탭 | 설명 | 지원 1차 탭 |
|---|---|---|
| Table | 테이 블 단위로 분석합니다. | 모든 탭 |
| Index | 인덱스 단위로 분석합니다. | Bloating, Scan |
컬럼 안내
Vacuum 분석 화면에서 제공되는 컬럼입니다.
Bloating - Table
| 컬럼 | 설명 |
|---|---|
| DB | 데이터베이스 명 |
| Schema | 스키마 명 |
| Table | 테이블 명 |
| Est. Rows | 추정 Row 수 |
| Table Size | 테이블 크기 |
| Bloat Size | Bloat 크기 |
| Bloat Ratio | 테이블 크기 대비 Bloat 비율(단위: %) |
| Collection Time | 데이터 수집 시각 |
Bloating - Index
| 컬럼 | 설명 |
|---|---|
| DB | 데이터베이스 명 |
| Schema | 스키마 명 |
| Table | 테이블 명 |
| Index | 인덱스 명 |
| Table Size | 테이블 크기 |
| Index Size | 인덱스 크기 |
| Bloat Size | Bloat 크기 |
| 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 Count | Sequential Scan 횟수 |
| Full Scan Tuples | Sequential Scan으로 읽은 Tuple 수 |
| Index Scan Count | Index Scan 횟수 |
| Index Scan Tuples | Index 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 Tuples | INSERT된 Tuple 수 |
| Updated Tuples | UPDATE된 Tuple 수 |
| Deleted Tuples | DELETE된 Tuple 수 |
| HOT Updated Tuples | HOT(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 Count | Analyze 실행 횟수 |
| 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_wraparound | XID Wraparound까지의 남은 여유 비율(단위: %) |
| dead_tuples | Dead Tuple 수 |
| autovacuum_vacuum_tuples | Autovacuum 트리거 기준 Tuple 수 |
| Collection Time | 데이터 수집 시각 |
Dead Tuple
| 컬럼 | 설명 |
|---|---|
| DB | 데이터베이스 명 |
| Schema | 스키마 명 |
| Table | 테이블 명 |
| Dead Tuples | Dead Tuple 수 |
| Dead Tuple Ratio (%) | 전체 Tuple 중 Dead Tuple 비율 |
| Live Tuples | Live 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_age가autovacuum_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이 필요한 테이블 식별 후 원인 분석 시에는 두 화면을 함께 활용하면 효과 적입니다.
-
Vacuum 분석의 Dead Tuple Top 5에서 관리가 필요한 테이블을 식별합니다.
-
Top 오브젝트의 DML 탭에서 해당 테이블의 UPDATE/DELETE 패턴을 확인합니다.
-
Top 오브젝트의 Analyze Time 탭에서 마지막 Vacuum/Analyze 실행 시각을 확인합니다.
-
Vacuum 분석의 Vacuum Execution History에서 Vacuum 실행 이력과 패턴을 확인합니다.
-
실전 활용 시나리오
시나리오 1. Bloat가 심한 테이블 찾기
-
Bloating 탭 선택, 조회 기준을
bloat_ratio로 설정 -
Bloat Ratio가 높은 상위 테이블 확인
-
해당 테이블의
VACUUM FULL또는pg_repack실행 검토
시나리오 2. 인덱스가 필요한 테이블 찾기
-
Scan 탭 선택, 조회 기준을
seq_scan으로 설정 -
Full Scan Ratio가 높고Access Count도 높은 테이블 확인 -
해당 테이블의 주요 쿼리를 분석하여 인덱스 생성 검토
시나리오 3. 불필요한 인덱스 찾기
-
Scan > Index 탭 선택, 조회 기준을
idx_scan으로 설정 -
Index Scan Count가 0인 인덱스 확인 -
해당 인덱스가 정말 사용되지 않는지 확인 후 삭제 검토(DML 성능 개선 효과)
시나리오 4. Vacuum이 필요한 테이블 찾기
-
Dead Tuple 탭 선택, 조회 기준을
dead_tuple로 설정 -
Dead Tuple Ratio가 높은 테이블 확인 -
Analyze Time 탭에서 해당 테이블의 마지막 Vacuum 시각 확인
-
필요 시 수동
VACUUM실행
시나리오 5. XID Wraparound 위험 테이블 확인
-
Age 탭 선택, 조회 기준을
xid_age로 설정 -
per_to_wraparound비율이 높은 테이블 확인 -
VACUUM FREEZE실행으로 Transaction Age 초기화