본문 바로가기
서버구축 (WEB,DB)

PostgreSQL 데이터베이스 크기 및 테이블 용량 체크 SQL 쿼리

by 날으는물고기 2024. 7. 1.

PostgreSQL 데이터베이스 크기 및 테이블 용량 체크 SQL 쿼리

PostgreSQL High Performance Guide - Architecture

PostgreSQL에서 데이터 폴더의 용량이 과다하게 발생하는 원인을 파악하고 어디에서 얼마나 용량을 사용하고 있는지 확인하는 방법은 여러 가지가 있습니다. 다음은 그 방법들을 단계별로 설명합니다.

전체 데이터베이스 크기 확인

PostgreSQL에서는 모든 데이터베이스의 크기를 확인할 수 있는 SQL 쿼리를 제공합니다. 이를 통해 각 데이터베이스가 얼마나 많은 디스크 공간을 차지하고 있는지 파악할 수 있습니다.

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM pg_database
ORDER BY pg_database_size(pg_database.datname) DESC;

테이블별 용량 확인

개별 데이터베이스 내에서 각 테이블이 사용하는 디스크 공간을 확인하려면 아래 쿼리를 사용합니다.

SELECT relname AS "Table",
       pg_size_pretty(pg_total_relation_size(relid)) AS "Size",
       pg_size_pretty(pg_relation_size(relid)) AS "Table Size",
       pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "Index Size"
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

인덱스 크기 확인

데이터베이스에서 인덱스가 차지하는 공간을 확인하려면 다음 쿼리를 사용하세요.

SELECT idx.indrelid::regclass AS "Table",
       idx.indexrelid::regclass AS "Index",
       pg_size_pretty(pg_relation_size(idx.indexrelid)) AS "Index Size"
FROM pg_index AS idx
JOIN pg_class AS i ON i.oid = idx.indexrelid
JOIN pg_namespace AS ns ON ns.oid = i.relnamespace
WHERE ns.nspname = 'public'  -- 필요시 스키마 조정
ORDER BY pg_relation_size(idx.indexrelid) DESC;

더 많은 디스크 공간 사용의 원인 파악

  • WAL (Write Ahead Logging) 파일: PostgreSQL의 WAL 파일은 데이터베이스의 내구성을 보장하기 위해 사용되며, 때때로 많은 공간을 차지할 수 있습니다. pg_wal 디렉토리의 크기를 확인하세요.
  • TOAST (The Oversized-Attribute Storage Technique): 일부 데이터 유형은 기본 페이지 크기보다 크기 때문에 별도로 저장될 수 있습니다. TOAST 테이블 크기도 확인해야 할 수 있습니다.

불필요한 파일 정리

  • Vacuum과 Reindex: 데이터를 삭제하거나 많은 업데이트가 있었다면, VACUUM (가비지 컬렉션을 실행하여 불필요한 데이터를 정리) 및 REINDEX (효율성을 높이기 위해 인덱스를 재구성)를 고려해 보세요.
  • 로깅 설정 확인: PostgreSQL의 로깅 설정이 너무 세밀하게 설정되어 있으면 로그 파일이 많은 공간을 차지할 수 있습니다. /var/log/postgresql 또는 사용자가 설정한 로그 디렉토리의 로그 파일 크기를 확인하세요.

 

이 단계들을 통해 PostgreSQL 데이터베이스의 디스크 공간 사용 현황을 파악하고 필요에 따라 조치를 취할 수 있습니다.

 

PostgreSQL에서 데이터베이스 별로 테이블의 정보와 용량을 조회하려면 먼저 해당 데이터베이스에 연결되어 있어야 합니다. pg_catalog.pg_statio_user_tables 뷰는 현재 연결된 데이터베이스의 테이블 정보만을 제공합니다.

 

만약 "(0 rows)"라는 결과가 나왔다면, 현재 선택된 데이터베이스에 사용자 테이블이 없거나, 현재 접속된 데이터베이스가 잘못되었을 가능성이 있습니다. 올바른 데이터베이스에 연결되어 있는지 확인하고 다시 시도해 보세요.

 

데이터베이스를 선택하거나 변경하는 방법은 다음과 같습니다.

-- 데이터베이스 선택하기
\c your_database_name

여기서 your_database_name은 접속하고자 하는 데이터베이스 이름으로 대체해 주세요. 데이터베이스를 변경한 후에는 앞서 시도했던 테이블별 용량 확인 쿼리를 다시 실행해 보세요.

728x90

댓글