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

Партиционирование таблицы иерархии (инструкция администратора)

Обзор

Партиционирование ускоряет работу с таблицей core_hierarchy_item, разбивая её на отдельные секции (LIST-партиции) по level_id. Таблица core_hierarchy_item_parents продолжает работать как обычная таблица.

Когда включать:

  • количество элементов иерархии превышает ~100 000;
  • отчёты и API активно фильтруют данные по уровням;
  • заметны признаки деградации производительности при операциях с иерархией.

Команды управления

partitioning_enable

python manage.py partitioning_enable [--no-triggers] [--no-backup] [--force]

Основные опции:

  • --no-triggers — не устанавливать автоматическое создание/удаление партиций;
  • --no-backup — не сохранять резервную копию исходной таблицы (core_hierarchy_item_old);
  • --force — пропустить подтверждение (для автоматизации).

Что делает команда:

  1. Создаёт партиционированную копию таблицы core_hierarchy_item.
  2. Формирует партиции вида core_hierarchy_item_level_<id> для всех уровней.
  3. Переносит данные и проверяет целостность.
  4. Переключает приложение на новую структуру и, при необходимости, сохраняет резервную копию.
  5. По умолчанию настраивает триггеры автоматического управления.

⚠️ Во время операции таблица блокируется. Рекомендуется запускать в плановое окно и иметь резервную копию БД.

После завершения можно проверить итоговое состояние командой:

python manage.py partitioning_status --verbose

Все строки отчёта должны относиться только к таблице core_hierarchy_item.

partitioning_disable

python manage.py partitioning_disable [--keep-partition-backup] [--cleanup-old-tables] [--force]

Опции:

  • --keep-partition-backup — оставить текущую партиционированную таблицу (будет переименована в core_hierarchy_item_partitioned_backup);
  • --cleanup-old-tables — удалить ранее сохранённые резервные таблицы с суффиксом _old;
  • --force — пропустить подтверждение.

Что делает команда:

  1. Снимает триггеры автоматического управления.
  2. Создаёт обычную таблицу core_hierarchy_item_new и восстанавливает индексы.
  3. Объединяет данные из всех партиций.
  4. Переключает схему обратно на непартиционированную структуру.
  5. По умолчанию удаляет партиции, резервная копия сохраняется только при --keep-partition-backup.

partitioning_sync

python manage.py partitioning_sync [--level-id <id>] [--drop-orphans] [--force]

Используется для ручного обновления партиций:

  • без параметров — создаёт недостающие и удаляет лишние партиции;
  • --level-id — создаёт партицию только для указанного уровня;
  • --drop-orphans — удаляет партиции без соответствующего уровня.

partitioning_status

python manage.py partitioning_status [--verbose]

Выводит текущий статус (включено/отключено, количество уровней, число партиций, наличие триггеров). С флагом --verbose показывает размер и количество строк по каждой партиции таблицы core_hierarchy_item.

Рекомендованный рабочий процесс

  1. Подготовка — убедитесь, что тесты пройдены и есть резервная копия БД.
  2. Включение — выполните partitioning_enable. После завершения при необходимости запустите partitioning_status --verbose.
  3. Ежедневная работа — партиции создаются автоматически при добавлении новых уровней. Для ручной проверки используйте partitioning_sync.
  4. Отключение — при необходимости откатиться выполните partitioning_disable. При желании сохраните партиционированный вариант как резервную копию (--keep-partition-backup).

Диагностика и восстановление

  • Если команда завершилась ошибкой, временные таблицы _new очищаются автоматически. При необходимости команду можно повторить.
  • Для полного ручного отката выполните partitioning_disable --cleanup-old-tables --force.
  • При возникновении проблем с отсутствующими партициями запустите partitioning_sync.

Дополнительные замечания

  • Таблица core_hierarchy_item_parents не партиционируется и не требует дополнительных действий.
  • После включения партиционирования все INSERT‑операции в core_hierarchy_item продолжают выполняться через ORM и существующие SQL-скрипты без изменений.
  • Для массовых загрузок рекомендуется предварительно вызвать partitioning_sync, чтобы создать партиции для новых уровней заранее.

Важно: описанные настройки и сценарии могут отличаться в вашей инсталляции Planiqum
За уточнениями и методологической поддержкой обращайтесь в компанию ЮНИК СОФТ