В 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