二级分区表 
==========================

二级分区是按照两个维度来把数据拆分成分区的操作。最常用的地方是类似用户账单的场景。

OceanBase 数据库目前支持 Hash、Range 和 List 三种分区⽅式，MySQL 模式下还支持 Key、Range Columns 和 List Columns 三种分区方式，并且支持任意两种分区方式的组合。

当前 MySQL 模式和 支持的二级分区如下：

* Hash + Hash 分区

  

* Hash + Range 分区

  

* Hash+ List 分区

  

* Range + Hash 分区

  

* Range +Range 分区

  

* Range +List 分区

  

* List+ Hash 分区

  

* List+Range 分区

  

* List+List 分区

  

* Hash +Key 分区

  

* Hash +Range Columns 分区

  

* Hash +List Columns 分区

  

* Range +Key 分区

  

* Range +Range Columns 分区

  

* Range +List Columns 分区

  

* List+Key 分区

  

* List+Range Columns 分区

  

* List+List Columns 分区

  

* Key +Hash 分区

  

* Key +Range 分区

  

* Key+List 分区

  

* Key +Range Columns 分区

  

* Key +List Columns 分区

  

* Range Columns+Hash分区

  

* Range Columns+Range 分区

  

* Range Columns+List 分区

  

* Range Columns+Key 分区

  

* Range Columns+List Columns 分区

  

* List Columns +Hash 分区

  

* List Columns +Range 分区

  

* List Columns +List 分区

  

* List Columns +Key 分区

  

* List Columns +Range Columns 分区

  




当前，⼆级分区表可分为模板化二级分区表和非模板化二级分区表。

创建模板化二级分区表 
-------------------------------

模板化⼆级分区表的每个⼀级分区下的⼆级分区都按照模板中的⼆级分区定义，即每个⼀级分区下的⼆级分区定义均相同。

语法如下：

```sql
CREATE TABLE ....
partition BY [hash|range|list] (column_list)
subpartition BY [hash|range|list] (column_list)
subpartition template
(
subpartition subpart_name subpartition_define
, ...
 )
 (
 partition part_name partition_define
 , ...
 
```



对于模板化⼆级分区表来说，⼆级分区的命名规则为 ($part_name)s($subpart_name) 。

例如，对于下⾯的 `t_range_range` 表，`p0` 下的 3 个⼆级分区的分区名分别为 `p0srp1`、`p0srp2`、`p0srp3`。

```sql
obclient> CREATE TABLE t_range_range (c1 int, c2 int, c3 int) partition BY range(c1)
subpartition BY range (c2)
subpartition template
(
subpartition rp1 VALUES less than (100),
subpartition rp2 VALUES less than (200),
subpartition rp3 VALUES less than (300)
)
(
partition p0 VALUES less than (100),
partition p1 VALUES less than (200),
partition p2 VALUES less than (300)
);
```



创建非模板化二级分区表 
--------------------------------

⾮模板化⼆级分区表的每个⼀级分区下的⼆级分区均可以⾃由定义，即每个⼀级分区下的⼆级分区的定义可以相同也可以不同。

```sql
CREATE TABLE ....
partition BY [hash|range|list] (column_list)
subpartition BY [hash|range|list] (column_list)
(
  partition part_name partition_define
     (
    subpartition subpart_name subpartition_define
    , ...
    )
   , ...
 )
```



对于⾮模板化⼆级分区表来说，⼆级分区的分区名即为⾃定义的分区名。

例如，对于下⾯的 `t_range_range1` 表，p0 下的 3个⼆级分区的分区名分别是 `p0_r1`、`p0_r2`、`p0_r3`。

```sql
obclient> CREATE TABLE t_range_range1 (c1 int, c2 int, c3 int) partition BY range(c1)
subpartition BY range (c2)
(
 partition p0 VALUES less than (100)
 (
 subpartition p0_r1 VALUES less than (100),
 subpartition p0_r2 VALUES less than (200),
 subpartition p0_r3 VALUES less than (300)
 ),
 partition p1 VALUES less than (200)
 (
 subpartition p1_r1 VALUES less than (100),
 subpartition p1_r2 VALUES less than (200),
 subpartition p1_r3 VALUES less than (300)
 ),
 partition p2 VALUES less than (300)
 (
 subpartition p2_r1 VALUES less than (100),
 subpartition p2_r2 VALUES less than (200),
 subpartition p2_r3 VALUES less than (300)
 )
 );
```


