注册
【与达梦同行】达梦最常用水平分区表学习测试笔记
技术分享/ 文章详情 /

【与达梦同行】达梦最常用水平分区表学习测试笔记

烤羊肉的肖恩คิดถึง 2022/12/13 2607 179 13

前言

首先还在先介绍一下分区表概念,当然,已经了解的小伙伴可以直接跳过。分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。一个表被分区后,对表的查询操作可以局限于某个分区进行,而不是整个表,这样可以大大提高查询速度。
DM 采用子表方式创建分区表,而且子表可以存储在不同的表空间上,这样做的好处有:

  1. 减少所有数据都损坏的可能性,一个表空间损坏不影响其他表空间,提高可用性;
  2. 恢复时间大大减少;
  3. 可以将同一个表中的数据分布在不同的磁盘上,从而均衡磁盘上的 I/O操作;
  4. 提高了表的可管理性、可利用性和访问效率。

在DM每一个分区以一个子表实体存在,即每一个分区都是一个完整的表,一般命名为主表名_分区名。对于水平分区,子表跟主表具有相同的逻辑结构,即分区子表与分区主表有相同的列定义和约束定义。在 DM 分区表中,主表本身不存储数据,所有数据只存储在子表中,从而实现不同分区的完全独立性。水平分区子表删除后,会将子表上的数据一起删除。
下面就一直跟上我的学习步骤一起去了解以下常用分区表

范围分区表

要求分区列是数字或是日期类型(该列在某个区间内进行分区)
这里创建一个简单的表结构的表,对id列进行分区(0,100]分为P1,(100,200]分为P2,(200,300]分为P3,其余分为P4,分别对应表空间为TEST01-04;

create table "TEST"."T1"
(
"ID" INT,
"NAME" VARCHAR(20)
)
PARTITION BY RANGE ("ID")
(
PARTITION "P1" VALUES EQU OR LESS THAN (100)STORAGE(ON "TEST01", CLUSTERBTR),
PARTITION "P2" VALUES EQU OR LESS THAN (200)STORAGE(ON "TEST02", CLUSTERBTR),
PARTITION "P3" VALUES EQU OR LESS THAN (300)STORAGE(ON "TEST03", CLUSTERBTR),
PARTITION "P4" VALUES LESS THAN(MAXVALUE) STORAGE(ON "TEST04", CLUSTERBTR)
);

列表分区表

分区列适合字符串类型
下面也做一个简单示例
创建表,安装city值进行分区

create table t_sales(sales_id int, saleman varchar(20), saledate date,city
char(10))
Partition by list(city)
(partition P1 values('北京', '天津','哈尔滨','青岛'),
partition P2 values('上海','南京','杭州'),
partition P3 values('武汉','长沙','合肥'),
partition P4 values('广州','深圳','福建'));

如果不在分区列中的值时新增数据是会报错的,那整么办呢,所以创建时就需要考虑到不存在的值也应该分一个区

alter table t_sales add partition PN values(default);
insert into t_sales values(4,'CCCC','2022-04-18','西安');
commit;
--查询新建分区中插入的值
select * from T_SALES_PN;

哈希分区表

分区列的值进行 hash 运算,然后将数据平均分配各个子分区,存储数据非常快,取数据慢,如果 hash 分区不指定分区表名,那就通过指定的哈希分区数来创建。分区表名统一使用 DMHASHPART+分区号(从 0 开始)作为分区名

--指定分区表名
CREATE TABLE T2
(ID INT,
NAME VARCHAR(20))
PARTITION BY HASH(ID)
( PARTITION "01",
PARTITION "02",
PARTITION "03",
PARTITION "04"
) ;
--指定哈希分区个数
create table t_hash(id int, name varchar(20))
partition by hash (id) partitions 10;

组合分区表

组合分区可以多种形式组合(RANGE-LIST RANGE-HASH RANAGE-RANGE LIST-LIST HASH-HASH LIST-RANGE)DM支持最多 8 层分区
示例范围+列表分区

create table sales_sum(sale_id int, sale_name varchar(20),
sale_date date, city char(10))
partition by list(city) ----主分区
subpartition by range(sale_date) ---子分区
subpartition template( ---子分区模板
subpartition p11 values less than('2012-04-01'),
subpartition p12 values less than('2013-04-01'),
subpartition p13 values less than(maxvalue))
( partition p1 values('北京', '天津',' 哈尔滨','青岛') ---创建组合分区
(subpartition p1_1 values less than('2012-08-01'),
subpartition p1_2 values less than('2013-08-01'),
subpartition p1_3 values less than(maxvalue)),
partition p2 values('上海','南京','杭州'),
partition p3 values('武汉','长沙','合肥'),
partition p4 values('广州','深圳','福建'),
partition p5 values(default));
--插入两条数据
insert into sales_sum values(1,'AAAAA','2012-05-01','北京');
insert into sales_sum values(2,'CCCC','2012-05-01','武汉');
COMMIT;
--查询对应的分区
select * from sales_sum_p1_p1_1

分区表维护

相关的数据字典: dba_tab_partitions;
Select * from dba_tab_partitions where table_owner=’TEST’;
1、增加分区
ALTER TABLE TEST.T1 add partition pn values less than(maxvalue);
2、删除分区
Alter table test.t1 drop partition pn;
注意;删除分区前请确认好,并做好备份。
3、合并分区
alter table test.t1 merge partitions p2,p3 into partition p2_3;
4、拆分分区
alter table test.t1 split partition P2_3 at(200) into (partition p2,
partition p3);
5、交换分区
ALTER TABLE TEST.T1 EXCHANGE PARTITION P2 WITH TABLE TEST.T10;
注意:交换时,会普通表的所有数据全部交换过来,包括不属于这个分区的数据也一起交换过来,所以我们在交换分区的时候,要把普通表的数据先整理好。
6、如何把非分区表转换成分区表
1)把非分区表的数据导出来。(可以采用达梦的DTS和DEXP工具进行数据导出)
2)建立一个和非分区表结构一样的分区表
3)将数据导入到分区表中

分区表创建索引

DM支持对水平分区表建立普通索引、唯一索引、聚集索引和函数索引。
分区表表的主键未包含所有分区列,系统会自动创建全局索引,否则自动创建局部索引。创建全局索引时,在水平分区表的主表创建全局索引,每个分区子表的数据都被索引在同一个B树中,并在每个子表创建全局本地索引,与主表共用一个B树。
当使用创建索引语句在水平分区表上创建索引时,指定GLOBAL关键字,创建全局索引,否则创建为局部索引。在水平分区表上创建唯一索引时,全局唯一索引总是可以创建的,若要创建非全局唯一索引,则要求索引键包含所有的分区键。这是因为对于局部索引,每一个分区子表都会建立一个索引分区,负责索引分区子表的数据。由于每个索引分区只负责索引本分区上的数据,其他分区上的数据无法维护,只有当分区键都包含在索引键中时,才能对分区主表保证索引键唯一。另外,能在水平分区表上创建局部聚集索引,不能创建全局聚集索引;不能在水平分区表上创建局部唯一函数索引。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服