暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

OceanBase分布式存储管理Oracle模式创建二级分区表

2023-04-16
1969

创建模板化二级分区表

Oracle 模式下,创建模板化二级分区表的 SQL 语法如下:

CREATE TABLE [IF NOT EXISTS] table_name(column_option_list) partition_option_list;

column_option_list:
  column_name column_type [, column_name column_type]

partition_option:
  PARTITION BY 
    RANGE(column_name){subpartition_option} (range_partition_list)
   | LIST(expression){subpartition_option} (list_partition_list)
   | HASH(expression){subpartition_option} { (hash_partition_list)
                                             | PARTITIONS partition_count }

subpartition_option:
  SUBPARTITION BY 
    RANGE(column_name) SUBPARTITION TEMPLATE(range_subpartition_list)
   | LIST(expression) SUBPARTITION TEMPLATE(list_subpartition_list)
   | HASH(expression) { SUBPARTITION TEMPLATE (hash_subpartition_list)
                       | SUBPARTITIONS subpartition_count }

range_partition_list:
  range_partition [, range_partition ...]

range_partition:
  PARTITION partition_name VALUES LESS THAN {(expression_list) | MAXVALUE}

range_subpartition_list:
  range_subpartition [, range_subpartition ...]

range_subpartition:
  SUBPARTITION subpartition_name VALUES LESS THAN {(expression_list) | MAXVALUE}

list_partition_list:
  list_partition [, list_partition ...]

list_partition:
  PARTITION partition_name VALUES {(expression_list) | DEFAULT}

list_subpartition_list:
  list_subpartition [, list_subpartition ...]

list_subpartition:
  SUBPARTITION subpartition_name VALUES {(expression_list) | DEFAULT}

hash_partition_list:
    hash_partition [, hash_partition ...]

hash_partition:
    PARTITION partition_name

hash_subpartition_list:
    hash_subpartition [, hash_subpartition ...]

hash_subpartition:
    SUBPARTITION subpartition_name

expression_list:
  expression [, expression ...]

column_name_list:
  column_name [, column_name ...]

partition_count | subpartition_count:
  INT_VALUE
复制

说明

  • 模板化二级分区表的每个一级分区下的二级分区都按照模板中的二级分区定义,即每个一级分区下的二级分区的定义均相同。

  • 对于模板化二级分区表来说,二级分区的命名规则为 ($part_name)s($subpart_name)

例如:对于下⾯的 t_range_range 表,p0下的 3 个二级分区的分区名分别为 p0smp1p0smp2p0smp3

obclient> CREATE TABLE t_range_range(col1 INT,col2 INT)
       PARTITION BY RANGE(col1)
       SUBPARTITION BY RANGE(col2)
       SUBPARTITION TEMPLATE
       (SUBPARTITION mp1 VALUES LESS THAN(100),
        SUBPARTITION mp2 VALUES LESS THAN(200),
        SUBPARTITION mp3 VALUES LESS THAN(300)
        )
       (PARTITION p0 VALUES LESS THAN(2020),
        PARTITION p1 VALUES LESS THAN(2021),
        PARTITION p2 VALUES LESS THAN(2022)
        );
Query OK, 0 rows affected

obclient> SELECT table_name,partition_name,subpartition_name FROM USER_TAB_SUBPARTITIONS;
+---------------+----------------+-------------------+
| TABLE_NAME    | PARTITION_NAME | SUBPARTITION_NAME |
+---------------+----------------+-------------------+
| T_RANGE_RANGE | P0             | P0SMP1            |
| T_RANGE_RANGE | P0             | P0SMP2            |
| T_RANGE_RANGE | P0             | P0SMP3            |
| T_RANGE_RANGE | P1             | P1SMP1            |
| T_RANGE_RANGE | P1             | P1SMP2            |
| T_RANGE_RANGE | P1             | P1SMP3            |
| T_RANGE_RANGE | P2             | P2SMP1            |
| T_RANGE_RANGE | P2             | P2SMP2            |
| T_RANGE_RANGE | P2             | P2SMP3            |
+---------------+----------------+-------------------+
9 rows in set
复制

