0Pricing
SQL Academy · Урок

Зачем нужно секционирование: отсечение и обслуживание

Разберитесь в преимуществах секционирования: отсечении частей при выполнении запросов, ускоренном VACUUM и упрощённом архивировании

«Зачем нужно секционирование: отсечение и обслуживание» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Что такое секционирование

Разделение одной логической таблицы на множество физических таблиц (разделов), каждая из которых содержит подмножество строк. Запросы сканируют только подходящие разделы.

Зачем это нужно

Большие таблицы создают проблемы:

  • Индексы разрастаются, поиск замедляется
  • VACUUM выполняется часами
  • Резервное копирование занимает много времени
  • Некоторые запросы сканируют ненужные данные

Секционирование решает все четыре проблемы.

Отсечение разделов

Планировщик может SKIP разделы, которые не могут соответствовать условию WHERE:

EXPLAIN SELECT * FROM events
WHERE ts >= '2024-03-01' AND ts < '2024-04-01';
-- Only March partition scanned; older partitions skipped.
-- Plan rows: 1M, not 100B.

Когда использовать секционирование

Используйте секционирование, если:

  • Размер таблицы составляет 100 GB и более
  • У Вас есть естественный ключ секционирования (дата, арендатор, регион)
  • Большинство запросов фильтрует данные по этому ключу
  • Старые данные можно архивировать или удалять

Когда НЕ следует использовать секционирование

Не следует использовать секционирование только потому, что оно звучит интересно:

  • Таблицы размером менее нескольких GB не получают от него преимуществ
  • Если запросы не фильтруют данные по ключу секционирования, отсечение не выполняется
  • Это добавляет операционную сложность (необходимо управлять разделами)

Стратегии секционирования

PostgreSQL поддерживает три стратегии:

  • Диапазон — разделы охватывают диапазоны значений (даты, идентификаторы)
  • Список — разделы содержат определённые значения (страны, арендаторы)
  • Хеш — хеширование по модулю для равномерного распределения

Быстрое удаление раздела

Удаление раздела выполняется мгновенно — построчное удаление не требуется:

DROP TABLE events_2023;
-- 100GB gone in milliseconds, no VACUUM aftermath.

Упрощённое обслуживание

VACUUM, REINDEX и ANALYZE выполняются отдельно для каждого раздела. Окна обслуживания можно распределить между разделами вместо одной огромной пакетной операции.

Меньшие индексы для каждого раздела

У каждого раздела есть собственные индексы. B-дерево в разделе размером 1 GB имеет меньше уровней, чем в разделе размером 1 TB, поэтому поиск выполняется быстрее.

Секционирование — инструмент, а не волшебное решение

Производительность не повышается сама по себе: Вы получаете отсечение для запросов, фильтрующих данные по ключу секционирования, и более простое обслуживание. Если эти условия не выполняются, Вы лишь добавите сложности.

Встроенное (декларативное) секционирование PostgreSQL

Доступно начиная с PG 10. Каждый раздел является настоящей таблицей:

CREATE TABLE events (
  id BIGSERIAL,
  ts TIMESTAMPTZ NOT NULL,
  user_id BIGINT,
  data JSONB
) PARTITION BY RANGE (ts);

CREATE TABLE events_2024_01 PARTITION OF events
  FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');

До PG10: секционирование с наследованием

В устаревших системах используется наследование таблиц вместе с триггерами. Не применяйте этот подход в новом коде — декларативное секционирование проще и быстрее.

Итоги

Секционирование особенно полезно для больших таблиц, разделённых по времени или арендаторам.

  • Отсечение пропускает нерелевантные разделы
  • Обслуживание каждого раздела выполняется быстрее
  • DROP TABLE заменяет DELETE для 100 GB данных
  • Это не волшебное решение — оно помогает только тогда, когда запросы используют ключ секционирования

Быстрая проверка

Вы секционировали таблицу по месяцам и выполняете запрос SELECT * FROM events WHERE country = 'US' без фильтра по дате. Поможет ли секционирование?

Часто задаваемые вопросы

Урок «Зачем нужно секционирование: отсечение и обслуживание» бесплатный?

Да — полный текст урока «Зачем нужно секционирование: отсечение и обслуживание» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Зачем нужно секционирование: отсечение и обслуживание»?

Разберитесь в преимуществах секционирования: отсечении частей при выполнении запросов, ускоренном VACUUM и упрощённом архивировании Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Зачем нужно секционирование: отсечение и обслуживание»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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