浅谈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通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
通过Qt连接OpenGauss数据库的详细教程
Jun 23 PostgreSQL
浅谈PostgreSQL表分区的三种方式
Jun 29 PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
PostGIS的安装与入门使用指南
Jan 18 PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL之连接失败的问题及解决
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中is_dir()函数使用指南
2015/05/08 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
jQuery Tools tooltip使用说明
2012/07/14 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
使用console进行性能测试
2015/04/27 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
Python----数据预处理代码实例
2019/03/20 Python
用Python配平化学方程式的方法
2019/07/20 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
什么是servlet链?
2014/07/13 面试题
医科大学生毕业的自我评价分享
2013/11/12 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
班组长的岗位职责
2013/12/09 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
大班幼儿评语大全
2014/04/30 职场文书