Секционирование по диапазону, списку и хешу
Выберите подходящую стратегию секционирования: диапазон для временных рядов, список для арендаторов и хеш для равномерного распределения
«Секционирование по диапазону, списку и хешу» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Секционирование по диапазонам
Каждый раздел охватывает непрерывный диапазон значений. Чаще всего этот способ используется для временных рядов:
CREATE TABLE events (
id BIGSERIAL,
ts TIMESTAMPTZ NOT NULL,
data JSONB
) PARTITION BY RANGE (ts);
CREATE TABLE events_2024_q1 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');Границы диапазонов полуоткрытые
FROM включается в диапазон, а TO не включается. Границы согласуются без пересечений и пропусков.
Секционирование по списку
Каждый раздел содержит определённые значения:
CREATE TABLE customers (
id BIGSERIAL,
country TEXT NOT NULL,
name TEXT
) PARTITION BY LIST (country);
CREATE TABLE customers_us PARTITION OF customers FOR VALUES IN ('US');
CREATE TABLE customers_eu PARTITION OF customers FOR VALUES IN ('DE','FR','IT','ES','NL');
CREATE TABLE customers_other PARTITION OF customers DEFAULT;Раздел DEFAULT
Содержит строки, которые не соответствуют ни одному другому разделу. Без него INSERT для строк, не соответствующих разделам, завершается с ошибкой.
Хеш-секционирование
Строки распределяются с помощью хеширования ключа секционирования. Этот способ подходит, когда требуется равномерное распределение, но нет естественного диапазона или списка:
CREATE TABLE sessions (
id UUID,
user_id BIGINT,
data JSONB
) PARTITION BY HASH (user_id);
CREATE TABLE sessions_0 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE sessions_1 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE sessions_2 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE sessions_3 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 3);Выбор стратегии
- Диапазон — временные ряды и монотонно растущие идентификаторы
- Список — арендаторы, страны и часто используемые уровни
- Хеш — когда нет естественного перекоса и требуется только параллельная обработка
Субсекционирование
Разделы сами могут быть разделены на подразделы (многоуровневая структура):
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
PARTITION BY HASH (user_id);
-- 2024 is a yearly range partition, internally hashed by user_id.Индексы секционированных таблиц
Индексы родительской таблицы автоматически распространяются на все разделы. Ограничения UNIQUE должны включать ключ секционирования:
CREATE INDEX events_user_idx ON events (user_id);
-- Creates one index per partition automatically.
ALTER TABLE events ADD CONSTRAINT events_uniq UNIQUE (id, ts);
-- ts must be in the constraint because it's the partition key.Первичные ключи и разделы
PRIMARY KEY секционированной таблицы должен включать столбец секционирования. Это фундаментальное ограничение декларативного секционирования.
Добавление и удаление разделов
Недорогие операции:
CREATE TABLE events_2024_q3 PARTITION OF events
FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');
DROP TABLE events_2023_q1;
-- Instant; equivalent to deleting all old data.Автоматическое создание разделов
Postgres не создаёт будущие разделы автоматически. Распространённые решения:
- расширение pg_partman — управляемые ежемесячные разделы
- запланированная задача, которая создаёт следующий раздел с помощью CREATE
Внешние ключи
Внешние ключи к секционированной таблице требуют PG 12+. Внешние ключи FROM секционированной таблицы к обычной таблице работают как обычно.
Итоги
Три стратегии секционирования охватывают большинство случаев.
- Диапазон — для временных и последовательных данных
- Список — для дискретных наборов
- Хеш — для равномерного распределения
- PK должен включать столбец секционирования
Быстрая проверка
Вам нужно секционировать таблицу sessions по user_id с равномерным распределением и без естественного порядка. Какую стратегию выбрать?
Часто задаваемые вопросы
Урок «Секционирование по диапазону, списку и хешу» бесплатный?
Да — полный текст урока «Секционирование по диапазону, списку и хешу» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Секционирование по диапазону, списку и хешу»?
Выберите подходящую стратегию секционирования: диапазон для временных рядов, список для арендаторов и хеш для равномерного распределения Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Секционирование по диапазону, списку и хешу»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужно секционирование: отсечение и обслуживание
- Секционирование по диапазону, списку и хешу
- Отсоединение и присоединение секций
- Эффективные запросы к секционированным таблицам