如何编写从父(分区)表中选择的选择查询,使用 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)
.