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

openGauss的数据分区

MTL-9527 2022-09-21
1092

在openGauss中,数据分区是在一个节点内部对数据按照用户指定的策略做进一步的水 平分表,将表中的数据按照指定方式划分为多个互不重叠的部分。 

⚫ 对于大多数用户使用场景,分区表和普通表相比具有以下优点: 

 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 

 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 

 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 

 均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。


⚫ openGauss数据库支持范围分区表、列表分区表、哈希分区表: 

 范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是 最为常用的。 

 范围分区功能,即根据表的一列或者多列,将要插入表的记录分为若干个范围(这些范围在不同的分区里没有重叠), 然后为每个范围创建一个分区,用来存储相应的数据。用户在CREATE TABLE时增加PARTITION参数,即表示针对此 表应用数据分区功能。 

 列表分区表:将数据基于各个分区内包含的键值映射到每一个分区,分区包含的键值在创建分区时指定。 

 列表分区功能,即根据表的一列,将要插入表的记录中出现的键值分为若干个列表(这些列表在不同的分区里没有重 叠),然后为每个列表创建一个分区,用来存储相应的数据。 

 哈希分区表:将数据通过哈希映射到每一个分区,每一个分区中存储了具有相同哈希值的记录。 

 哈希分区功能,即根据表的一列,通过内部哈希算法将要插入表的记录划分到对应的分区中。


⚫ 用户在CREATE TABLE时增加PARTITION参数,即表示针对此表应用数据分区功能。用 户可以在实际使用中根据需要调整建表时的分区键,使每次查询结果尽可能存储在相同 或者最少的分区内(称为“分区剪枝”),通过获取连续I/O大幅度提升查询性能。 


⚫ 实际业务中,时间经常被作为查询对象的过滤条件。因此,用户可考虑选择时间列为分 区键,键值范围可根据总数据量、一次查询数据量调整。


⚫管理分区表



⚫ 创建示例
 创建范围分区表student1,含有三个分区,分区键为整数类型。 三个分区的范围分别为:score1 < 60,60 <= score2 < 80,80 <= score3 <90。
CREATE TABLE student1
(
name varchar(30),
score int,
birthday timestamp
)
PARTITION BY RANGE(score)
(
PARTITION score1 VALUES LESS THAN(60),
PARTITION score2 VALUES LESS THAN(80),
PARTITION score3 VALUES LESS THAN(90)
);


⚫ 删除示例
 删除分区score1
ALTER TABLE student1 DROP PARTITION score1;


⚫ 增加示例
 增加分区score4,范围为 90 <= score4 <=100
ALTER TABLE student1 ADD PARTITION score4 VALUES LESS THAN (101);


⚫ 重命名示例
 重命名分区score2为score2_new:
ALTER TABLE student1 RENAME PARTITION score2 TO score2_new;


⚫ 查询示例
 查询分区score2
SELECT * FROM student1 PARTITION (score2_new); 


⚫ 分区表索引
 创建分区表索引student1_index1,不指定索引分区的名字

CREATE INDEX student1_index2 ON student1 (score) LOCAL
(
PARTITION score1_index,
PARTITION score2_index TABLESPACE ts2,
PARTITION score3_index TABLESPACE ts3
) TABLESPACE ts0;

 创建分区索引student1_index2,并指定索引分区的名字
CREATE INDEX student1_index1 ON student1 (score) LOCAL;

 重命名索引分区

ALTER INDEX student1_index2 RENAME PARTITION score1_index TO score1_index_new; 


分区设计总结 

⚫ 针对已经存在的表进行分区,最好将数据迁移完后再建索引。 

⚫ 如果要充分使用分区表的查询优势,必须使用分区时的字段作为过滤条件。 

⚫ 需要注意分区后就没有全局唯一性了,各个分区之间是可以有重复的uuid。 

⚫ 对于分区键条件查询,效率非常高。 

⚫ 分区的字段必须是非空,类似于案件的立案日期和结案日期就不能用作分区字段。 

⚫ 分区的备份可以单独备份各个分区,但是如果要备份所有分区只能备份整个schema。




「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论