← Назад к вопросам
Есть ли разница при вложенном партиционировании?
3.0 Senior🔥 191 комментариев
#SQL и базы данных#Хранилища данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Вложенное партиционирование в хранилищах данных
Вложенное партиционирование (composite partitioning) — это когда таблица разбивается по нескольким ключам одновременно. Да, разница существенная.
Типы партиционирования
Простое партиционирование
-- Партиционирование только по дате
CREATE TABLE events (
id BIGINT,
event_type VARCHAR,
created_at DATE,
user_id BIGINT
)
PARTITION BY RANGE (created_at) (
PARTITION p_2026_01 VALUES LESS THAN (2026-02-01),
PARTITION p_2026_02 VALUES LESS THAN (2026-03-01),
PARTITION p_2026_03 VALUES LESS THAN (2026-04-01)
);
Вложенное партиционирование
-- Партиционирование по дате И регионам
CREATE TABLE events (
id BIGINT,
region VARCHAR,
created_at DATE,
user_id BIGINT
)
PARTITION BY RANGE (created_at)
SUBPARTITION BY LIST (region) (
PARTITION p_2026_01 VALUES LESS THAN (2026-02-01) (
SUBPARTITION p_2026_01_us VALUES IN (US),
SUBPARTITION p_2026_01_eu VALUES IN (EU),
SUBPARTITION p_2026_01_as VALUES IN (AS)
),
PARTITION p_2026_02 VALUES LESS THAN (2026-03-01) (
SUBPARTITION p_2026_02_us VALUES IN (US),
SUBPARTITION p_2026_02_eu VALUES IN (EU),
SUBPARTITION p_2026_02_as VALUES IN (AS)
)
);
Ключевые разницы
1. Pruning (отсечение партиций)
Простое партиционирование:
-- Отсечение: только январские данные
SELECT * FROM events WHERE created_at = 2026-01-15;
-- Сканирует: 1 партицию
Вложенное партиционирование:
-- Двойное отсечение: январь И US
SELECT * FROM events WHERE created_at = 2026-01-15 AND region = US;
-- Сканирует: 1 субпартицию (вместо 3 при простом партиционировании)
2. Размер партиций
- Простое: каждая партиция по дате может быть 1-10 GB (весь мир)
- Вложенное: каждая субпартиция 100-500 MB (только один регион)
Меньше размер = быстрее поиск, лучше cache hit rate.
3. Управление метаданными
- Простое: 12 партиций за год
- Вложенное: 12 × 3 = 36 субпартиций
ОС нужно хранить больше информации о структуре.
Когда использовать
Используй вложенное:
-- Большие таблицы (> 100 GB)
-- Запросы часто фильтруют по двум ключам
SELECT COUNT(*) FROM orders
WHERE order_date >= 2026-03-01 AND country = RU;
Используй простое:
-- Таблицы < 50 GB
-- Запросы фильтруют по одному ключу
SELECT COUNT(*) FROM logs WHERE log_date = 2026-03-26;
Практический пример в PostgreSQL
PostgreSQL не поддерживает встроенное вложенное партиционирование, но можно эмулировать:
-- Основная таблица (только по дате)
CREATE TABLE events_2026_03 PARTITION OF events
FOR VALUES FROM (2026-03-01) TO (2026-04-01);
-- Субтабли (по регионам внутри месяца)
CREATE TABLE events_2026_03_us PARTITION OF events_2026_03
FOR VALUES IN (US);
CREATE TABLE events_2026_03_eu PARTITION OF events_2026_03
FOR VALUES IN (EU);
Минусы вложенного партиционирования
- Сложность управления — больше партиций = больше скриптов для maintenance
- Медленнее вставки — нужно определить две координаты
- Фрагментация — если распределение неравномерно (например, 90% данных в одном регионе)
Вывод
Вложенное партиционирование эффективно для больших систем с множественными фильтрами, но требует тщательного планирования. На практике я использую его, когда таблица превышает 500 GB и запросы регулярно фильтруют по двум ключам одновременно.