Перейти к содержанию

Размеры таблиц базы данных

Назначение

Команда table_sizes позволяет получить информацию о размерах таблиц PostgreSQL, оценку количества строк и дату последней модификации файла на диске. Полезна для:

  • мониторинга роста базы данных
  • поиска кандидатов на очистку (устаревшие бэкапы, временные таблицы)
  • анализа распределения данных по таблицам

Доступна как CLI-команда и как Python API.

Использование (CLI)

Базовый синтаксис

python manage.py table_sizes [опции]

Примеры команд

  1. Все таблицы, отсортированные по размеру (по убыванию):
python manage.py table_sizes
  1. Топ-20 самых больших таблиц:
python manage.py table_sizes --limit 20
  1. Таблицы по шаблону имени:
python manage.py table_sizes -p "fact__*"
  1. Несколько шаблонов:
python manage.py table_sizes -p "fact__*" -p "dim_*"
  1. Сортировка по имени:
python manage.py table_sizes --sort name
  1. Сортировка по дате модификации (старые сверху):
python manage.py table_sizes --sort date
  1. Инвертировать направление сортировки:
python manage.py table_sizes --sort date --desc
  1. Размер в гигабайтах:
python manage.py table_sizes --unit gb --limit 10
  1. Таблицы, не изменявшиеся с определённой даты:
python manage.py table_sizes --modified-lte 2025-12-20
  1. Таблицы за диапазон дат:
python manage.py table_sizes -p "fact__*" --modified-gte 2025-12-01 --modified-lte 2025-12-31

Параметры

Параметр Краткая форма Описание По умолчанию
--pattern -p fnmatch-шаблон имени таблицы. Можно указать несколько раз. все таблицы
--sort -s Поле сортировки: size, name, date size
--desc Инвертировать направление сортировки выключен
--unit -u Единица измерения: mb, gb mb
--limit -l Ограничить количество таблиц в выводе без ограничения
--modified-gte Только таблицы, изменённые не ранее даты (YYYY-MM-DD)
--modified-lte Только таблицы, изменённые не позднее даты (YYYY-MM-DD)

Направление сортировки

Каждое поле имеет «естественное» направление. Флаг --desc инвертирует его:

--sort По умолчанию С --desc
size по убыванию (DESC) по возрастанию (ASC)
name по возрастанию (ASC) по убыванию (DESC)
date по возрастанию (ASC) по убыванию (DESC)

Использование (Python API)

Функция get_table_sizes доступна для вызова из Python-кода:

from planiqum.core.management.commands.table_sizes import get_table_sizes

Сигнатура

def get_table_sizes(
    patterns: list[str] | None = None,
    sort_by: str = "size",
    reverse: bool | None = None,
    limit: int | None = None,
    modified_gte: str | datetime | None = None,
    modified_lte: str | datetime | None = None,
) -> list[dict]:

Параметры

Параметр Тип Описание
patterns list[str] \| None Список fnmatch-шаблонов имён таблиц
sort_by str Поле сортировки: "size", "name", "date"
reverse bool \| None Направление: None — дефолтное, True — DESC, False — ASC
limit int \| None Максимальное количество таблиц
modified_gte str \| datetime \| None Фильтр: изменены не ранее (строка "YYYY-MM-DD" или datetime)
modified_lte str \| datetime \| None Фильтр: изменены не позднее (строка "YYYY-MM-DD" или datetime)

Возвращаемое значение

Список словарей с ключами:

Ключ Тип Описание
table_name str Имя таблицы
total_bytes int Полный размер в байтах (данные + индексы)
row_estimate int Оценка количества строк
file_modified datetime \| None Дата последней модификации файла

Примеры

from planiqum.core.management.commands.table_sizes import get_table_sizes

# Топ-5 таблиц fact__*
tables = get_table_sizes(patterns=["fact__*"], limit=5)

# Таблицы, не трогавшиеся с декабря 2025 (дата строкой)
old_tables = get_table_sizes(modified_lte="2025-12-31", sort_by="date")

# Явное управление направлением сортировки
tables = get_table_sizes(sort_by="size", reverse=False)  # ASC — маленькие сверху

# Дата как datetime
from datetime import datetime
tables = get_table_sizes(modified_gte=datetime(2026, 1, 1))

Важные примечания

  1. Работает только с PostgreSQL.
  2. Количество строк (row_estimate) — оценка из pg_stat_user_tables.n_live_tup. Обновляется после ANALYZE. Если показывает 0 — выполните ANALYZE table_name.
  3. Дата модификации (file_modified) берётся из pg_stat_file — это дата последней модификации физического файла таблицы на диске. Для активных таблиц (частые INSERT/UPDATE/VACUUM FULL) дата будет свежей. Для забытых бэкапов она приближённо соответствует дате создания.
  4. Функция pg_stat_file требует прав суперпользователя или роли pg_read_server_files.
  5. Размер включает данные таблицы, все индексы и TOAST-данные (pg_total_relation_size).

Пример вывода

---------------------------------------------------------------------------------------------------
Table                                               Size (MB)  Rows (estimate)             Modified
---------------------------------------------------------------------------------------------------
dim_product__basic_level_backup_ec5f5e96             54964.97        9,187,194  2026-02-19 11:48:23
fact__demand__sellin_plan                            34343.27                0  2025-12-04 09:15:43
bench_main                                           22084.65       10,000,800  2026-02-24 11:40:38
---------------------------------------------------------------------------------------------------
TOTAL (3 tables)                                    111392.89       19,187,994
---------------------------------------------------------------------------------------------------