在Postgresql 11中动态选择HASH分区

时间:2018-11-01 17:05:39

标签: postgresql hash database-partitioning postgresql-11

如何编写从父(分区)表中选择的选择查询,该表使用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. 使用辅助列存储(缓存)表达式值

还有更直接的方法吗?当我实际上要通过HASH进行分区时,我想摆脱PARTITION BY LIST,但是要做到这一点,我需要一种选择正确分区的方法,而无需编写动态SQL或使其变得比PARTITION BY LIST (hash_expression)更复杂。

0 个答案:

没有答案