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

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

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

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

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

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

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

Каждая страница обычно равна 8kb. (Помните, что 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 reltoastidxid
             FROM pg_class
             WHERE oid = 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

Back to top

(С) Виктор Вислобоков, 2008-2023