部分参数说明如下表所示。

参数说明
table_name指定表名。
column_name指定列名。
column_type指定列数据类型。
partition_name指定一级分区的名称。
subpartition_name指定二级分区的名称。
INT_VALUE指定 Hash 类型的二级分区的个数。

创建 Range + Range 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_m_rr(col1 INT,col2 INT)
       PARTITION BY RANGE(col1)
       SUBPARTITION BY RANGE(col2)
       SUBPARTITION TEMPLATE
         (SUBPARTITION mp0 VALUES LESS THAN(2020),
          SUBPARTITION mp1 VALUES LESS THAN(2021),
          SUBPARTITION mp2 VALUES LESS THAN(2022)
          )
         (PARTITION p0 VALUES LESS THAN(100),
          PARTITION p1 VALUES LESS THAN(200)
          );
Query OK, 0 rows affected
复制

创建 Range + List 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_m_rl(col1 INT,col2 VARCHAR2(50))
       PARTITION BY RANGE(col1)
       SUBPARTITION BY LIST(col2)
       SUBPARTITION TEMPLATE
         (SUBPARTITION mp0 VALUES('01'),
          SUBPARTITION mp1 VALUES('02'),
          SUBPARTITION mp2 VALUES('03')
          )
         (PARTITION p0 VALUES LESS THAN(100),
          PARTITION p1 VALUES LESS THAN(200)
          );
Query OK, 0 rows affected
复制

创建 Range + Hash 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_m_rh(col1 INT,col2 VARCHAR2(50))
       PARTITION BY RANGE(col1)
       SUBPARTITION BY HASH(col2) SUBPARTITIONS 5
        (PARTITION p0 VALUES LESS THAN(100),
         PARTITION p1 VALUES LESS THAN(200)
         );
Query OK, 0 rows affected
复制

创建 List + Range 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_m_lr(col1 INT,col2 varchar2(50))
       PARTITION BY LIST(col2)
       SUBPARTITION BY RANGE(col1)
       SUBPARTITION TEMPLATE
        (SUBPARTITION mp0 VALUES LESS THAN(100),
         SUBPARTITION mp1 VALUES LESS THAN(200),
         SUBPARTITION mp2 VALUES LESS THAN(300)
         )
        (PARTITION p0 VALUES('01'),
         PARTITION p1 VALUES('02')
         );
Query OK, 0 rows affected
复制

创建 List + List 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_m_ll(col1 INT,col2 varchar2(50))
       PARTITION BY LIST(col1)
       SUBPARTITION BY LIST(col2)
       SUBPARTITION TEMPLATE
       (SUBPARTITION mp0 VALUES('A'),
        SUBPARTITION mp1 VALUES('B'),
        SUBPARTITION mp2 VALUES('C')
        )
       (PARTITION p0 VALUES('01'),
        PARTITION p1 VALUES('02')
        );
Query OK, 0 rows affected
复制

创建 List + Hash 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_m_lh(col1 INT,col2 VARCHAR2(50))
       PARTITION BY LIST(col1)
       SUBPARTITION BY HASH(col2) SUBPARTITIONS 5
        (PARTITION p0 VALUES('01'),
         PARTITION p1 VALUES('02')
         );
Query OK, 0 rows affected
复制

创建 Hash + Range 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE tbl2_m_hr(col1 INT,col2 INT,col3 INT) 
       PARTITION BY HASH(col1)
       SUBPARTITION BY RANGE(col2)
       SUBPARTITION TEMPLATE
        (SUBPARTITION sp0 VALUES LESS THAN(100),
         SUBPARTITION sp1 VALUES LESS THAN(200),
         SUBPARTITION sp2 VALUES LESS THAN(300)
        )
        PARTITIONS 5;
Query OK, 0 rows affected
复制

