29.1. 디스크 사용량 결정

각 테이블은 대부분의 데이터가 저장되는 1차 힙 디스크 파일을 갖고 있다. 테이블 칼럼의 값이 잠재적으로 큰 범위인 경우 메인 테이블에 잘 맞지 않는 값을 저장하는 데 사용되고 테이블에 연결된 TOAST 파일이 있을 수도 있다(65.2절 참조). 그런 경우에는, 유효 인덱스 1개가 TOAST 테이블에 존재한다. 또한 베이스 테이블에 연결된 인덱스도 있을 수 있다. 각 테이블 및 인덱스는 개별 디스크 파일에 저장된다. 파일 크기가 1기가바이트를 초과하는 경우에는 파일이 하나 이상일 수 있다. 이러한 파일의 네이밍 규칙은 65.1절에 설명되어 있다.

디스크 공간은 3가지 방법으로 모니터링할 수 있는데, 표 9-83에 나열된 SQL 함수를 사용하거나, oid2name 모듈을 사용하거나, 시스템 카탈로그 수동 검사를 사용할 수 있다. SQL 함수는 사용법이 매우 쉬워 보편적으로 권장된다. 이 절의 나머지 부분에서는 시스템 카탈로그를 검사하는 방법에 대해 설명한다.

최근 vacuum되었거나 분석된 데이터베이스에서 psql을 사용하면 쿼리를 실행하여 임의의 테이블에서 디스크 사용량을 볼 수 있다.

SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer';

 pg_relation_filepath | relpages
----------------------+----------
 base/16384/16806     |       60
(1 row)

각 페이지는 일반적으로 8킬로바이트이다. (relpagesVACUUMANALYZE, CREATE INDEX 같은 몇 가지 DDL 명령으로만 업데이트된다.) 파일 경로명은 테이블의 디스크 파일을 직접 검사하려는 경우에 중요하다.

TOAST 테이블에서 사용하는 공간을 표시하려면 다음과 같은 쿼리를 사용한다.

SELECT relname, relpages
FROM pg_class,
     (SELECT reltoastrelid
      FROM pg_class
      WHERE relname = 'customer') AS ss
WHERE oid = ss.reltoastrelid OR
      oid = (SELECT indexrelid
             FROM pg_index
             WHERE indrelid = ss.reltoastrelid)
ORDER BY relname;

       relname        | relpages
----------------------+----------
 pg_toast_16806       |        0
 pg_toast_16806_index |        1

인덱스 크기를 손쉽게 표시할 수도 있다.

SELECT c2.relname, c2.relpages
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 'customer' AND
      c.oid = i.indrelid AND
      c2.oid = i.indexrelid
ORDER BY c2.relname;

       relname        | relpages
----------------------+----------
 customer_id_indexdex |       26

이 정보를 이용하면 최대 크기의 테이블과 인덱스를 찾을 때 용이하다.

SELECT relname, relpages
FROM pg_class
ORDER BY relpages DESC;

       relname        | relpages
----------------------+----------
 bigtable             |     3290
 customer             |     3144