创建水平分区表后,DM8 提供了对分区表的修改,功能包括:
1、增加分区:建立水平分区表后,可根据实际需要新增一个分区;
2、删除分区:建立水平分区表后,可根据实际需要删除一个分区;
3、合并分区:将相邻的两个范围分区合并为一个分区。合并分区通过指定两个分区名进行,将相邻的两个分区的数据进行合并,构建新的大分区。只能在范围和 LIST 分区上进行合并分区;
4、拆分分区:将某一个范围分区拆分为相邻的两个分区。拆分分区时指定的常量表达式值必须是原范围分区的有效范围值。只能在范围分区和 LIST 上进行拆分分区;
5、交换分区:将分区数据跟普通表数据进行交换,交换的两张表需要具有相同的结构。仅范围分区和 LIST 分区支持交换分区。不支持含有加密列的分区表交换分区。
-- 列表
alter table panda.sales add partition p5 values ('台湾');
-- 范围
ALTER TABLE table_name ADD PARTITION partition_name VALUES LESS THAN (value) STORAGE (ON data);
ALTER TABLE table_name ADD PARTITION partition_name VALUES EQU OR LESS THAN (value) STORAGE (ON data);
ALTER TABLE table_name ADD PARTITION partition_name VALUES LESS THAN (MAXVALUE) STORAGE (ON data);
只能对范围分区和 LIST 分区增加分区,不能对哈希分区增加分区。(测试hash也是支持加分区的请看)
索引影响:无影响,分区索引只是局部索引,新增分区仅是新增分区子表,并更新分区主表的分区信息,其他分区并不发生改变。
ALTER TABLE table_name DROP PARTITION ptname;
ALTER TABLE table_name DROP SUBPARTITION ptname;
只能对范围分区和 LIST 分区进行删除分区,哈希分区不支持删除分区
索引影响:无影响.
ALTER TABLE table_name SPLIT PARTITION partition_name AT (value) INTO (PARTITION new_partition1 , PARTITION new_partition2);
ALTER TABLE table_name SPLIT PARTITION partition_name AT (value) INTO (PARTITION new_partition1 STORAGE (ON data), PARTITION new_partition2 STORAGE (ON data));
仅范围分区表和 LIST 分区表支持拆分分区
索引影响:会失效,拆分分区会导致数据的重组和分区索引的重建
多级分区表进行拆分 SPLIT 注意事项:
1、仅支持一级子表类型为 RANGE、LIST;
2、支持 SPLIT 为 2 个或多个子表;
3、不允许自定义二级及以上层次子表;
4、SPLIT 产生的新分区二级及以上层次子表结构与被分隔子表保持一致,名称由系统内部定义。
ALTER TABLE table_name MERGE PARTITIONS partition_name1, partition_name2 INTO PARTITION new_partition_name;
仅范围分区表和 LIST 分区表支持合并分区。其中,合并的 RANGE 分区必须是范围相邻的两分区。
索引影响:会失效,合并分区会导致数据的重组和分区索引的重建
多级分区表进行 MERGE 合并的注意事项:
1、仅支持一级子表类型为 RANGE、LIST;
2、合并多级分区表中的一级子表时,该一级子表下的二级及以上层次子表按照级别分别判断:在创建分区表时当前层次是否指定了模板,若指定了模板,则按照模板创建当前层次子表;若未指定模板,则由系统自动合并为一个子表,子表名称为系统内部设置。RANGE 类型范围值为 MAXVALUE;LIST 类型范围值为 DEFAULT;
3、不允许自定义二级及以上层次子表;
4、不允许直接合并二级及以上层次子表。
DM 支持用 ALTER TABLE EXCHANGE PARTITION 语句将分区数据跟普通表数据进行交换,**<font style=“color:#DF2A3F;”>交换的两张表需要具有相同的结构。</font>**仅范围分区和 LIST 分区支持交换分区。进行交换的两张表,如果包含加密列,对应的加密列要求加密信息完全一致。
ALTER TABLE table_name EXCHANGE PARTITION partition_name WITH TABLE table_name2 [INCLUDING INDEXES];
ALTER TABLE table_name EXCHANGE SUBPARTITION subpartition_name WITH TABLE table_name2 [INCLUDING INDEXES];
CREATE TABLE callinfo_2011Q2(
caller CHAR(15),
callee CHAR(15),
time DATETIME,
duration INT
);
-- 交换分区
ALTER TABLE callinfo EXCHANGE PARTITION p2 WITH TABLE callinfo_2011Q2;
-- 删除原分区
ALTER TABLE callinfo DROP PARTITION p2;
-- 新增分区,记录2011年第二季度通话记录
ALTER TABLE callinfo
ADD PARTITION p6 VALUES LESS THAN ('2011-7-1') STORAGE (ON ts2);
通过交换分区实现分区 p2 和新建表 callinfo_2011Q2 的数据交换,表 callinfo_2011Q2 将得到 2010 年第二季度的通话记录,而分区 p2 数据将被清空。交换分区采用数据字典信息交换的技术,几乎不涉及 IO 操作,因此效率非常高。
二级分区操作,使用列表-范围模板分区测试的仅供参考
-- 修改子分区模板,没有报错但是没有修改成功
alter table panda.shop set subpartition template
( --使用模板
SUBPARTITION P11 VALUES LESS THAN ('2012-04-01'),
SUBPARTITION P12 VALUES LESS THAN ('2012-07-01'),
SUBPARTITION P13 VALUES LESS THAN ('2012-10-01'),
SUBPARTITION P14 VALUES LESS THAN ('2013-01-01'),
SUBPARTITION P15 VALUES EQU OR LESS THAN (MAXVALUE));
-- 正常对已经存在的一级分区,子分区模板不会影响已存在的子分区。仅影响 后续新创建的一级分区,旧分区不会更新。
-- 但是在删掉default maxvalue限制后在添加的两个分区p3,p4依旧沿用之前的模板
-- 重命名二级分区
alter table panda.shop rename SUBPARTITION P11_2 to P11_3;
-- 加二级分区
ALTER TABLE panda.shop MODIFY PARTITION P1 ADD SUBPARTITION P11_2 VALUES LESS THAN ('2013-01-01');
-- 截断二级分区
ALTER TABLE panda.shop truncate SUBPARTITION P11_2 ;
-- 删除二级分区
ALTER TABLE panda.shop drop SUBPARTITION P11_2 ;
-- 拆二级分区 不支持
-- 查看表定义
select TABLEDEF('PANDA','SHOP');
-- 增加分区✔
alter table panda.CALLINFO add partition pmax VALUES less than (MAXVALUE);
-- 拆分分区✔
alter table panda.CALLINFO SPLIT partition pmax at('2011-04-01')into(partition p5 STORAGE(ON "DATA", CLUSTERBTR),partition pmax STORAGE(ON "DATA", CLUSTERBTR));
-- 删除分区✔
alter table panda.callinfo drop partition p5;
-- 收缩分区❌
ALTER TABLE panda.callinfo COALESCE PARTITION;
-- 合并分区✔
ALTER TABLE callinfo MERGE PARTITIONS p1, p2 into partition p1_2; -- p2022_2023
-- 修改分区值(仅一级[LIST]分区子表支持此操作)✔
ALTER TABLE panda.sales MODIFY PARTITION p1 DROP VALUES ('天津');
ALTER TABLE panda.sales MODIFY PARTITION p1 ADD VALUES ('天津','唐山');
-- 截断分区✔
ALTER TABLE panda.callinfo TRUNCATE PARTITION p1_2 DROP STORAGE;
-- 移动分区❌
ALTER TABLE panda.callinfo MOVE PARTITION p1_2 STORAGE(ON "DATA", CLUSTERBTR);
ALTER TABLE panda.sales MOVE PARTITION p1 STORAGE(ON "DATA", CLUSTERBTR); --list分区
ALTER TABLE panda.SALES_HEAP MOVE PARTITION P3; --list分区堆表
-- 重命名分区✔
ALTER TABLE panda.callinfo RENAME PARTITION p1_2 TO p0;
ALTER TABLE panda.callinfo RENAME PARTITION p0 TO p1_2;
-- 修改默认属性❌
ALTER TABLE panda.callinfo MODIFY DEFAULT ATTRIBUTES STORAGE(ON "DATA", CLUSTERBTR);
ALTER TABLE panda.sales MODIFY DEFAULT ATTRIBUTES STORAGE(ON "DATA", CLUSTERBTR); -- list分区
ALTER TABLE panda.SALES_HEAP MODIFY DEFAULT ATTRIBUTES PARTITION STORAGE(ON "DATA", NOBRANCH); -- list分区堆表
-- 修改当前属性❌
ALTER TABLE panda.callinfo MODIFY PARTITION p1_2 STORAGE (FILLFACTOR 80);
ALTER TABLE panda.callinfo MODIFY PARTITION p1_2 FILLFACTOR 80;
-- INITIAL 50,
-- NEXT 50,
-- MINEXTENTS 10,
-- FILLFACTOR 80,
-- ON USERS);
-- 修改子分区模板
ALTER TABLE panda.callinfo SET SUBPARTITION TEMPLATE (SUBPARTITION sub_p1 VALUES('A'), SUBPARTITION sub_p2 VALUES('B'));
-- 交换分区✔
ALTER TABLE panda.callinfo EXCHANGE PARTITION p2022_2023 WITH TABLE sales_temp INCLUDING INDEXES;
同Oracle的视图大部分能用,只有dba_part_indexes不兼容。
| 视图名 | 说明 |
|---|---|
DBA_TABLES |
基本表信息 |
DBA_PART_TABLES |
分区表信息 |
DBA_TAB_PARTITIONS |
一级表分区信息 |
DBA_TAB_SUBPARTITIONS |
二级表分区信息 |
DBA_INDEXES |
索引信息 |
DBA_IND_PARTITIONS |
索引分区信息 |
示例:
select * from DBA_TABLES where table_name='SALES01';
select * from DBA_PART_TABLES where table_name='SALES01';
select * from DBA_INDEXES where table_name='SALES01';
select * from dba_ind_partitions where INDEX_NAME='IND_CALLINFO_TIME';
-- dba_part_indexes❌
select * from DBA_TAB_PARTITIONS where table_name='SALES01';
select * from DBA_TAB_SUBPARTITIONS where table_name='SALES01';
文章
阅读量
获赞