创建 Hash + List 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE tbl2_m_hl(col1 INT,col2 INT,col3 INT) 
       PARTITION BY HASH(col1)
       SUBPARTITION BY LIST(col2)
       SUBPARTITION TEMPLATE
        (SUBPARTITION sp0 VALUES(100),
         SUBPARTITION sp1 VALUES(200),
         SUBPARTITION sp2 VALUES(300)
         )
        PARTITIONS 5;
Query OK, 0 rows affected
复制

创建 Hash +Hash 分区的模板化二级分区表

示例如下:

obclient> CREATE TABLE tbl2_m_hh(col1 INT,col2 INT,col3 INT) 
       PARTITION BY HASH(col1)
       SUBPARTITION BY HASH(col2)
        SUBPARTITIONS 3
        PARTITIONS 5;
Query OK, 0 rows affected
复制

创建非模板化二级分区表

Oracle 模式下,创建非模板化二级分区表的 SQL 语法如下:

CREATE TABLE [IF NOT EXISTS] table_name(column_option_list) partition_option_list;

column_option_list:
  column_name column_type [, column_name column_type]

partition_option_list:
  PARTITION BY 
    RANGE(column_name){subpartition_option}
      { range_partition_option (subpartition_option_list)
        [, range_partition_option (subpartition_option_list) ...]
       }
   | LIST(expression){subpartition_option}
       { list_partition_option (subpartition_option_list)
        [, list_partition_option (subpartition_option_list) ...]
        }
   | HASH(expression) {subpartition_option}
      { hash_partition_option (subpartition_option_list)
       [, hash_partition_option (subpartition_option_list) ...]
       }

subpartition_option:
  SUBPARTITION BY { RANGE(column_name) | LIST(expression) | HASH(expression) }

subpartition_option_list:
  range_partition_option_list | list_partition_option_list | hash_partition_option_list

range_partition_option_list:
  range_partition_option [, range_partition_option ...]

list_partition_option_list:
  list_partition_option [, list_partition_option ...]

hash_partition_option_list:
  hash_partition_option [, hash_partition_option ...]

range_partition_option:
  SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
  [,SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr ...]

list_partition_option:
  SUBPARTITION subpartition_name VALUES list_partition_expr
  [, SUBPARTITION subpartition_name VALUES list_partition_expr ...]

hash_partition_option_list:
  SUBPARTITION subpartition_name
  [, SUBPARTITION subpartition_name ...]
复制

说明

非模板化二级分区表的每个一级分区下的二级分区均可以自由定义,即每个一级分区下的二级分区的定义可以相同也可以不同。

部分参数说明如下表所示。

参数说明
table_name指定表名。
column_name指定列名。
column_type指定列数据类型。
partition_name指定一级分区的名称。
subpartition_name指定二级分区的名称。

创建 Range + Range 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT)
       PARTITION BY RANGE(col1)
       SUBPARTITION BY RANGE(col2)
        (PARTITION p0 VALUES LESS THAN(100)
          (SUBPARTITION sp0 VALUES LESS THAN(2020),
           SUBPARTITION sp1 VALUES LESS THAN(2021)
          ),
         PARTITION p1 VALUES LESS THAN(200)
          (SUBPARTITION sp2 VALUES LESS THAN(2020),
           SUBPARTITION sp3 VALUES LESS THAN(2021),
           SUBPARTITION sp4 VALUES LESS THAN(2022)
           )
         );
Query OK, 0 rows affected
复制

创建 Range + List 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_rl(col1 INT,col2 VARCHAR2(50))
       PARTITION BY RANGE(col1)
       SUBPARTITION BY LIST(col2)
       (PARTITION p0 VALUES LESS THAN(100)
         (SUBPARTITION sp0 VALUES('01'),
          SUBPARTITION sp1 VALUES('02')
          ),
        PARTITION p1 VALUES LESS THAN(200)
         (SUBPARTITION sp2 VALUES('01'),
          SUBPARTITION sp3 VALUES('02'),
          SUBPARTITION sp4 VALUES('03')
         )
        );
Query OK, 0 rows affected
复制

