浅谈PostgreSQL表分区的三种方式_PostgreSQL

来源:脚本之家  责任编辑:小易  
目录
一、简介二、三种方式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,而不是具体的分区表,说明对于客户端是无感知的。

我们查询也一样的:

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

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

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

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');

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

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取模。

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

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

三、总结

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

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

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

您可能感兴趣的文章:PostgreSQL LIST、RANGE 表分区的实现方案PostgreSQL 创建表分区浅析postgresql 数据库 TimescaleDB 修改分区时间范围利用python为PostgreSQL的表自动添加分区如何为PostgreSQL的表自动添加分区浅谈PostgreSQL 11 新特性之默认分区PostgreSQL之分区表(partitioning)PostgreSQL分区表(partitioning)应用实例详解PostgreSQL教程(三):表的继承和分区表详解

  • 本文相关:
  • postgresql中的oid和xid 说明
  • postgresql删除主键的操作
  • postgresql关于like%xxx%的优化操作
  • postgresql 重建索引的操作
  • 启动postgresql服务器 并用pgadmin连接操作
  • 15个postgresql数据库实用命令分享
  • postgresql中常用的时间日期脚本使用教程
  • postgresql判断字符串是否包含目标字符串的多种方法
  • postgresql实战之启动恢复读取checkpoint记录失败的条件详解
  • postgresql将数据加载到buffer cache中操作方法
  • postgresql 分区表空间怎么查
  • postgresql 怎么自动创建分区
  • 如何把mysql的表导入hive外部表的分区中
  • 如何在w7-64上安装postgresql-9.6.2-1-windows-x64
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页postgresqlpostgresql list、range 表分区的实现方案postgresql 创建表分区浅析postgresql 数据库 timescaledb 修改分区时间范围利用python为postgresql的表自动添加分区如何为postgresql的表自动添加分区浅谈postgresql 11 新特性之默认分区postgresql之分区表(partitioning)postgresql分区表(partitioning)应用实例详解postgresql教程(三):表的继承和分区表详解postgresql中的oid和xid 说明postgresql删除主键的操作postgresql关于like%xxx%的优化操作postgresql 重建索引的操作启动postgresql服务器 并用pgadmin连接操作15个postgresql数据库实用命令分享postgresql中常用的时间日期脚本使用教程postgresql判断字符串是否包含目标字符串的多种方法postgresql实战之启动恢复读取checkpoint记录失败的条件详解postgresql将数据加载到buffer cache中操作方法postgresql 角色与用户管理介绍windows下postgresql数据库的下载windows下postgresql安装图解postgresql中的oid和xid 说明15个postgresql数据库实用命令分postgresql alter语句常用操作小windows postgresql 安装图文教程postgresql 安装和简单使用postgresql 创建表分区postgresql新手入门教程pgsql添加自增序列、设置表某个字段自增操postgresql教程(十九):sql语言函数pgsql查询优化之模糊查询实例详解postgresql使用ip无法连接的解决方法postgresql教程(十二):角色和权限管理介postgresql 默认用户名与密码的操作postgresql中使用数组改进性能实例代码postgresql pg_ctl start启动超时实例分析postgresql 默认权限查看方式postgresql分页数据重复问题的深入理解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved