PostgreSql дизайн разделов - PullRequest
       12

PostgreSql дизайн разделов

0 голосов
/ 30 апреля 2019

версия PostgreSQL - 11,2 Я должен создать разделы для таблицы, как

|ID|entity_id|group_name|   date     |other_values..|
|1 |    1    | A_GROUP  |2019-04-01  | ...........  |
|2 |    2    | B_GROUP  |2019-04-01  | ...........  |
|3 |    3    | C_GROUP  |2019-06-01  | ...........  |
|4 |    1    | Z_GROUP  |2019-05-01  | ...........  |
|5 |    2    | Y_GROUP  |2019-04-01  | ...........  |
|6 |    3    | I_GROUP  |2019-01-01  | ...........  |
|7 |    20   | W_GROUP  |2019-03-01  | ...........  |

Всего у меня несколько лет, 20 значений в entity_id и 50 групп. Набор групп различен для каждого entity_id. У него есть несколько миллионов строк и три параметра, которые я использую для выбора информации из них. Данные выбираются в диапазоне месяцев по двум параметрам entity_id и group_name. Разбить по месяцам довольно просто

CREATE TABLE head_partition_table PARTITION OF master_table 
FOR VALUES FROM (DATE_START) TO (DATE_END);

После этого добавим два других параметра, используя «RANGE BY»

CREATE TABLE head_partition_table PARTITION OF master_table 
FOR VALUES FROM (DATE_START) TO (DATE_END)
PARTITION BY RANGE (ENTITY_ID, GROUP_NAME);

В конце я должен добавить подразделы для каждого раздела

CREATE TABLE subpartition_table_0 OF head_partititon_table 
FOR VALUES ('1', 'A_GROUP') TO ('1', 'B_GROUP');
CREATE TABLE subpartition_table_0 OF head_partititon_table 
FOR VALUES ('1', 'B_GROUP') TO ('1', 'C_GROUP');

и так далее.

Проблема в множестве подразделов. За год I will create 12 * 20 * 50 = 12 k подразделов. Это много. Я думал, что решение будет установить не диапазон, а список значений. Нравится

CREATE TABLE subpartition_table OF head_partititon_table 
FOR VALUES ('1', 'A_GROUP');
CREATE TABLE subpartition_table OF head_partititon_table 
FOR VALUES  ('1', 'B_GROUP');

и это тоже плохо.

Последняя идея для меня - создать подразделы вроде

    CREATE TABLE head_partition_table PARTITION OF master_table 
    FOR VALUES FROM (DATE_START) TO (DATE_END)
    PARTITION BY RANGE (ENTITY_ID, GROUP_NAME);
CREATE TABLE subpartition_table_0 OF head_partititon_table 
    FOR VALUES ('1', 'A_GROUP') TO ('1', 'Z_GROUP');
    CREATE TABLE subpartition_table_0 OF head_partititon_table 
    FOR VALUES ('2', 'A_GROUP') TO ('2', 'Z_GROUP');
.................
    CREATE TABLE subpartition_table_0 OF head_partititon_table 
    FOR VALUES ('20', 'A_GROUP') TO ('20', 'Z_GROUP');

Итак, я понимаю, что разбиение должно выполняться по значениям, которые я собираюсь использовать в условии WHERE, но сейчас это выглядит плохо.

...