Решение: какая стратегия секционирования?
Секционирование разбивает большую таблицу на несколько физических частей под одним логическим именем, упрощая удаление старых данных и позволяя запросам обращаться только к нужным частям (partition pruning). Однако на небольших таблицах оно лишь добавляет сложности. Это дерево сначала проверяет, действительно ли нужно секционирование, а затем ведёт к выбору между Range, List, Hash и Composite в зависимости от паттернов доступа и распределения.
Действительно ли таблица настолько велика, что нужно секционирование?
Секционирование — не волшебство для производительности, а инструмент масштаба и обслуживания (жизненного цикла). Если таблица недостаточно велика или запросы уже хорошо работают с индексами, секционирование приносит лишь сложность планов и накладные расходы на управление. Ваша таблица достигает десятков миллионов+ строк/сотен ГБ или пока небольшая/средняя?
- Да, она очень большая и/или старые данные нужно массово удалять/архивировать
- Нет, таблица небольшая/средняя, или я не уверен
Как вы обращаетесь к данным и как их следует разделить?
Ключом секционирования должен быть столбец, по которому фильтрует большинство запросов; только тогда срабатывает отсечение секций. Каков преобладающий паттерн доступа? По датам/последовательным диапазонам (последние 30 дней), по определённым значениям категории/региона, или явного фильтра нет и нужно равномерно распределить нагрузку?
- Последовательные диапазоны, такие как дата/порядковый номер (последние X дней, по месяцам)
- Дискретные наборы значений, такие как категория/регион/арендатор
- Нет явного диапазона/категории; цель — равномерно распределить нагрузку
- И дата, и большой объём; нужно делить по двум измерениям
Рекомендация: не секционировать (пока)
На небольших/средних таблицах секционирование не даёт выгоды; достаточно правильно подобранных индексов и обычного обслуживания. Преждевременное секционирование усложняет планы запросов, теряет отсечение секций при неверном ключе и добавляет операционные накладные расходы.
Рекомендация: секционирование по диапазонам (Range)
Секционирование по диапазонам делит строки по последовательным диапазонам столбца (например, диапазоны дат: одна секция на месяц/квартал). Это самая распространённая и мощная стратегия для временных рядов и постоянно растущих таблиц.
Рекомендация: секционирование по списку (List)
Секционирование по списку группирует строки по дискретным известным значениям столбца (например, region = 'TR','EU','US' или ID арендатора). Когда есть естественные конечные категории, оно делает доступ и управление понятными.
Рекомендация: хеш-секционирование (равномерное распределение)
Хеш-секционирование распределяет строки относительно равномерно по заранее заданному числу секций на основе хеша ключевого столбца. Используется, чтобы избежать горячих точек и сбалансировать нагрузку, когда нет естественного диапазона/категории.
Рекомендация: составное (многоуровневое) секционирование
Составное секционирование сочетает две стратегии: сначала делит на верхнем уровне, затем разбивает каждую секцию на подсекции (например, Range-by-Hash или Range-by-List). Используется, когда одновременно нужны жизненный цикл по времени и равномерное распределение/разделение по категориям.