0Pricing
SQL Academy · Урок

Секционирование по диапазону, списку и хешу

Выберите подходящую стратегию секционирования: диапазон для временных рядов, список для арендаторов и хеш для равномерного распределения

«Секционирование по диапазону, списку и хешу» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужно секционирование: отсечение и обслуживание
  2. Секционирование по диапазону, списку и хешу
  3. Отсоединение и присоединение секций
  4. Эффективные запросы к секционированным таблицам
← Назад к SQL Academy