DBAtlas · Атлас эксплуатации баз данных

Решение: какая стратегия секционирования?

Секционирование разбивает большую таблицу на несколько физических частей под одним логическим именем, упрощая удаление старых данных и позволяя запросам обращаться только к нужным частям (partition pruning). Однако на небольших таблицах оно лишь добавляет сложности. Это дерево сначала проверяет, действительно ли нужно секционирование, а затем ведёт к выбору между Range, List, Hash и Composite в зависимости от паттернов доступа и распределения.

Действительно ли таблица настолько велика, что нужно секционирование?

Секционирование — не волшебство для производительности, а инструмент масштаба и обслуживания (жизненного цикла). Если таблица недостаточно велика или запросы уже хорошо работают с индексами, секционирование приносит лишь сложность планов и накладные расходы на управление. Ваша таблица достигает десятков миллионов+ строк/сотен ГБ или пока небольшая/средняя?

  • Да, она очень большая и/или старые данные нужно массово удалять/архивировать
  • Нет, таблица небольшая/средняя, или я не уверен

Как вы обращаетесь к данным и как их следует разделить?

Ключом секционирования должен быть столбец, по которому фильтрует большинство запросов; только тогда срабатывает отсечение секций. Каков преобладающий паттерн доступа? По датам/последовательным диапазонам (последние 30 дней), по определённым значениям категории/региона, или явного фильтра нет и нужно равномерно распределить нагрузку?

  • Последовательные диапазоны, такие как дата/порядковый номер (последние X дней, по месяцам)
  • Дискретные наборы значений, такие как категория/регион/арендатор
  • Нет явного диапазона/категории; цель — равномерно распределить нагрузку
  • И дата, и большой объём; нужно делить по двум измерениям

Рекомендация: не секционировать (пока)

На небольших/средних таблицах секционирование не даёт выгоды; достаточно правильно подобранных индексов и обычного обслуживания. Преждевременное секционирование усложняет планы запросов, теряет отсечение секций при неверном ключе и добавляет операционные накладные расходы.

Рекомендация: секционирование по диапазонам (Range)

Секционирование по диапазонам делит строки по последовательным диапазонам столбца (например, диапазоны дат: одна секция на месяц/квартал). Это самая распространённая и мощная стратегия для временных рядов и постоянно растущих таблиц.

Рекомендация: секционирование по списку (List)

Секционирование по списку группирует строки по дискретным известным значениям столбца (например, region = 'TR','EU','US' или ID арендатора). Когда есть естественные конечные категории, оно делает доступ и управление понятными.

Рекомендация: хеш-секционирование (равномерное распределение)

Хеш-секционирование распределяет строки относительно равномерно по заранее заданному числу секций на основе хеша ключевого столбца. Используется, чтобы избежать горячих точек и сбалансировать нагрузку, когда нет естественного диапазона/категории.

Рекомендация: составное (многоуровневое) секционирование

Составное секционирование сочетает две стратегии: сначала делит на верхнем уровне, затем разбивает каждую секцию на подсекции (например, Range-by-Hash или Range-by-List). Используется, когда одновременно нужны жизненный цикл по времени и равномерное распределение/разделение по категориям.

Открыть в DBAtlas →