浅谈PostgreSQL表分区的三种方式


Posted in PostgreSQL onJune 29, 2021
目录
  • 一、简介
  • 二、三种方式
    • 2.1、Range范围分区
    • 2.2、List列表分区
    • 2.3、Hash哈希分区
  • 三、总结

一、简介

表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。PostgreSQL的表分区有三种方式:

  • Range:范围分区;
  • List:列表分区;
  • Hash:哈希分区。

本文通过示例讲解如何进行这三种方式的分区。

二、三种方式

为方便,我们通过Docker的方式启动一个PostgreSQL。我们要选择较高的版本,否则不支持Hash分区,命令如下:

docker run -itd \

    --name pkslow-postgres \

    -e POSTGRES_DB=pkslow \

    -e POSTGRES_USER=pkslow \

    -e POSTGRES_PASSWORD=pkslow \

    -p 5432:5432 \

    postgres:13

2.1、Range范围分区

先创建一张表带有年龄,然后我们根据年龄分段来进行分区,创建表语句如下:

CREATE TABLE pkslow_person_r (
    age int not null,
    city varchar not null
) PARTITION BY RANGE (age);

这个语句已经指定了按age字段来分区了,接着创建分区表:

create table pkslow_person_r1 partition of pkslow_person_r for values from (MINVALUE) to (10);
create table pkslow_person_r2 partition of pkslow_person_r for values from (11) to (20);
create table pkslow_person_r3 partition of pkslow_person_r for values from (21) to (30);
create table pkslow_person_r4 partition of pkslow_person_r for values from (31) to (MAXVALUE);

这里创建了四张分区表,分别对应年龄是0到10岁、11到20岁、21到30岁、30岁以上。

接着我们插入一些数据:

insert into pkslow_person_r(age, city) VALUES (1, 'GZ');
insert into pkslow_person_r(age, city) VALUES (2, 'SZ');
insert into pkslow_person_r(age, city) VALUES (21, 'SZ');
insert into pkslow_person_r(age, city) VALUES (13, 'BJ');
insert into pkslow_person_r(age, city) VALUES (43, 'SH');
insert into pkslow_person_r(age, city) VALUES (28, 'HK');

可以看到这里的表名还是pkslow_person_r,而不是具体的分区表,说明对于客户端是无感知的。

我们查询也一样的:

浅谈PostgreSQL表分区的三种方式

但实际上是有分区表存在的:

浅谈PostgreSQL表分区的三种方式

而且分区表与主表的字段是一致的。

查询分区表,就只能查到那个特定分区的数据了:

浅谈PostgreSQL表分区的三种方式

2.2、List列表分区

类似的,列表分区是按特定的值来分区,比较某个城市的数据放在一个分区里。这里不再给出每一步的讲解,代码如下:

-- 创建主表
create table pkslow_person_l (
                          age int not null,
                          city varchar not null
) partition by list (city);

-- 创建分区表
CREATE TABLE pkslow_person_l1 PARTITION OF pkslow_person_l FOR VALUES IN ('GZ');
CREATE TABLE pkslow_person_l2 PARTITION OF pkslow_person_l FOR VALUES IN ('BJ');
CREATE TABLE pkslow_person_l3 PARTITION OF pkslow_person_l DEFAULT;

-- 插入测试数据
insert into pkslow_person_l(age, city) VALUES (1, 'GZ');
insert into pkslow_person_l(age, city) VALUES (2, 'SZ');
insert into pkslow_person_l(age, city) VALUES (21, 'SZ');
insert into pkslow_person_l(age, city) VALUES (13, 'BJ');
insert into pkslow_person_l(age, city) VALUES (43, 'SH');
insert into pkslow_person_l(age, city) VALUES (28, 'HK');
insert into pkslow_person_l(age, city) VALUES (28, 'GZ');

当我们查询第一个分区的时候,只有广州的数据:

浅谈PostgreSQL表分区的三种方式

2.3、Hash哈希分区

哈希分区是指按字段取哈希值后再分区。具体的语句如下:

-- 创建主表
create table pkslow_person_h (
                          age int not null,
                          city varchar not null
) partition by hash (city);

-- 创建分区表
create table pkslow_person_h1 partition of pkslow_person_h for values with (modulus 4, remainder 0);
create table pkslow_person_h2 partition of pkslow_person_h for values with (modulus 4, remainder 1);
create table pkslow_person_h3 partition of pkslow_person_h for values with (modulus 4, remainder 2);
create table pkslow_person_h4 partition of pkslow_person_h for values with (modulus 4, remainder 3);

-- 插入测试数据
insert into pkslow_person_h(age, city) VALUES (1, 'GZ');
insert into pkslow_person_h(age, city) VALUES (2, 'SZ');
insert into pkslow_person_h(age, city) VALUES (21, 'SZ');
insert into pkslow_person_h(age, city) VALUES (13, 'BJ');
insert into pkslow_person_h(age, city) VALUES (43, 'SH');
insert into pkslow_person_h(age, city) VALUES (28, 'HK');

可以看到创建分区表的时候,我们用了取模的方式,所以如果要创建N个分区表,就要取N取模。

随便查询一张分区表如下:

浅谈PostgreSQL表分区的三种方式

可以看到同是SZ的哈希值是一样的,肯定会分在同一个分区,而BJ的哈希值取模后也属于同一个分区。

三、总结

本文讲解了PostgreSQL分区的三种方式。

代码请查看:https://github.com/LarryDpk/pkslow-samples

以上就是浅谈PostgreSQL表分区的三种方式的详细内容,更多关于PostgreSQL表分区的资料请关注三水点靠木其它相关文章!

PostgreSQL 相关文章推荐
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 PostgreSQL
通过Qt连接OpenGauss数据库的详细教程
Jun 23 PostgreSQL
PostGIS的安装与入门使用指南
Jan 18 PostgreSQL
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 PostgreSQL
postgresql中如何执行sql文件
May 08 PostgreSQL
通过Qt连接OpenGauss数据库的详细教程
postgres之jsonb属性的使用操作
Jun 23 #PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 #PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 #PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
Centos环境下Postgresql 安装配置及环境变量配置技巧
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
You might like
php短网址和数字之间相互转换的方法
2015/03/13 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
神经网络(BP)算法Python实现及应用
2018/04/16 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
自我评价怎么写正确呢?
2013/12/02 职场文书
班级安全教育实施方案
2014/02/23 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
财务审计整改报告
2014/11/06 职场文书
大学生实习介绍信
2015/05/05 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题