Как написать запрос на выборку, который выбирается из родительской (секционированной) таблицы, секционированной с использованием секционирования 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)
Альтернативы, которые я знаю
- Разделение списка по выражению
PARTITION BY LIST (col1 % 15)
, ... FOR VALUES IN (0)
, выбранное с помощью WHERE col1 % 15 = 0
- Использование вспомогательного столбца для хранения (кэширования) значения выражения
Есть ли более прямой путь? Я хочу уйти от PARTITION BY LIST
, когда я на самом деле создаю разделы по HASH, но для этого мне нужен способ выбрать правильный раздел без написания динамического SQL или сделать его еще более сложным, чем PARTITION BY LIST (hash_expression)
.