PostgreSQL 데이터베이스, 테이블, 인덱스, 테이블스페이스 및 크기 조회 방법

1. 데이터베이스 조회

PostgreSQL에서 사용 가능한 데이터베이스 목록을 확인하려면 다음 명령어를 사용합니다.

playboy=> \l
        List of databases
   Name    |  Owner   | Encoding
-----------+----------+----------
 playboy   | postgres | UTF8
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8

특정 데이터베이스의 크기를 확인하려면 pg_database_size 함수를 사용합니다.

playboy=> SELECT pg_database_size('playboy');
 pg_database_size
------------------
          3637896

모든 데이터베이스의 크기를 한 번에 조회하려면 다음과 같이 pg_database 시스템 카탈로그를 활용합니다.

playboy=> SELECT pg_database.datname, pg_database_size(pg_database.datname) AS size FROM pg_database;
  datname  |  size
-----------+---------
 postgres  | 3621512
 playboy   | 3637896
 template1 | 3563524
 template0 | 3563524

크기를 사람이 읽기 쉬운 KB, MB, GB 형식으로 출력하려면 pg_size_pretty 함수를 사용합니다.

playboy=> SELECT pg_size_pretty(pg_database_size('playboy'));
 pg_size_pretty
----------------
 3553 kB

2. 테이블 목록 조회

현재 데이터베이스의 모든 테이블 목록을 보려면 \dt 메타 명령어를 사용합니다.

playboy=> \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+---------
 public | test | table | playboy

3. 단일 테이블 정보 및 크기

특정 테이블의 구조를 확인하려면 \d 메타 명령어를 사용합니다.

playboy=> \d test;
            Table "public.test"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | integer               | not null
 name   | character varying(32) |
Indexes: "playboy_id_pk" PRIMARY KEY, btree (id)

테이블의 실제 데이터 크기(인덱스 제외)를 확인하려면 pg_relation_size 함수를 사용합니다.

playboy=> SELECT pg_relation_size('test');
 pg_relation_size
------------------
                0

크기를 가독성 좋게 표현하려면 pg_size_pretty를 함께 사용합니다.

playboy=> SELECT pg_size_pretty(pg_relation_size('test'));
 pg_size_pretty
----------------
 0 bytes

테이블의 총 크기(인덱스, 토스트 데이터 포함)를 확인하려면 pg_total_relation_size 함수를 사용합니다.

playboy=> SELECT pg_size_pretty(pg_total_relation_size('test'));
 pg_size_pretty
----------------
 8192 bytes

4. 인덱스 조회

현재 데이터베이스의 모든 인덱스를 확인하려면 \di 메타 명령어를 사용합니다.

playboy=> \di
                List of relations
 Schema |     Name      | Type  |  Owner  | Table
--------+---------------+-------+---------+-------
 public | playboy_id_pk | index | playboy | test

특정 인덱스의 크기를 확인하려면 pg_relation_size 함수를 사용합니다.

playboy=> SELECT pg_size_pretty(pg_relation_size('playboy_id_pk'));
 pg_size_pretty
----------------
 8192 bytes

5. 테이블스페이스 조회

모든 테이블스페이스를 확인하려면 pg_tablespace 시스템 카탈로그를 조회합니다.

playboy=> SELECT spcname FROM pg_tablespace;
  spcname
------------
 pg_default
 pg_global

특정 테이블스페이스의 크기를 확인하려면 pg_tablespace_size 함수를 사용합니다.

playboy=> SELECT pg_size_pretty(pg_tablespace_size('pg_default'));
 pg_size_pretty
----------------
 14 MB

6. 데이터베이스 내 테이블별 디스크 사용량 상위 20개 조회

SELECT
    table_schema || '.' || table_name AS full_table_name,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS total_size
FROM information_schema.tables
ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC
LIMIT 20;

7. 데이터베이스별 디스크 사용량 상위 20개 조회

SELECT
    d.datname AS database_name,
    pg_catalog.pg_get_userbyid(d.datdba) AS owner,
    CASE
        WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
        ELSE 'No Access'
    END AS size
FROM pg_catalog.pg_database d
ORDER BY
    CASE
        WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(d.datname)
        ELSE NULL
    END DESC
LIMIT 20;

태그: PostgreSQL pg_database_size pg_relation_size pg_total_relation_size pg_tablespace_size

5월 22일 23:02에 게시됨