添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
如果一个多级分区(MLP)表是一个 统一分区表 ,GPORCA支持在该MLP上的查询。多级分区表是用 SUBPARTITION 子句创建的分区表。统一分区表必须满足下面这些条件。
  • 分区表结构统一。同一层上的每一个分区节点必须具有相同的层次结构。
  • 分区键约束必须一致且统一。在每一个子分区层次上,为每个分支创建的子表上的约束集必须匹配。
  • CREATE TABLE mlp (id  int,  year int,  month int,  day int,
       region  text)
       DISTRIBUTED  BY (id)
        PARTITION BY RANGE ( year)
          SUBPARTITION  BY LIST (region)
            SUBPARTITION TEMPLATE (
              SUBPARTITION usa  VALUES ( 'usa'),
              SUBPARTITION europe  VALUES ( 'europe'),
              SUBPARTITION asia  VALUES ( 'asia'))
       (  START ( 2006)  END ( 2016) EVERY ( 5));
    下面这些是为表 mlp 创建的子表和分区层次。这个层次由一个包含两个分支的子分区构成。
    mlp_1_prt_11
       mlp_1_prt_11_2_prt_usa
       mlp_1_prt_11_2_prt_europe
       mlp_1_prt_11_2_prt_asia
    mlp_1_prt_21
       mlp_1_prt_21_2_prt_usa
       mlp_1_prt_21_2_prt_europe
       mlp_1_prt_21_2_prt_asia
    该表的层次是统一的,每个分区包含三个子表(子分区)的集合。区域子分区的约束也是统一的,分支表 mlp_1_prt_11 的子表上的约束集和分支表 mlp_1_prt_21 的子表的约束相同。

    作为一种快速检查,这个查询显示这些分区的约束。
    WITH tbl AS (SELECT oid, partitionlevel AS level, 
                 partitiontablename AS part 
             FROM pg_partitions, pg_class 
             WHERE tablename = 'mlp' AND partitiontablename=relname 
                AND partitionlevel=1 ) 
      SELECT tbl.part, consrc 
        FROM tbl, pg_constraint 
        WHERE tbl.oid = conrelid ORDER BY consrc;
    注意: 对于更复杂的分区表将需要修改该查询。例如,该查询不会对不同方案中的表名加以区分。 consrc 列显示子分区上的约束。 mlp_1_prt_1 中子分区的区域约束集合匹配 mlp_1_prt_2 中子分区的约束。year的约束继承自父分支表。

               part           |               consrc
    --------------------------+------------------------------------
     mlp_1_prt_2_2_prt_asia   | (region = 'asia'::text)
     mlp_1_prt_1_2_prt_asia   | (region = 'asia'::text)
     mlp_1_prt_2_2_prt_europe | (region = 'europe'::text)
     mlp_1_prt_1_2_prt_europe | (region = 'europe'::text)
     mlp_1_prt_1_2_prt_usa    | (region = 'usa'::text)
     mlp_1_prt_2_2_prt_usa    | (region = 'usa'::text)
     mlp_1_prt_1_2_prt_asia   | ((year >= 2006) AND (year < 2011))
     mlp_1_prt_1_2_prt_usa    | ((year >= 2006) AND (year < 2011))
     mlp_1_prt_1_2_prt_europe | ((year >= 2006) AND (year < 2011))
     mlp_1_prt_2_2_prt_usa    | ((year >= 2011) AND (year < 2016))
     mlp_1_prt_2_2_prt_asia   | ((year >= 2011) AND (year < 2016))
     mlp_1_prt_2_2_prt_europe | ((year >= 2011) AND (year < 2016))
    (12 rows)
    如果用下面的命令对例子中的分区表增加一个默认分区:
    ALTER TABLE mlp ADD DEFAULT PARTITION def
    该分区表仍然会是一个统一分区表。为默认分区创建的分支包含三个子表并且子表上的约束集匹配现有的子表约束集。

    在上面的例子中,如果删除子分区 mlp_1_prt_21_2_prt_asia 并且为区域 canada 增加另一个子分区,则约束就不再统一。
    ALTER TABLE mlp ALTER PARTITION FOR (RANK(2))
      DROP PARTITION asia ;
    ALTER TABLE mlp ALTER PARTITION FOR (RANK(2))
      ADD PARTITION canada VALUES ('canada');
    还有,如果在 mlp_1_prt_21 之下增加一个分区 canada ,分区结构会变得不再统一。

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

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