Динамически выбрать раздел HASH в postgresql 11 - PullRequest
0 голосов
/ 01 ноября 2018

Как написать запрос на выборку, который выбирается из родительской (секционированной) таблицы, секционированной с использованием секционирования HASH (впервые в Postgresql 11), что означает выбор всех записей из одного раздела?

Пример: я хочу это

CREATE TABLE parent_table (
  col1
  .....
) PARTITION BY HASH (col1);

CREATE TABLE child_table_0
PARTITION OF parent_table FOR VALUES WITH (MODULUS 15, REMAINDER 0);

[...]

CREATE TABLE child_table_14
PARTITION OF parent_table FOR VALUES WITH (MODULUS 15, REMAINDER 14);

-- Query in question
EXPLAIN
SELECT
    *
FROM parent_table
WHERE some_undocumented_hash_expression(col1, 15) = C

Чтобы вернуть этот план

Append  (cost=0.00..67.44 rows=X width=Y)
  ->  Seq Scan on child_table_C  (cost=0.00..67.38 rows=X width=Y)
        Filter: ([?????????]=C)

Альтернативы, которые я знаю

  1. Разделение списка по выражению PARTITION BY LIST (col1 % 15), ... FOR VALUES IN (0), выбранное с помощью WHERE col1 % 15 = 0
  2. Использование вспомогательного столбца для хранения (кэширования) значения выражения

Есть ли более прямой путь? Я хочу уйти от PARTITION BY LIST, когда я на самом деле создаю разделы по HASH, но для этого мне нужен способ выбрать правильный раздел без написания динамического SQL или сделать его еще более сложным, чем PARTITION BY LIST (hash_expression).

...