子分区模板用于快速定义子分区,简化子分区的规范。您只需在子分区模板中定义一次子分区描述符,然后将该子分区模板应用于表中的每个分区,从而快速批量地为表中的分区定义子分区描述符。

注意事项

  • 如果分区未指定子分区描述符,系统将默认使用子分区模板来定义子分区。
  • 如果分区已指定子分区描述符,系统将默认使用该描述符定义子分区。
  • 如果分区未指定子分区描述符,也没有提供子分区模板,系统将默认将创建一个默认子分区。
  • 如果在子分区模板中指定了子分区名称,则对于使用该模板创建的子分区,名称为“分区名称_子分区模板名称”。例如:分区的名字为parta,子分区模板的名字为subpartb,拼接后生成的子分区名为parta_subpartb。

语法

  • 创建子分区模板1(通用语法)
    CREATE TABLE  table_definition PARTITION BY hash/range/list (column[, column ]...)
    SUBPARTITION BY hash/range/list (column[, column ]...)
    SUBPARTITION TEMPLATE (subpartition[, subpartition], ...)
    (table_partition[, table_partition]...);
  • 创建子分区模板2(仅适用于子分区是HASH分区类型的情况)
    CREATE TABLE  table_definition PARTITION BY hash/range/list (column[, column ]...)
    SUBPARTITION BY hash(column[, column ]...)
    SUBPARTITION TEMPLATE num
    (table_partition[, table_partition]...);
  • 创建子分区模板3(仅适用于分区和子分区都是HASH分区类型的情况)
    CREATE TABLE  table_definition PARTITION BY hash (column[, column ]...)
    SUBPARTITION BY hash(column[, column ]...)  PARTITIONS num SUBPARTITIONS num;
  • 修改子分区模板1(通用语法)
    ALTER TABLE  table_definition SUBPARTITION TEMPLATE (subpartition[, subpartition], ...)
  • 修改子分区模板2 (仅适用于子分区是HASH分区类型的情况)
    ALTER TABLE  table_definition SUBPARTITION TEMPLATE number
  • 删除子分区模板
    ALTER TABLE  table_definition SUBPARTITION TEMPLATE ()

示例

  • 创建子分区模板1(通用语法)
    CREATE TABLE shipments
    ( order_id      NUMBER NOT NULL,
      order_date    DATE NOT NULL,
      delivery_date DATE NOT NULL,
      customer_id   NUMBER NOT NULL,
      sales_amount  NUMBER NOT NULL
    )
    PARTITION BY RANGE (order_date) SUBPARTITION BY RANGE(delivery_date)
         SUBPARTITION TEMPLATE
       (SUBPARTITION e VALUES LESS THAN (TO_DATE('15-AUG-2006','dd-MON-yyyy')),
        SUBPARTITION a VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy')),
        SUBPARTITION l VALUES LESS THAN (MAXVALUE) )
       ( PARTITION p_2006_jul VALUES LESS THAN (TO_DATE('01-AUG-2006','dd-MON-yyyy')),
      PARTITION p_2006_aug VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy')),
      PARTITION p_2006_sep VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')),
      PARTITION p_2006_oct VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy')),
      PARTITION p_2006_nov VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy')),
      PARTITION p_2006_dec VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
    );
  • 创建子分区模板2(仅适用于子分区是HASH分区类型的情况)
    CREATE TABLE emp_sub_template (deptno NUMBER, empname VARCHAR(32), grade NUMBER)
         PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname)
         SUBPARTITION TEMPLATE  4
        (PARTITION p1 VALUES LESS THAN (1000),
         PARTITION p2 VALUES LESS THAN (2000),
         PARTITION p3 VALUES LESS THAN (6000)
        );
  • 创建子分区模板3 (仅适用于分区和子分区都是HASH分区类型的情况)
    CREATE TABLE hash_sub_template (deptno NUMBER, empname VARCHAR(32), grade NUMBER)
         PARTITION BY HASH(deptno) SUBPARTITION BY HASH(empname) PARTITIONS 4 SUBPARTITIONS 3;
  • 修改子分区模板1(通用语法)
    ALTER TABLE  hash_sub_template SET SUBPARTITION TEMPLATE
    (SUBPARTITION a1,
              SUBPARTITION b1,
              SUBPARTITION c1,
              SUBPARTITION d1);
  • 修改子分区模板2 (仅适用于子分区是HASH分区类型的情况)
    ALTER TABLE  hash_sub_template SET SUBPARTITION TEMPLATE 3;