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 根据多字段创建分区表相关推荐

  1. PostgreSQL 快速给指定表每个字段创建索引 - 2

    标签 PostgreSQL , 索引 , 所有字段 , 并行创建单个索引 , max_parallel_maintenance_workers , 异步调用 , dblink , 并行创建多个索引 , ...

  2. PostgreSQL 创建分区表

    PG 假如我们想像Hive那也创建动态分区是不能实现的.         那么需要我们手动通过脚本来创建分区表,创建分区表必须要创建主表和分区表. 因此我们可以根据我们需求提前用脚本把分区表生成即可, ...

  3. PostgreSQL 中的系统字段:tableoid、xmin、xmax、cmin、cmax、ctid

    文章目录 tableoid ctid xmin xmax cmin cmax oid 总结 大家好!我是只谈技术不剪发的 Tony 老师.今天我们来谈谈 PostgreSQL 数据表中几个隐藏的系统字 ...

  4. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?...

    如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...

  5. PostgreSQL 范围过滤 + 其他字段排序OFFSET LIMIT(多字段区间过滤)的优化与加速

    标签 PostgreSQL , 范围过滤 , 其他字段排序 , 索引 , offset , limit 背景 在索引扫描中,如果两个字段扫描都是区间扫描,那么只能用到某个字段的过滤条件,另一个字段需要 ...

  6. mysql 当天创建分区表_mysql8.0 定时创建分区表记录 每天定时创建下一天的分区表...

    因单表数据太大, 需要表按时间分区 分区字段 pay_out_date 按天分 要求自动创建 1. 创建分区表 MYSQL的分区字段,必须包含在主键字段内 常见错误提示 错误提示:#1503 A PR ...

  7. PostgreSQL 11 新特性之哈希分区

    文章目录 PostgreSQL 10 引入了声明式分区(declarative partitioning)特性,但是实现的功能有限.PostgreSQL 11 为此带来了许多关于分区的增强功能.首先就 ...

  8. 【Postgresql】触发器某个字段更新时执行,行插入或更新执行

    [Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...

  9. CentOS 7 源码编译安装 PostgreSQL 11.2

    环境 系统版本 Centos7.6 工具:xshell6 PostgreSql: postgresql-11.2.tar.gz 安装部署 安装前准备 官网下载PostgreSQL 11.2源码地址:h ...

最新文章

  1. 【跃迁之路】【731天】程序员高效学习方法论探索系列(实验阶段488-2019.2.21)...
  2. java oracle exp_java中使用oracle的exp/imp导出、导入数据
  3. 内核启动流程分析(二)配置详解
  4. N Queen(代码、分析、汇编)
  5. JavaIO流加解密,AES对字符串加解密
  6. tigervnc远程控制linux,CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面
  7. Soul网关源码阅读(八)路由匹配初探
  8. Atitit 2017年的技术趋势与未来的大技术趋势
  9. java 释放对象_java基础:对象的销毁
  10. QQ电脑管家 vs 360 安全助手 (客观+主观)
  11. 科技互联网相关的微信公众号图文应该怎样排版?
  12. EDG夺冠火爆全网,官网域名用的如何?
  13. Maplab系列15:Inverted File
  14. BackTrack5(BT5)硬盘安装
  15. 微信自主出题,答题小程序开发,微信扫描二维码实现方法,扫二维码出试卷答题的软件!
  16. 算法代码备忘录(2)
  17. d3 svg path添加文本_D3.js 力导向图的显示优化
  18. Windows在cmd命令行环境下运行c程序
  19. STM32翻转LED(HAL库)
  20. 爱思服务器shsh文件类型,爱思问答丨使用爱思助手备份SHSH后可以降级吗?

热门文章

  1. el-tree处理大量数据
  2. 数学/基础数论——从LeetCode题海中总结常见套路
  3. 6天面试、斩获6家硅谷巨头Offer,我是如何做到的?
  4. 卷积神经网络超详细介绍
  5. 试用期程序员应该了解的事儿
  6. python:TypeError:takes at least 8 arguments (9 given)
  7. javascript技巧搜集。
  8. Docker神器之百度云下载(群辉 LEDE)
  9. 空间几何变换知识点——摘自《机器视觉研究与发展》赵彭
  10. 布线时排阻(IC)管脚交换步骤