Как создать таблицу в PostgreSQL с секционированием по нескольким столбцам?

Добрый день! <br/> Могли бы вы, пожалуйста, привести пример, чтобы прояснить, как будут поступать значения?
  • 28 августа 2024 г. 13:34
Ответы на вопрос 2
Добрый день!

Секционирование в PostgreSQL позволяет разделить таблицу на несколько более мелких, более управляемых частей (секции), что может улучшить производительность и управление данными. Для секционирования по нескольким столбцам можно использовать метод "последовательных секций" или "множественного секционирования".

Ниже приведен пример создания таблицы с секционированием по двум столбцам: `region` и `month`.

### Пример создания таблицы с секционированием

```sql
CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    region VARCHAR(50) NOT NULL,
    month INT NOT NULL,
    amount NUMERIC(10, 2) NOT NULL
) PARTITION BY LIST (region) PARTITION BY RANGE (month);

-- Создание секций для каждого региона и для определенных месяцев
CREATE TABLE sales_region_usa PARTITION OF sales FOR VALUES IN ('USA') PARTITION BY RANGE (month);
CREATE TABLE sales_region_usa_jan PARTITION OF sales_region_usa FOR VALUES FROM (1) TO (2);
CREATE TABLE sales_region_usa_feb PARTITION OF sales_region_usa FOR VALUES FROM (2) TO (3);
CREATE TABLE sales_region_usa_mar PARTITION OF sales_region_usa FOR VALUES FROM (3) TO (4);

CREATE TABLE sales_region_canada PARTITION OF sales FOR VALUES IN ('Canada') PARTITION BY RANGE (month);
CREATE TABLE sales_region_canada_jan PARTITION OF sales_region_canada FOR VALUES FROM (1) TO (2);
CREATE TABLE sales_region_canada_feb PARTITION OF sales_region_canada FOR VALUES FROM (2) TO (3);
CREATE TABLE sales_region_canada_mar PARTITION OF sales_region_canada FOR VALUES FROM (3) TO (4);
```

### Как поступают значения

При вставке записей в основную таблицу `sales`, PostgreSQL автоматически определяет, в какую секцию (раздел) нужно отправить данные, исходя из значений полей `region` и `month`.

Пример вставки данных:

```sql
INSERT INTO sales (region, month, amount) VALUES ('USA', 1, 1000.00);
INSERT INTO sales (region, month, amount) VALUES ('Canada', 2, 1500.00);
INSERT INTO sales (region, month, amount) VALUES ('USA', 3, 2000.00);
```

Каждая из этих вставок будет направлена в соответствующие секции `sales_region_usa_jan`, `sales_region_canada_feb`, и `sales_region_usa_mar`, соответственно, в зависимости от значений регионов и месяцев.

### Заключение

Это пример секционирования по двум столбцам. Обратите внимание, что начиная с PostgreSQL 11 введены новые возможности для секционирования, включая поддержку множественного секционирования. Если вы используете более раннюю версию PostgreSQL, возможности могут быть ограничены. Убедитесь, что используете последнюю версию PostgreSQL для получения всех возможностей секционирования.
К примеру у нас есть таблица sales, которую надо секционировать по столбцам date и region. 

CREATE TABLE sales (
    id serial PRIMARY KEY,
    date date NOT NULL,
    region text NOT NULL,
    amount numeric
) PARTITION BY RANGE (date, region);


Создадим секции для каждой комбинации диапазонов дат и регионов. Например, для региона "North" в диапазоне дат 2022 года.

CREATE TABLE sales_2022_north PARTITION OF sales
    FOR VALUES FROM ('2022-01-01', 'North') TO ('2023-01-01', 'North');


Для региона "South" в том же диапазоне дат.

CREATE TABLE sales_2022_south PARTITION OF sales
    FOR VALUES FROM ('2022-01-01', 'South') TO ('2023-01-01', 'South');
Похожие вопросы