27.1. Определение использования диска#

27.1. Определение использования диска

27.1. Определение использования диска

Каждая таблица имеет основной файл на диске, где хранится большая часть данных. Если в таблице есть столбцы с потенциально широкими значениями, то также может быть связан файл TOAST, который используется для хранения значений, которые не помещаются в основную таблицу (см. Раздел 70.2). На таблице TOAST будет один допустимый индекс, если он присутствует. Также могут быть индексы, связанные с базовой таблицей. Каждая таблица и индекс хранятся в отдельном файле на диске, возможно, более чем в одном файле, если размер файла превышает один гигабайт. Правила именования для этих файлов описаны в Раздел 70.1.

Вы можете отслеживать свободное место на диске тремя способами: используя SQL-функции, перечисленные в Таблица 9.94, используя модуль oid2name, или используя ручную проверку системных каталогов. SQL-функции являются самыми простыми в использовании и обычно рекомендуются. Остаток этого раздела показывает, как это сделать, проверяя системные каталоги.

Используя psql на недавно проанализированной или очищенной базе данных, вы можете выполнять запросы для просмотра использования диска любой таблицы:

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

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

Каждая страница обычно составляет 8 килобайт. (Помните, что relpages обновляется только командами VACUUM, ANALYZE и некоторыми командами DDL, такими как CREATE INDEX). Имя пути к файлу интересно, если вы хотите изучить файл таблицы непосредственно.

Чтобы показать занимаемое пространство таблицами 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_index |       26

С помощью этой информации легко найти ваши самые большие таблицы и индексы:

SELECT relname, relpages
FROM pg_class
ORDER BY relpages DESC;

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