Documentation
📑 Ускорение БД
Партиции

Партиции

Партиционирование — это разбиение большой таблицы на части (партиции), чтобы быстрее искать, проще обслуживать и дешевле хранить данные.

partitions


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

Когда таблица огромная, полный скан становится дорогим. Партиции позволяют:

  • быстрее читать (сканируется только нужный кусок),
  • проще удалять/архивировать старые данные,
  • распараллеливать загрузку,
  • хранить «холодные» данные на дешёвом диске.

Виды партиционирования

Есть два базовых подхода:

1) Горизонтальное

Делим таблицу по строкам. Обычно по дате, региону или диапазону ID.

2) Вертикальное

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

Можно комбинировать, но это редкий кейс.


Методы партиционирования (PostgreSQL)

1) Range (по диапазону)

Когда: даты, интервалы, числовые диапазоны.

CREATE TABLE sales (
    id SERIAL,
    sale_date DATE NOT NULL,
    product_id INT,
    amount DECIMAL(10, 2)
) PARTITION BY RANGE (sale_date);
 
CREATE TABLE sales_q1_2023 PARTITION OF sales
    FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
 
CREATE TABLE sales_q2_2023 PARTITION OF sales
    FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');
 
CREATE TABLE sales_default PARTITION OF sales DEFAULT;

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


2) List (по списку значений)

Когда: категории, отделы, регионы.

CREATE TABLE employees (
    id SERIAL,
    name TEXT,
    department TEXT,
    salary DECIMAL(10, 2)
) PARTITION BY LIST (department);
 
CREATE TABLE employees_hr PARTITION OF employees
    FOR VALUES IN ('HR', 'Human Resources');
 
CREATE TABLE employees_it PARTITION OF employees
    FOR VALUES IN ('IT', 'Information Technology');
 
CREATE TABLE employees_default PARTITION OF employees DEFAULT;

Плюсы: легко понимать и поддерживать.
Минус: нужно заранее знать все значения.


3) Hash (по хэшу)

Когда: нет естественного диапазона, нужна равномерная нагрузка.

CREATE TABLE user_sessions (
    session_id UUID,
    user_id BIGINT,
    created_at TIMESTAMP,
    session_data JSONB
) PARTITION BY HASH (user_id);
 
CREATE TABLE user_sessions_p0 PARTITION OF user_sessions
    FOR VALUES WITH (MODULUS 4, REMAINDER 0);
 
CREATE TABLE user_sessions_p1 PARTITION OF user_sessions
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);

Плюсы: равномерное распределение.
Минус: хуже работает partition pruning.


Когда партиции реально полезны

  • таблица очень большая (десятки/сотни миллионов строк)
  • есть частые запросы по ключу партиции (обычно дата)
  • нужно быстро чистить или архивировать старые данные

Если таблица маленькая — партиции чаще дают лишнюю сложность.


Итог

Партиции — это не про ускорение всего подряд. Это способ сделать большую таблицу управляемой.

Если данные растут, лучше заранее продумать ключ партиционирования, иначе потом будет больно переносить.