Островок Капча
Островок Капча
Островок Капча

Как понять партиционирование: DWH для гуманитариев

Вместе с Никитой Егоровым, ведущим аналитиком в МТС Диджитал, объясняем принципы партиционирования простыми аналогиями, сравниваем с шардированием, разбираем стратегии разбиения данных и популярные инструменты (PostgreSQL, BigQuery, ClickHouse).

412 открытий5К показов
Как понять партиционирование: DWH для гуманитариев

В современном мире данные — основной ресурс для принятия решений. Компании хранят терабайты информации, которая ежедневно используется в аналитике, прогнозировании и отчетности. Однако без правильной организации данных даже самые мощные системы начинают тормозить, а запросы выполняются слишком долго.

Одна из ключевых технологий, позволяющих ускорить обработку данных, — партиционирование. Многие аналитики, не обладая техническим бэкграундом, воспринимают это как сложный термин, хотя на самом деле принцип достаточно прост. Вместе с Никитой Егоровым, ведущим дата-аналитиком в МТС Диджитал и автором тг-канала Дата аналитикс, мы разберемся, что такое партиционирование, чем оно отличается от шардирования, как правильно его применять и какие инструменты помогают работать с ним эффективнее.

Что такое партиционирование и зачем оно нужно?

Партиционирование — это разбиение больших таблиц на более мелкие части для ускорения запросов.

Представьте себе большой архив документов. Если все бумаги хранятся в одной стопке, найти нужный документ будет сложно и долго. Если же разложить их по папкам — например, по годам или отделам — поиск займет секунды.

Также работают базы данных: если таблицы слишком большие, система затрачивает много ресурсов на поиск нужной информации. Партиционирование позволяет хранить данные в отдельных «папках», сканируя только необходимые части, а не всю таблицу.

Даже если аналитик не пишет SQL-запросы вручную, понимание партиционирования помогает:

  • Ускорять работу отчетов — база данных обрабатывает только нужные данные, а не весь массив (данные за последний месяц, а не за 10 лет).
  • Эффективно взаимодействовать с инженерами DWH — осознанные запросы помогают оптимизировать хранилище.
  • Избегать «тяжелых» запросов — если таблицы не разбиты на партиции, отчеты могут выполняться слишком долго.

Партиционирование и шардирование: в чем разница?

Партиционирование часто путают с шардированием, хотя это разные вещи:

  • Партиционирование — разбиение данных внутри одной базы. Например, таблица с продажами разделяется по месяцам.
  • Шардирование — распределение данных по разным серверам. Например, пользователи из Европы хранятся в одной базе, из Азии — в другой.

Обе технологии помогают ускорить обработку данных, но работают на разных уровнях.

Как партиционирование помогает ускорить запросы?

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

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

Если таблица разбита по датам, то запрос:

			SELECT * FROM sales WHERE sale_date = '2025-03-01'

		

будет читать только нужную партицию, а не всю таблицу.

Основные стратегии партиционирования

  • По дате — самый популярный вариант для логов и транзакций;
  • По регионам — когда данные имеют географическую привязку;
  • По ID (например, user_id) — если важно равномерное распределение нагрузки.

Универсальный код для партиционирования:

			# Запись с партиционированием
df - ваш датафрейм
output_path = "hdfs://path/to/orc_partitioned_data"  # или локальный путь

df.write \
  .format("orc") \
  .partitionBy("date", "region", "user_id") \ #выбрать нужную колонку
  .mode("overwrite") \  # Если не сохранено для перезаписи - то создастся
  .save(output_path)

		

Какие инструменты помогают работать с партиционированием?

Спойлер: в топе будет BigQuery — там партиции настраиваются в пару кликов, а Google сам подсказывает, как оптимизировать запросы.

Но мы все равно расскажем о популярных решениях, которые сделают жизнь аналитиков проще.

PostgreSQL: Ручное партиционирование через PARTITION BY

Шаг 1: Создание партиционированной таблицы

			-- Создаем основную таблицу с партиционированием по дате (range partitioning)
CREATE TABLE sales (
    id SERIAL,
    sale_date DATE,
    region VARCHAR(50),
    amount NUMERIC(10, 2),
    PRIMARY KEY (id, sale_date)  -- PK должен включать колонку партиционирования!
) PARTITION BY RANGE (sale_date);

		

