openGauss与PostgreSQL分区策略语法测试
点击上方"蓝字"
关注我们,享更多干货!
1. 父子继承表
目前openGauss还不支持inherits继承特性。
omm=# CREATE TABLE tab_t2(age int) inherits(tab_t1);
ERROR: CREATE TABLE ... INHERITS is not yet supported.
PostgreSQL支持继承,版本10之前的分区表都是通过继承特性来实现,每个分区实际上都是一个独立的表。数据更新可通过触发器trigger或者规则rule来实现。
下面演示PostgreSQL中的继承特性:
CREATE TABLE tab_t1(id int primary key,name varchar(20) not null);
CREATE TABLE tab_t2(age int) inherits(tab_t1);
对父表增加字段。
alter table tab_t1 add create_date date;
查看表结构。
postgres=# \d tab_t1Table "public.tab_t1"Column | Type | Collation | Nullable | Default
-------------+-----------------------+-----------+----------+---------id | integer | | not null | name | character varying(20) | | not null | create_date | date | | |
Indexes:"tab_t1_pkey" PRIMARY KEY, btree (id)
Number of child tables: 1 (Use \d+ to list them.)postgres=# \d tab_t2Table "public.tab_t2"Column | Type | Collation | Nullable | Default
-------------+-----------------------+-----------+----------+---------id | integer | | not null | name | character varying(20) | | not null | age | integer | | | create_date | date | | |
Inherits: tab_t1
我们不通过触发器或者规则路由数据,直接插入数据。
INSERT INTO tab_t1 VALUES (1,'data 1 in tab_t1',now());
INSERT INTO tab_t1 VALUES (2,'data 2 in tab_t1',now());
INSERT INTO tab_t2 VALUES (3,'data 3 in tab_t2',18,now());
INSERT INTO tab_t2 VALUES (4,'data 4 in tab_t2',20,now());
从父表中查询数据将显示父表及子表的所有数据。
postgres=# SELECT * from tab_t1;
id | name | create_date
----+------------------+-------------1 | data 1 in tab_t1 | 2021-04-112 | data 2 in tab_t1 | 2021-04-113 | data 3 in tab_t2 | 2021-04-114 | data 4 in tab_t2 | 2021-04-11
(4 rows)
通过ONLY关键字实现只对父表的查询。
postgres=# SELECT * from ONLY tab_t1;id | name | create_date
----+------------------+-------------1 | data 1 in tab_t1 | 2021-04-112 | data 2 in tab_t1 | 2021-04-11
(2 rows)
从子表中查询只显示子表中的数据。
postgres=# select * from tab_t2;id | name | age | create_date
----+------------------+-----+-------------3 | data 3 in tab_t2 | 18 | 2021-04-114 | data 4 in tab_t2 | 20 | 2021-04-11
(2 rows)
继承特性使用注意点:
子表并不能完全继承父表的所有属性,比如唯一约束、主键、外键,检查约束与非空约束可以继承。
修改父表的结构,子表结构同时被修改。
父表不存数据时,不建议在父表上创建索引和或唯一约束,应该在每个子表上分别创建。
2. 声明式分区:范围分区
将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式较为常用,并且分区键经常采用日期。
PostgreSQL从版本10开始支持,范围分区声明式语法分两步:
1)通过指定PARTITION BY子句把表创建为分区表,包括分区方法以及用作分区键的column列表。
CREATE TABLE measurement (city_id int not null,logdate date not null,peaktemp int,unitsales int
) PARTITION BY RANGE (logdate)
2)创建分区,每个分区的定义必须指定对应于父表的分区方法和分区键的边界。
CREATE TABLE measurement_y2006m02 PARTITION OF measurementFOR VALUES FROM ('2006-02-01') TO ('2006-03-01');CREATE TABLE measurement_y2006m03 PARTITION OF measurementFOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
...
openGauss范围分区声明式语法可以一步完成,范围分区从句语法有两种格式:
VALUES LESS THAN语法格式(范围分区策略的分区键最多支持4列)。
START END语法格式(范围分区策略的分区键仅支持1列)。
注意上面两种从句语法不能混用,START END语法格式使用gs_dump时会转变为VALUES LESS THAN语法格式。
openGauss范围分区例子。
CREATE TABLE tab_part (id int not null,create_date date not null
) PARTITION BY RANGE(create_date)
(
PARTITION p_20210401 VALUES LESS THAN(to_date('2021-04-01','yyyy-mm-dd')),
PARTITION p_20210402 VALUES LESS THAN(to_date('2021-04-02','yyyy-mm-dd')),
PARTITION p_max VALUES LESS THAN(MAXVALUE)
);
查看系统表可看到分区策略为“r”,range分区。
omm=# select relname,partstrategy from pg_partition where relname='tab_part';relname | partstrategy
----------+--------------tab_part | r
(1 row)
查看分区及边界。
select relname,parttype,parentid,boundaries
from pg_partition
where parentid in(select oid from pg_class where relname='tab_part');relname | parttype | parentid | boundaries
------------+----------+----------+-------------------------tab_part | r | 16412 | p_20210401 | p | 16412 | {"2021-04-01 00:00:00"}p_20210402 | p | 16412 | {"2021-04-02 00:00:00"}p_max | p | 16412 | {NULL}
(4 rows)
接下来插入三条数据。
insert into tab_part values(1,'2021-03-31');
insert into tab_part values(2,'2021-04-01');
insert into tab_part values(3,'9999-12-31');
查询分区,按分区名p_20210402,也可以按分区边界值(PARTITION FOR)。
omm=# select * from tab_part PARTITION (p_20210402);id | create_date
----+---------------------2 | 2021-04-01 00:00:00
(1 row)
3. 声明式分区:列表分区
通过显式地列出每一个分区中出现的键值来划分表。
与前面范围分区一样,PostgreSQL列表分区声明式语法也是两步,从版本10开始支持,openGauss只需一步完成,从版本1.1.0开始支持。
openGauss列表分区例子。
CREATE TABLE tab_list(dept_no number,part_no varchar2(20),country varchar2(20),dtime date,amount number
)
PARTITION BY LIST(country)(PARTITION europe VALUES('FRANCE', 'ITALY'),PARTITION asia VALUES('INDIA', 'PAKISTAN'),PARTITION americas VALUES('US', 'CANADA')
);
查看系统表可看到分区策略为“l”,list分区。
omm=# select relname,partstrategy from pg_partition where relname='tab_list';relname | partstrategy
----------+--------------tab_list | l
(1 row)
查看分区及边界。
select relname,parttype,parentid,boundaries
from pg_partition
where parentid in(select oid from pg_class where relname='tab_list');relname | parttype | parentid | boundaries
----------+----------+----------+------------------tab_list | r | 16389 | americas | p | 16389 | {US,CANADA}asia | p | 16389 | {INDIA,PAKISTAN}europe | p | 16389 | {FRANCE,ITALY}
(4 rows)
4. 声明式分区:哈希分区
将数据通过哈希映射到每一个分区,每一个分区中存储了具有相同哈希值的记录。
PostgreSQL哈希分区声明式语法也是两步,从版本11开始支持,openGauss只需一步完成,从版本1.1.0开始支持。
openGauss哈希分区例子。
CREATE TABLE tab_hash(dept_no number,part_no varchar2(20),country varchar2(20),dtime date,amount number
)PARTITION BY HASH(part_no)(PARTITION p1,PARTITION p2,PARTITION p3
);
查看系统表可看到分区策略为“h”,hash分区。
omm=# select relname,partstrategy from pg_partition where relname='tab_hash';relname | partstrategy
----------+--------------tab_hash | h
(1 row)
查看分区及边界。
select relname,parttype,parentid,boundaries
from pg_partition
where parentid in(select oid from pg_class where relname='tab_hash');relname | parttype | parentid | boundaries
----------+----------+----------+------------tab_hash | r | 16405 | p3 | p | 16405 | {2}p2 | p | 16405 | {1}p1 | p | 16405 | {0}
(4 rows)
5. 基于范围分区的自动扩展间隔分区
间隔分区(Interval-Partition)是针对Range类型分区的一种功能拓展。对连续数据类型的Range分区,如果插入的新数据值与当前分区均不匹配,Interval-Partition特性可以实现自动的分区创建。分区字段必须是时间类型(date或timestamp)。
PostgreSQL目前还不支持该语法,openGauss从版本1.1.0开始支持。
openGauss间隔分区例子。
CREATE TABLE tab_range_interval (id int not null,create_date date not null
) PARTITION BY RANGE(create_date) INTERVAL('1 month')
(
PARTITION p1 VALUES LESS THAN(to_date('2021-01-29','yyyy-mm-dd'))
);
查看系统表可看到分区策略为“i”,interval分区。
omm=# select relname,partstrategy,interval from pg_partition where relname='tab_range_interval';relname | partstrategy | interval
----------+--------------+-----------tab_part | i | {"1 month"}
(1 row)
接下来插入三条数据。
insert into tab_range_interval values(1,'2021-01-29');
insert into tab_range_interval values(2,'2021-02-28');
insert into tab_range_interval values(3,'2022-03-29');
插入数据后检查是否自动创建了相应的分区。
omm=# select relname,parttype,parentid,boundaries
from pg_partition
where parentid in(select oid from pg_class where relname='tab_range_interval');relname | parttype | parentid | boundaries
--------------------+----------+----------+--------------tab_range_interval | r | 16572 | p1 | p | 16572 | {2021-01-29}sys_p1 | p | 16572 | {2021-02-28}sys_p2 | p | 16572 | {2021-03-28}sys_p3 | p | 16572 | {2022-04-28}
(5 rows)
可以看到sys_p1,sys_p2,sys_p3为系统自动生成的分区,并且自动处理了月末问题。
注意:
上面是在opengauss 1.1.0版本上测试的,从2.0.0版本开始,模板库默认字符集由SQL_ASCII改为了UTF8,同时数据库兼容性由ORACLE改为PG,对本测试的影响是date数据类型。
目前只支持INTERVAL-RANGE,其它方式不支持。
间隔分区字段必须是时间类型(date或timestamp)。
总结
openGauss目前只支持声明式分区,支持范围分区、列表分区、哈希分区以及INTERVAL-RANGE的自动扩展间隔分区。PostgreSQL支持继承及声明式分区,不支持自动扩展间隔分区。
自动扩展间隔分区的分区字段目前只支持时间类型(date或timestamp)。
对于声明式分区的分区来说,分区必须具有和分区表正好相同的列集合,表结构必须严格一致,而在表继承中,子表可以有父表中没有出现过的额外列,同时表继承允许多继承。
关于作者
彭冲,云和恩墨PG技术顾问,网名“多米爸比”,PG社区认证专家,中国首期PostgreSQL ACE Partner,多年从事基于PostgreSQL数据库的软件研发,擅长于PL/PGSQL业务迁移及优化,Oracle到PostgreSQL的迁移升级,异构数据库整合;作为墨天轮PostgreSQL实践专栏作者,热衷于PostgreSQL实践技术分享,在自己的岗位积极推广PostgreSQL,致力为PG社区多做奉献。
墨天轮原文链接:https://www.modb.pro/db/49865(复制到浏览器或者点击“阅读原文”立即查看)
END
推荐阅读:267页!2020年度数据库技术年刊
推荐下载:2020数据技术嘉年华PPT下载
2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!
由ACDU(中国DBA联盟)和墨天轮联合出品的全新视频节目「数据三分钟」已发布多期,快速了解数据行业动态,快关注我们的视频号看看吧!↓↓↓
点击下图查看更多 ↓
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂
点个“在看”
你的喜欢会被看到❤
openGauss与PostgreSQL分区策略语法测试相关推荐
- MogDB与PostgreSQL分区策略语法测试
点击上方"蓝字" 关注我们,享更多干货! 1.父子继承表 目前MogDB还不支持inherits继承特性. omm=# CREATE TABLE tab_t2(age int) i ...
- mysql partition 语法,MySQL与瀚高数据库的范围分区的语法及实例(APP)
目录 环境 文档用途 详细信息 环境 系统平台:Microsoft Windows (64-bit) 10 版本:5.6.4 文档用途 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就 ...
- PostgreSQL 用 CTE语法 + 继承 实现平滑拆分大表
标签 PostgreSQL , 拆分大表 , 继承 , cte 背景 业务设计初期可能不会考虑到表将来会有多大,或者由于数据日积月累,单表会变得越来越大. 后面在考虑分区的话,应该怎么将单表切换成分区 ...
- cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
转自:http://asyty.iteye.com/blog/1202072 一.Cassandra框架 二.Cassandra数据模型 Colum / Colum Family, SuperColu ...
- Boost:使用 type <>语法测试功能
Boost:使用 type <>语法测试功能 实现功能 C++实现代码 实现功能 使用 type <>语法测试功能 C++实现代码 #include <boost/con ...
- Boost:使用/type <>语法测试功能对象
Boost:使用/type <>语法测试功能对象 实现功能 C++实现代码 实现功能 使用/type <>语法测试功能对象 C++实现代码 #include <boost ...
- Boost:使用/type <>语法测试成员函数
Boost:使用/type <>语法测试成员函数 实现功能 C++实现代码 实现功能 使用/type <>语法测试成员函数 C++实现代码 #include <boost ...
- kafka的分区策略(partition assignment strategy)
概述 kafka的分区策略指的是producer端的 各个partition中的数据如何安排给consumer消费. Range(按范围) ange策略是对每个主题而言的,首先对同一个主题里面的分区按 ...
- gp的分布、分区策略(概述)
对于大规模并行处理数据库来说,一般由单master与多segment组成. 那么数据表的单行会被分配到一个或多个segment上,此时需要想一想分布策略 分布 在gp6中,共有三个策略: 哈希分布 随 ...
最新文章
- js 加alert后才能执行方法
- 数组中求子数组和最大
- 个人博客系统的设计与实现_一个 Go 开发的快速、简洁、美观、前后端分离的个人博客系统...
- NoHttpResponseException
- delphi中处理数据类型错误的方法
- 2014-11-25nbsp;11:26
- E - Counting Cliques HDU - 5952
- iOS开发--正则表达式
- Git创建分支并合并到主分支
- popWindow 根据内容计算高度
- markdown与latex:向量形式给字母加粗 \pmb{}
- MySQL 千万级 数据库或大表优化
- CodeForces-28C-Bath Queue-概率DP[ ICPC2016大连热身D]
- spring异常+自定义以及使用
- Android分区查看方法
- TestNg框架源码解析
- 如何在Microsoft Word 2010中创建自定义封面
- SpringMVC工作原理之四:MultipartResolver
- 2D灯光 Unity2021
- 西工大-计算机学院-复试-面试题目
热门文章
- Web前端——JavaScript(基本语法)
- 使用wordpress_为什么我使用WordPress进行教育
- 高帮足球鞋_高帮运动鞋和晕车症可以教给我们有关VR设计的知识
- 开源 协作工具_城镇如何使用开源工具进行协作和管理大文件
- ffmpeg开源工具的使用_如何使用开源工具和最佳实践提高在线隐私
- grass gis怎么使用_使用GRASS GIS返回学校
- (36)Gulp 构建资源(图片)文件
- (45)css面试题集锦二
- 群晖 mysql 自动备份_宝塔定时备份网站及数据库至群晖FTP存储空间
- 为什么不能把CSS放到html中,为什么我的CSS代码不能在我的HTML文件中工作?