范围分区是按照某个列或某几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。在创建范围分区时,首先要指定分区列,即按照哪些列进行分区,然后为每个分区指定数据范围。范围分区支持MAXVALUE范围值的使用,MAXVALUE相当于一个比任何都大的值。值得注意的是,MAXVALUE之间无法比较大小。示例:CREATE TABLE TEST(A INT,B VARCHAR) PARTITION BY RANGE(A)(PARTITION P1 VALUES LESS THAN (10),PARTITION P2 VALUES EQU OR LESS THAN (MAXVALUE));
创建范围分区,需要注意的是,LIST分区的分区键必须唯一。示例:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY LIST(B)(PARTITION P1 VALUES (‘HAHA’),PARTITION P2 VALUES (DEFAULT)); //这里的DEFAULT指的是除以上取值外的其它任意值。
在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或LIST分区。在这种情况下,DM哈希分区提供了一种在指定数量的分区中均等的划分数据的方法,基于分区键的散列值将行映射到分区中。当用户向表中写入数据时,数据服务器将根据一个哈希函数对数据进行计算,把数据均匀的分布在各个分区中。在哈希分区中,用户无法预测数据将被写入哪个分区。示例:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY HASH(B)(PARTITION P1,PARTITION P2);或者:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY HASH(B) PARTITIONS 2;
在很多情况下,经过一次分区并不能精确地对数据进行分类,这时需要多级分区。示例:CREATE TABLE TEST(A INT,B VARCHAR) PARTITION BY RANGE(A)SUBPARTITION BY LIST(B) SUBPARTITION TEMPLATE( SUBPARTITION P1 VALUES (‘HAHA’), SUBPARTITION P2 VALUES (DEFAULT))(PARTITION P11 VALUES LESS THAN (10) (SUBPARTITION P11_1 VALUES (‘HAHA’), SUBPARTITION P11_2 VALUES (‘HEHE’), SUBPARTITION P11_3 VALUES (DEFAULT)),PARTITION P22 VALUES EQU OR LESS THAN(MAXVALUE));
DM支持最多八层多级分区。
当执行SELECT命令时,可以指定查询某个分区上的数据,如:SELECT * FROM TEST PARTITION(P1);
DM支持对水平分区表建立普通索引、唯一索引、聚集索引和函数索引。创建索引时若未指定GLOBAL关键字则建立的索引是局部索引,即每一个表分区都有一个索引分区,并且只索引该分区上的数据。若指定了GLOBAL关键字,则建立的索引是全局索引,即每个表分区的数据都被索引在同一个B树中。目前,只有堆表的水平分区表支持GLOBAL全局索引。堆表上的primary key会自动变为全局索引。如:CREATE INDEX IDX ON TEST(A) GLOBAL; (TEST为堆分区表)
增加分区:DM支持用ALTER TABLE ADD PARTITION语句将新增分区增加到最后一个现存分区的后面。对于范围分区,增加分区必须在最后一个分区范围值的后面增加,要想在表的开始范围或中间范围增加,应使用SPLIT PARTITION语句。当已经存在MAXVALUE分区时,不允许增加分区。如:ALTER TABLE TEST ADD PARTITION P3 VALUES LESS THAN (30);;对于LIST分区,增加分区包含的离散值不能已存在与某个分区中,当已经存在DEFAULT分区时,不允许增加分区。如:ALTER TABLE TEST ADD PARTITION P3 VALUES (‘HEHE’); 只能对范围分区和LIST分区增加分区,不能对哈希分区增加分区,并且增加分区不会影响分区索引,因为分区索引只是局部索引,新增分区仅仅是新增分区子表,并更新分区主表的分区信息,其它分区并不发生改变。
删除分区:DM支持用ALTER TABLE DROP PARTITION语句将分区删除。如:ALTER TABLE TEST DROP PARTITION P3; 只能对范围分区和LIST分区进行删除分区,哈希分区不支持删除分区。跟增加分区一样,删除分区不会影响分区索引。
交换分区:ALTER TABLE EXCHANGE PARTITION WITH TABLE;仅范围分区和LIST分区支持交换分区,哈希分区不支持。并且分区交换要求分区表跟交换表具有相同的结构(相同的表类型、相同的BRANCH选项、相同的列结构、相同的索引、相同的分布方式),分区交换并不会校验数据,如交换表的数据是否符合分区范围等,即不能保证分区交换后的分区上的数据符合分区范围。交换分区采用数据字典信息交换的技术,几乎不涉及IO操作,因此效率非常高。进行交换的两张表,若包含加密列,对应的加密列要求加密信息完全一致(前面不是说不支持含有加密列的分区表进行分区交换吗?试了,报错交换对象不匹配)如:ALTER TABLE TEST EXCHANGE PARTITION P1 WITH TABLE TEST_A;
拆分分区:ALTER TABLE TAB_NAME SPLIT PARTITION P3 AT () INTO (PARTITION P3_1,PARTITION P3_2); 用于将一分区中的内容重新划分成两个新的分区,当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作,还可以用SPLIT PARTITION子句来重新划分IO负载。仅范围分区表支持拆分分区,拆分分区会导致数据的重组和分区索引的重建,因此拆分分区可能会比较耗时,所需时间取决于分区数据量的大小。
间隔分区表:仅支持一级范围分区创建间隔分区,且只能有一个分区列,分区列类型为日期或数值。示例:CREATE TABLE TEST(A INT,B VARCHAR) PARTITION BY (A) INTERVAL (10)(PARTITION P1 VALUES LESS THAN(10)); //使用INTERVAL之后,就不用手工增加分区,来适应数据的增长。
DM水平分区表有如下限制:分区列类型必须是数值型、字符型或日期型;范围分区和哈希分区的分区键可以多个,最多不超过16个,LIST分区的分区键必须唯一;水平分区表指定主键和唯一约束时,分区键都必须包含在主键和唯一约束中;水平分区表不支持临时表;不能在水平分区表上建立自引用约束;普通环境中,水平分区表的各级分区的总和上限是65535,MPP环境下,水平分区表的各级分区总数上限取决于INI参数MAX_EP_SITES,上限为2^(16-log2MAX_EP_SITES);不允许对分区子表执行任何DDL操作;哈希分区支持重命名(ALTER TABLE TEST RENAME PARTITION P1 TO P3;)、删除约束、设置触发器是否启用的操作;范围分区支持分区合并、拆分、增加、删除、交换、重命名、删除约束、设置触发器是否生效操作;LIST分区支持分区增加、删除、交换、重命名、删除约束、设置触发器是否生效操作;LIST分区范围值不能为NULL;LIST分区子表范围值个数与数据页大小和相关系统表列长度相关,4K页,单个子表最多支持120个范围值,8K页,单个子表最多支持254个范围值,16/32K页,单个子表最多支持270个范围值;对范围分区增加分区值必须是递增的,即只能在最后一个分区后添加分区,LIST分区增加分区值不能存在于其它已存在分区;当分区数仅剩一个时,不允许删除分区;仅能对相邻的范围分区进行合并,合并后的分区名可以为高分区名或新分区名;拆分分区的分区值必须在原分区范围中,并且分区名不能跟已有分区名相同;与分区进行分区交换的普通表,必须与分区表拥有相同的列及索引,但交换分区并不会对数据进行校验,即交换后的数据并不能保证数据完整性,如CHECK约束,分区表与普通表创建的索引顺序要求一致;水平分区表仅支持建立局部索引,不支持建立全局索引,即在分区表上建立索引,每一个表分区都有一个索引分区,并且只索引该分区上的数据,而分区主表上的索引并不索引数据;不能对水平分区表建立唯一函数索引和全文索引;不能对分区子表单独建立索引;在未指定ENABLE ROW MOVEMENT的分区表上(CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY RANGE(A) (PARTITION P1 VALUES LESS THAN(10),PATITION P2 VALUES EQU OR LESS THAN (MAXVALUE)) ENABLE ROW MOVEMENT;)执行更新分区键,不允许更新后数据发生跨分区的移动,即不能有行迁移(这里的更新分区键指的是UPDATE);不能在分区语句的STORAGE子句中指定BRANCH选项;不允许引用水平分区子表作为外键约束;多级分区最多支持八层;多级分区表支持以下修改操作:新增分区、新增列、删除列、删除表级约束、修改表名、设置与删除列的默认值、设置列NULL属性、设置列可见性、设置行迁移属性、启用超长记录、with delta(没用过,不知道啥意思,sql手册里有介绍,该选择专门针对huge表)、新增子分区、删除子分区、修改二级分区模板信息;水平分区表支持的列修改操作除了多级分区表支持的操作外,还支持:设置触发器生效/失效、修改列名、修改列属性、增加表级约束、删除分区、SPLIT/MERGE分区和交换分区;水平分区表中包含大字段、自定义字段列、则定义时指定ENABLE ROW MOVEMENT参数无效,即不允许更新后数据发生跨分区的移动;