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

Зачем это нужно
Когда таблица огромная, полный скан становится дорогим. Партиции позволяют:
- быстрее читать (сканируется только нужный кусок),
- проще удалять/архивировать старые данные,
- распараллеливать загрузку,
- хранить «холодные» данные на дешёвом диске.
Виды партиционирования
Есть два базовых подхода:
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.
Когда партиции реально полезны
- таблица очень большая (десятки/сотни миллионов строк)
- есть частые запросы по ключу партиции (обычно дата)
- нужно быстро чистить или архивировать старые данные
Если таблица маленькая — партиции чаще дают лишнюю сложность.
Итог
Партиции — это не про ускорение всего подряд. Это способ сделать большую таблицу управляемой.
Если данные растут, лучше заранее продумать ключ партиционирования, иначе потом будет больно переносить.