Шаг 2: Создание партиций

			-- Партиции по годам
CREATE TABLE sales_2023 PARTITION OF sales
    FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');

CREATE TABLE sales_2024 PARTITION OF sales
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
		

Шаг 3: Вставка данных (автоматически попадают в нужную партицию)

			INSERT INTO sales (sale_date, region, amount) VALUES ('2023-05-10', 'Europe', 100.50), ('2024-02-15', 'Asia', 200.75);
		

Шаг 4: Чтение данных (автоматический pruning)

			-- Запрос затронет только партицию `sales_2023`
 SELECT * FROM sales WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31';
		

Особенности PostgreSQL:

  • Требует явного создания партиций;
  • Поддерживает RANGE, LIST, HASH партиционирование; 
  • Можно добавлять/удалять партиции динамически (ALTER TABLE ... DETACH PARTITION).

Здесь же надо сказать, что оконные ранжирующие функции, которые содержат операцию PARTITION BY для получения ранга записи, это немного другое, но при выполнении запроса налету.

BigQuery: Автоматическое партиционирование

Создадим партиционированную таблицу:

			-- Автоматическое партиционирование по дате (наиболее популярный вариант)

CREATE TABLE `project.dataset.sales` 
PARTITION BY DATE(sale_date)  -- Также можно PARTITION BY TIMESTAMP_TRUNC(date_column, DAY/MONTH/YEAR) AS 
SELECT sale_date, 
              region, 
             amount 
FROM `source_table`;

-- BigQuery автоматически читает только нужные партиции 
SELECT * FROM `project.dataset.sales` WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31';

		

Особенности BigQuery:

  • Автоматическое управление партициями (не нужно создавать вручную); 
  • Лимит — 4000 партиций на таблицу; 
  • Кластеризация (дополнительная оптимизация) через CLUSTER BY region.

ClickHouse: Продвинутое партиционирование через PARTITION BY

Шаг 1: Создание партиционированной таблицы

			CREATE TABLE sales (
    id UInt32,
    sale_date Date,
    region String,
    amount Decimal(10, 2)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(sale_date)  -- Партиции по году и месяцу
ORDER BY (region, id);            -- Ключ сортировки (важен для производительности)

		

Шаг 2: Вставка данных

			INSERT INTO sales VALUES (1, '2023-05-10', 'Europe', 100.50), (2, '2023-06-15', 'Asia', 200.75);
		

Шаг 3: Чтение с pruning

			-- ClickHouse просканирует только партиции за май 2023 
SELECT * FROM sales WHERE sale_date BETWEEN '2023-05-01' AND '2023-05-31';
		

Особенности ClickHouse:

  • Гибкие ключи партиционирования (включая выражения);
  • Оптимизация под аналитические запросы (высокая скорость);
  • Ручное управление партициями (ALTER TABLE sales DROP PARTITION '202305').

Итоговые рекомендации:

PostgreSQL: Выбирайте для OLTP-систем, где важно ручное управление.
BigQuery: Идеален для аналитики в GCP (минимум настроек).
ClickHouse: Лучший выбор для высоконагруженных аналитических запросов.

Заключение

Партиционирование — один из ключевых инструментов, позволяющих оптимизировать работу с данными. Оно помогает значительно ускорить выполнение запросов, снизить нагрузку на базу данных и улучшить производительность аналитических отчетов.

Главное, что нужно запомнить:

  • Партиционирование — разбиение данных в одной базе, шардирование — распределение данных по разным серверам.
  • Выбор стратегии партиционирования зависит от типа данных и запросов: чаще всего используется разбиение по дате.
  • Разные DWH используют разные механизмы: PostgreSQL требует ручной настройки, BigQuery делает все автоматически, а ClickHouse дает максимальную гибкость.
Бонус: Если видите, что запрос тормозит, спросите инженера: «Эта таблица партицирована? Можно добавить партицию по моему фильтру?», — и вас сразу запомнят как продвинутого аналитика
Следите за новыми постами
Следите за новыми постами по любимым темам
412 открытий5К показов