创建 Range + Hash 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_rh(col1 INT,col2 VARCHAR2(50))
       PARTITION BY RANGE(col1)
       SUBPARTITION BY HASH(col2)
       (PARTITION p0 VALUES LESS THAN(100)
         (SUBPARTITION sp0,
          SUBPARTITION sp1
          ),
        PARTITION p1 VALUES LESS THAN(200)
         (SUBPARTITION sp2,
          SUBPARTITION sp3,
          SUBPARTITION sp4
          )
        );
Query OK, 0 rows affected
复制

创建 List + Range 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_lr(col1 INT,col2 VARCHAR2(50))
       PARTITION BY LIST(col2)
       SUBPARTITION BY RANGE(col1)
       (PARTITION p0 VALUES('01')
         (SUBPARTITION sp0 VALUES LESS THAN(100),
          SUBPARTITION sp1 VALUES LESS THAN(200)
          ),
        PARTITION p1 VALUES('02')
         (SUBPARTITION sp2 VALUES LESS THAN(100),
          SUBPARTITION sp3 VALUES LESS THAN(200),
          SUBPARTITION sp4 VALUES LESS THAN(300)
          )
        );
Query OK, 0 rows affected
复制

创建 List + List 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_ll(col1 INT,col2 varchar2(50))
       PARTITION BY LIST(col1)
       SUBPARTITION BY LIST(col2)
       (PARTITION p0 VALUES ('01', '02')
         (SUBPARTITION sp0 VALUES ('A'),
          SUBPARTITION sp1 VALUES ('B'),
          SUBPARTITION sp2 VALUES ('C')
          )
,
        PARTITION p1 VALUES ('03', '04')
         (SUBPARTITION sp3 VALUES ('A'),
          SUBPARTITION sp4 VALUES ('B'),
          SUBPARTITION sp5 VALUES ('C')
          )
        );
Query OK, 0 rows affected
复制

创建 List +Hash 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_lh(col1 INT,col2 VARCHAR2(50))
       PARTITION BY LIST(col1)
       SUBPARTITION BY HASH(col2)
       (PARTITION p0 VALUES('01')
         (SUBPARTITION sp0,
          SUBPARTITION sp1
          ), 
        PARTITION p1 VALUES('02')
         (SUBPARTITION sp2,
          SUBPARTITION sp3,
          SUBPARTITION sp4
          )
        );
Query OK, 0 rows affected
复制

创建 Hash + Range 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE tbl2_f_hr(col1 INT,col2 INT,col3 INT)
       PARTITION BY HASH(col1)
       SUBPARTITION BY RANGE(col2)
        (PARTITION p0
         (SUBPARTITION sp0 VALUES LESS THAN(100),
          SUBPARTITION sp1 VALUES LESS THAN(200)),
        PARTITION p1
         (SUBPARTITION sp2 VALUES LESS THAN(100),
          SUBPARTITION sp3 VALUES LESS THAN(200)
         )
        );
Query OK, 0 rows affected
复制

创建 Hash + List 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_hl(col1 INT,col2 INT,col3 INT)
       PARTITION BY HASH(col1)
       SUBPARTITION BY LIST(col2)
        (PARTITION p0
          (SUBPARTITION sp0 VALUES(1,3),
           SUBPARTITION sp1 VALUES(4,7)
          ),
         PARTITION p1
          (SUBPARTITION sp2 VALUES(1,3),
           SUBPARTITION sp3 VALUES(4,7)
           )
        );
Query OK, 0 rows affected
复制

创建 Hash + Hash 分区的非模板化二级分区表

示例如下:

obclient> CREATE TABLE t2_f_hh(col1 INT,col2 INT,col3 INT)
       PARTITION BY HASH(col1)
       SUBPARTITION BY HASH(col2)
        (PARTITION p0
          (SUBPARTITION sp0,
           SUBPARTITION sp1
           ),
         PARTITION p1
          (SUBPARTITION sp2,
           SUBPARTITION sp3
           )
        );
Query OK, 0 rows affected
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论