← Назад к вопросам

Где могут применятся партиции?

1.0 Junior🔥 121 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Применение партиций в системах обработки данных

Партиции (разбиение) — это фундаментальная техника для оптимизации работы с большими объёмами данных. Партиции используются на разных уровнях архитектуры данных.

1. Партиции в файловых системах (HDFS, S3)

Данные хранятся по логическому принципу разделения:

/data/events/
  year=2024/
    month=01/
      day=15/
        events.parquet
    month=02/
      events.parquet
  year=2025/
    month=03/
      events.parquet

Преимущества:

  • Pruning: при запросе WHERE year=2024 AND month=03 система читает только нужные файлы
  • Ускорение на 10-100x в зависимости от объёма данных
  • Параллельная обработка разных партиций

2. Партиции в базах данных

Данные физически разделены в таблице:

CREATE TABLE events (
    id INT,
    user_id INT,
    event_date DATE,
    event_name VARCHAR(255)
) PARTITION BY RANGE (YEAR(event_date)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p2025 VALUES LESS THAN (2026)
);

Использование в PostgreSQL (через наследование или декларативное партиционирование):

CREATE TABLE orders (
    id BIGSERIAL PRIMARY KEY,
    user_id INT,
    created_at TIMESTAMP,
    amount DECIMAL
) PARTITION BY RANGE (created_at);

CREATE TABLE orders_2024_q1 PARTITION OF orders
    FOR VALUES FROM (2024-01-01) TO (2024-04-01);
CREATE TABLE orders_2024_q2 PARTITION OF orders
    FOR VALUES FROM (2024-04-01) TO (2024-07-01);

Преимущества:

  • Быстрый поиск (индекс только в нужной партиции)
  • Параллельное сканирование разных партиций
  • Удаление старых данных (DROP PARTITION вместо DELETE)

3. Партиции в распределённых системах обработки

Apache Spark:

df.write \
    .mode("overwrite") \
    .partitionBy("year", "month") \
    .parquet("/data/events")

Apache Flink:

source.map(...) \
    .keyBy(lambda x: x["user_id"]) \
    .process(MyProcessFunction()) \
    .sinkTo(sink)

4. Партиции в сообщественных системах

Apache Kafka:

producer.send(
    topic=events,
    value={user_id: 123, event: click},
    partition=hash(user_id) % num_partitions
)

Каждая тема поделена на несколько партиций:

  • Параллелизм: разные консумеры обрабатывают разные партиции
  • Масштабируемость: добавление партиций увеличивает throughput
  • Порядок сообщений: гарантирован в рамках одной партиции

5. Партиции в аналитических БД

Clickhouse:

CREATE TABLE events (
    timestamp DateTime,
    user_id UInt32,
    event_name String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, user_id)

Vertica, Greenplum, Redshift — все поддерживают партиционирование для ускорения queries.

6. Шаги выбора ключа партиции

  • Частые фильтры: если часто фильтруешь по дате, дата — ключ партиции
  • Равномерное распределение: ключ должен распределять данные равномерно
  • Стабильность: не менять ключ после создания (дорого)
  • Размер партиции: обычно 100MB - 1GB (оптимально для большинства систем)

Заключение

Партиции — это не опция, а необходимость для работы с большими данными. Правильный выбор ключа партиции может дать 10-100x ускорение запросов и значительно снизить затраты на хранение и обработку.

Где могут применятся партиции? | PrepBro