Как партиционировать большую таблицу в PG 11?

В PostgreSQL 11 появилась новая функциональность для партиционирования таблиц - встроенная поддержка партиционирования таблицы. Партиционирование - это процесс разбиения большой таблицы на более мелкие, называемые разделами или партициями, чтобы улучшить производительность запросов и облегчить управление данными.

Процесс партиционирования можно разделить на несколько шагов:

1. Создание родительской таблицы: Сначала необходимо создать родительскую таблицу, которая будет служить контейнером для всех разделов. Родительская таблица должна содержать все столбцы, необходимые для всех разделов.

CREATE TABLE my_partitioned_table (
    id SERIAL,
    name TEXT,
    created_at TIMESTAMP
);

2. Создание разделов: На следующем шаге необходимо создать сами разделы. Разделы могут быть созданы с использованием специального ключевого слова PARTITION BY. В PostgreSQL 11 доступны несколько типов разделения, таких как разделение по диапазону, разделение по списку и разделение по хешу.

CREATE TABLE my_partitioned_table_2019 PARTITION OF my_partitioned_table FOR VALUES FROM ('2019-01-01') TO ('2020-01-01');
CREATE TABLE my_partitioned_table_2020 PARTITION OF my_partitioned_table FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');

3. Установка ограничений разделов: На этом этапе необходимо установить ограничения для каждого раздела. Это позволит PostgreSQL определить, в какой раздел необходимо вставить новые строки.

ALTER TABLE my_partitioned_table_2019 ADD CONSTRAINT my_partitioned_table_2019_check CHECK (created_at >= '2019-01-01' AND created_at < '2020-01-01');
ALTER TABLE my_partitioned_table_2020 ADD CONSTRAINT my_partitioned_table_2020_check CHECK (created_at >= '2020-01-01' AND created_at < '2021-01-01');

4. Управление разделами: После создания и настройки разделов таблицы необходимо управлять ими. Вы можете добавлять новые разделы, удалять существующие разделы, а также перемещать данные между разделами.

`sql
-- Добавление нового раздела
CREATE TABLE my_partitioned_table_2021 PARTITION OF my_partitioned_table FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');

-- Удаление раздела
DROP TABLE my_partitioned_table_2019;

-- Перемещение данных между разделами
ALTER TABLE my_partitioned_table_2020