3

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

4

0 回答 0