Postgresql-11 根据多字段创建分区表
1、表分区的意义
随着系统的使用,业务表的数据会变得越来越庞大,当达到一定程度时,会严重影响系统性能,将表分区,可以很好的解决这个问题。分区表的优点包括:
- (1)大大提高查询性能;对表分区后,查询时会根据相应的查询条件直接对子表进行查询。
- (2)插入、更新操作的性能更高;插入时,只对子表进行顺序扫描,比扫描整张表高效的多。
- (3)批量删除时,可以效率更高;对于不需要的数据,可以直接Drop掉整张子表。
- (4)对于一些使用频率比较低的数据,可以将对应的子表迁移到成本更低的存储介质上面,降低成本。
Important:并不是分区就一定能提高性能,如果表本身比较小,分区的话,只会更加消耗性能,根据官方的建议,当单张表的体积大于当前服务器内存的时候,建议分区。
2、分区的方法
目前pg分区的方法主要有两种,一是利用pg内置的分区组件,二是利用插件pg-partman。pg内置组件只能在才创建表时进行分区,而pg-partman可以将已经有数据的表进行分区,此外,根据网上的一些评测,pg-partman分区后,数据插入的效率更高。网上评测
2.1 postgresql自带分区方法
pg内置有分区的组件,在10.0版本之前,都是通过触发器来进行分区,即插入数据时,根据字段值判断要插入到哪个子表中,效率比较低,而在10.0之后,pg进行了改进,不再需要触发器。pg-11分区方式有RANG、LIST、HASH三种,我们现在使用的是RANGE,所以下面介绍一下pg-11 RANGE方式创建分区表的方法。
- (1)基本语法
-- 主表
CREATE TABLE table_name ( column_name data_type )PARTITION BY RANGE ( { column_name } [, ... ] )-- 子表
CREATE TABLE table_namePARTITION OF parent_table
FOR VALUESFROM ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )TO ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )
- (2)创建父表
CREATE TABLE public.country_fence_parent (id int4 NOT NULL,branch_range_gis_id int4,branch_code int4,branch_name varchar(50) COLLATE pg_catalog.default,busi_type int4,cast_type int4,rgb varchar(10) COLLATE pg_catalog.default,geom geometry(MULTIPOLYGON, 4326),fid int4 NOT NULL DEFAULT nextval('country_fence_parent_fid_seq'::regclass)
)PARTITION BY RANGE (busi_type , cast_type);
父表中根据busi_type和cast_type两个字段进行分区;
- (3)创建子表(方法1)
CREATE TABLE country_fence_child_1_3 PARTITION OF country_fence_parent
FOR VALUES FROM (1,3) TO (1,4);
Tip: 这个地方range的设置,因为是一个范围,所以必须有一个字段的FROM和TO值不能相等,而插入的时候,取值是FROM<=value<TO,取的FROM值。
- (4)创建子表(方法2)
CREATE TABLE public.country_fence_child_1_3 (id int4 NOT NULL,branch_range_gis_id int4,branch_code int4,branch_name varchar(50) COLLATE pg_catalog.default,busi_type int4,cast_type int4,rgb varchar(10) COLLATE pg_catalog.default,geom geometry(MULTIPOLYGON, 4326),fid int4 NOT NULL DEFAULT nextval('country_fence_child_1_3_fid_seq'::regclass)
)
ALTER TABLE public.country_fence_parent ATTACH PARTITION public.country_fence_child_1_3
FOR VALUES FROM (1,3) TO (1,4);
即先创建子表,然后把子表挂载到父表上面.
Tip: 子表是对外不可见的,但是可以直接通过sql的方式对其进行增删改查。
- (5) 插入操作 创建完成后,直接对父表进行操作,pg会根据busi_type和cast_type的值自动插入到子表中。
insert into country_fence_parent (id, busi_type, cast_type) values (1, 1 , 3);
插入成功,查看sql的执行计划,会发现:
Limit (cost=0.00..18.49 rows=100 width=1294)-> Append (cost=0.00..636.20 rows=3440 width=1294)-> Seq Scan on country_fence_child_1_3 (cost=0.00..44.86 rows=229 width=1376)Filter: (busi_type = 1)-> Seq Scan on country_fence_child_1_3 (cost=0.00..574.14 rows=3211 width=1289)Filter: (busi_type = 1)
如果创建子表时,没有定义相应的规则,则会报错,比如:
insert into country_fence_parent (id, busi_type, cast_type) values (1, 3 , 1);
报错:
没有找到关系“country_fence_parent”的分区
2.2 pg-partman分区
待完善,请参考 pg_partman/pg_partman.md at master · pgpartman/pg_partman · GitHub
参考文献:
PostgreSQL: Documentation: 11: 5.10. Table Partitioning GitHub - pgpartman/pg_partman: Partition management extension for PostgreSQL PostgreSQL 10 内置分区 vs pg_pathman_weixin_34380781的博客-CSDN博客 PostgreSQL 11 分区表用法及增强_rocklee的专栏-CSDN博客_postgresql11 分区表
Postgresql-11 根据多字段创建分区表相关推荐
- PostgreSQL 快速给指定表每个字段创建索引 - 2
标签 PostgreSQL , 索引 , 所有字段 , 并行创建单个索引 , max_parallel_maintenance_workers , 异步调用 , dblink , 并行创建多个索引 , ...
- PostgreSQL 创建分区表
PG 假如我们想像Hive那也创建动态分区是不能实现的. 那么需要我们手动通过脚本来创建分区表,创建分区表必须要创建主表和分区表. 因此我们可以根据我们需求提前用脚本把分区表生成即可, ...
- PostgreSQL 中的系统字段:tableoid、xmin、xmax、cmin、cmax、ctid
文章目录 tableoid ctid xmin xmax cmin cmax oid 总结 大家好!我是只谈技术不剪发的 Tony 老师.今天我们来谈谈 PostgreSQL 数据表中几个隐藏的系统字 ...
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?...
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...
- PostgreSQL 范围过滤 + 其他字段排序OFFSET LIMIT(多字段区间过滤)的优化与加速
标签 PostgreSQL , 范围过滤 , 其他字段排序 , 索引 , offset , limit 背景 在索引扫描中,如果两个字段扫描都是区间扫描,那么只能用到某个字段的过滤条件,另一个字段需要 ...
- mysql 当天创建分区表_mysql8.0 定时创建分区表记录 每天定时创建下一天的分区表...
因单表数据太大, 需要表按时间分区 分区字段 pay_out_date 按天分 要求自动创建 1. 创建分区表 MYSQL的分区字段,必须包含在主键字段内 常见错误提示 错误提示:#1503 A PR ...
- PostgreSQL 11 新特性之哈希分区
文章目录 PostgreSQL 10 引入了声明式分区(declarative partitioning)特性,但是实现的功能有限.PostgreSQL 11 为此带来了许多关于分区的增强功能.首先就 ...
- 【Postgresql】触发器某个字段更新时执行,行插入或更新执行
[Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...
- CentOS 7 源码编译安装 PostgreSQL 11.2
环境 系统版本 Centos7.6 工具:xshell6 PostgreSql: postgresql-11.2.tar.gz 安装部署 安装前准备 官网下载PostgreSQL 11.2源码地址:h ...
最新文章
- 【跃迁之路】【731天】程序员高效学习方法论探索系列(实验阶段488-2019.2.21)...
- java oracle exp_java中使用oracle的exp/imp导出、导入数据
- 内核启动流程分析(二)配置详解
- N Queen(代码、分析、汇编)
- JavaIO流加解密,AES对字符串加解密
- tigervnc远程控制linux,CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面
- Soul网关源码阅读(八)路由匹配初探
- Atitit 2017年的技术趋势与未来的大技术趋势
- java 释放对象_java基础:对象的销毁
- QQ电脑管家 vs 360 安全助手 (客观+主观)
- 科技互联网相关的微信公众号图文应该怎样排版?
- EDG夺冠火爆全网,官网域名用的如何?
- Maplab系列15:Inverted File
- BackTrack5(BT5)硬盘安装
- 微信自主出题,答题小程序开发,微信扫描二维码实现方法,扫二维码出试卷答题的软件!
- 算法代码备忘录(2)
- d3 svg path添加文本_D3.js 力导向图的显示优化
- Windows在cmd命令行环境下运行c程序
- STM32翻转LED(HAL库)
- 爱思服务器shsh文件类型,爱思问答丨使用爱思助手备份SHSH后可以降级吗?