关于统一多级分区表

    • 分区表结构统一。同一层上的每一个分区节点必须具有相同的层次结构。
    • 分区键约束必须一致且统一。在每一个子分区层次上,为每个分支创建的子表上的约束集必须匹配。

    可以用几种方式显示分区表的信息,包括显示来自这些来源的信息:

    • pg_partitions系统视图包含分区表结构的信息。
    • pg_constraint系统目录表包含表约束的信息。
    • psql元命令\d+ tablename显示一个分区表的叶子子表的表约束。

    上级主题: 关于GPORCA

    这个CREATE TABLE命令创建一个统一分区表。

    下面这些是为表mlp创建的子表和分区层次。这个层次由一个包含两个分支的子分区构成。

    1. mlp_1_prt_11_2_prt_usa
    2. mlp_1_prt_11_2_prt_europe
    3. mlp_1_prt_11_2_prt_asia
    4. mlp_1_prt_21_2_prt_usa
    5. mlp_1_prt_21_2_prt_europe
    6. mlp_1_prt_21_2_prt_asia

    作为一种快速检查,这个查询显示这些分区的约束。

    注意: 对于更复杂的分区表将需要修改该查询。例如,该查询不会对不同方案中的表名加以区分。

    consrc列显示子分区上的约束。mlp_1_prt_1中子分区的区域约束集合匹配mlp_1_prt_2中子分区的约束。year的约束继承自父分支表。

    1. --------------------------+------------------------------------
    2. mlp_1_prt_2_2_prt_asia | (region = 'asia'::text)
    3. mlp_1_prt_1_2_prt_asia | (region = 'asia'::text)
    4. mlp_1_prt_2_2_prt_europe | (region = 'europe'::text)
    5. mlp_1_prt_1_2_prt_europe | (region = 'europe'::text)
    6. mlp_1_prt_1_2_prt_usa | (region = 'usa'::text)
    7. mlp_1_prt_2_2_prt_usa | (region = 'usa'::text)
    8. mlp_1_prt_1_2_prt_europe | ((year >= 2006) AND (year < 2011))
    9. mlp_1_prt_2_2_prt_usa | ((year >= 2011) AND (year < 2016))
    10. mlp_1_prt_2_2_prt_asia | ((year >= 2011) AND (year < 2016))
    11. mlp_1_prt_2_2_prt_europe | ((year >= 2011) AND (year < 2016))
    12. (12 rows)

    如果用下面的命令对例子中的分区表增加一个默认分区:

    在上面的例子中,如果删除子分区mlp_1_prt_21_2_prt_asia并且为区域canada增加另一个子分区,则约束就不再统一。

    1. ALTER TABLE mlp ALTER PARTITION FOR (RANK(2))
    2. DROP PARTITION asia ;
    3. ADD PARTITION canada VALUES ('canada');

    还有,如果在mlp_1_prt_21之下增加一个分区canada,分区结构会变得不再统一。

    不过,如果对原始分区表的mlp_1_prt_21和mlp_1_prt_11都增加子分区canada,它就还是一个统一分区表。

    注意: 只有在一个分区级别上的分区集合的约束必须相同。这些分区的名称可以不同。