Определение использования диска
Эта страница переведена при помощи нейросети GigaChat.
Каждая таблица имеет основной файл кучи на диске, где хранится большая часть данных. Если у таблицы есть какие-либо столбцы с потенциально большими значениями, также может быть связан файл TOAST с таблицей, который используется для хранения значений, слишком больших для удобного размещения в основной таблице (см. раздел «TOAST»). Будет один действительный индекс на таблицу TOAST, если она существует. Также могут быть индексы, связанные с базовой таблицей. Каждая таблица и индекс хранятся в отдельном файле на диске – возможно, более чем в одном файле, если размер файла превысит один гигабайт. Конвенции именования этих файлов описаны в разделе «Макет файлов базы данных».
Можно контролировать дисковое пространство тремя способами: с использованием функций 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