версия 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
, но сейчас это выглядит плохо.