воскресенье, 20 сентября 2020 г.

Размеры таблиц и индексов в БД PostgreSQL

Сегодня рассмотрим несколько команд для определения размеров различных сущностей в PostgreSQL.

Перед тем как начать - рассмотрим вспомогательную функцию pg_size_pretty(), которая:

Преобразует размер в байтах, представленный в 64-битном целом, в понятный человеку формат с единицами измерения

То есть вместо какого-то огромного числа байтов показывает понятную строчку, например:

select pg_size_pretty(100250408::bigint);
-- Вывод:
pg_size_pretty
text
--------------
96 MB

Теперь, вооружившись этой функцией, переходим к основным функциям.

Первое и самое нужное - размер таблицы PostgreSQL без учета индексов и прочих деталей. Для этого есть функция pg_relation_size(), принимающая в качестве аргумента название таблицы. Комбинируем ее с pg_size_pretty() и получаем:

select pg_size_pretty(pg_relation_size('my_table'));
-- Вывод (небольшая тестовая таблица в моей БД):
pg_size_pretty
text
--------------
48 kB

Далее - определим сколько места занимают все индексы для таблицы. Для этого есть функция pg_indexes_size(), также принимающая в качестве аргумента название таблицы:

select pg_size_pretty(pg_indexes_size('my_table'));
-- Вывод (опять же для некоей тестовой таблицы):
pg_size_pretty
text
--------------
88 kB

Функция pg_total_relation_size() определяет сколько места суммарно занимает таблица, ее индексы и данные TOAST, так что ее результат будет отличаться от суммы результатов двух предыдущих запросов.

Ну и чтобы не складывать на калькуляторе размеры всех таблиц и индексов - размер базы данных PostgreSQL определим с помощью pg_database_size():

select pg_size_pretty(pg_indexes_size('my_table'));
-- Вывод (опять же для некоей тестовой базы данных):
pg_size_pretty
text
--------------
8137 kB

Больше информации про описанные функции - здесь: https://postgrespro.ru/docs/postgrespro/12/functions-admin#FUNCTIONS-ADMIN-DBOBJECT