欢迎来到阿里云授权服务中心典名科技有限公司!咨询电话:023-66887777 18623333330

微信
手机版
网站地图

PostgreSQL表分区的三种方式

2021-08-11 11:14:06 投稿人 : admin 围观 : 239 次 0 评论

  1 简介

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

  Range:范围分区;

  List:列表分区;

  Hash:哈希分区。

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

  2 例讲三种方式

  为方便,我们通过Docker的方式启动一个PostgreSQL,可参考:《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,而不是具体的分区表,说明对于客户端是无感知的。

image.png

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

image.png

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

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

image.png

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

  当我们查询第一个分区的时候:

image.png

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

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

image.png


版权声明:本站部分文章内容、图片来源于网友推荐、互联网收集整理而来,仅供大家学习参考,不代表本站立场,如有侵权,请联系站长,我们会第一时间处理!本站原创内容未经允许不得转载,或转载时需注明出处:典名科技资讯门户

相关文章

  • oracle临时表空间的增删改查命令
    oracle临时表空间的增删改查命令

    oracle临时表空间的增删改查命令发布时间:2021-08-31 01:57:42来源:阿里云阅读:60作者:chen栏目:关系型数据库本篇内容介绍了“oracle临时表空间的增删改查命令”的有关知识,在实际案例的操作过程中,不少人都会遇...

    2021-08-31 11:52:19
  • Redis4.0从库复制报错"master_link_status:down"怎么处理
    Redis4.0从库复制报错"master_link_status:down"怎么处理

    “Redis4.0从库复制报错"master_link_status:down"怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis4.0从库复制报错&quo...

    2021-08-31 11:52:19
  • MySQL数据库中有哪些锁
    MySQL数据库中有哪些锁

    “MySQL数据库中有哪些锁”,在日常操作中,相信很多人在MySQL数据库中有哪些锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库中有哪些锁”的疑惑有所帮助!接下来!在 MySQL 数据库中,...

    2021-08-31 11:24:19
  • MSSQL报错参数数据类型text对于replace函数的参数1无效怎么解决
    MSSQL报错参数数据类型text对于replace函数的参数1无效怎么解决

    “MSSQL报错参数数据类型text对于replace函数的参数1无效怎么解决”,在日常操作中,相信很多人在MSSQL报错参数数据类型text对于replace函数的参数1无效怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...

    2021-08-31 11:21:19
  • solaris11 ssh怎么禁止root用户连接
    solaris11 ssh怎么禁止root用户连接

    “solaris11 ssh怎么禁止root用户连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“solaris11 ssh怎么禁止root用户连接”吧!在虚拟机中新安装的solaris11,安...

    2021-08-31 11:20:19
  • 怎么用SQL语句查看SQL Server的结构信息
    怎么用SQL语句查看SQL Server的结构信息

    “怎么用SQL语句查看SQL Server的结构信息”,在日常操作中,相信很多人在怎么用SQL语句查看SQL Server的结构信息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用SQL语句查看SQL S...

    2021-08-31 11:04:20
  • sqlplus和sqlldr工具的安装方法
    sqlplus和sqlldr工具的安装方法

    “sqlplus和sqlldr工具的安装方法”。本文介绍的方法操作简单快捷,实用性强。sqlplus和sqlldr工具的安装方法”吧!不管安装什么客户端工具都需要先安装instantclient-basic-linux.x64-11.2.0...

    2021-08-31 10:59:20
  • MHA的安装和部署步骤
    MHA的安装和部署步骤

    “MHA的安装和部署步骤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!##################MHA安装和部署###########...

    2021-08-31 10:52:20
  • redis4.0下MEMORY命令详解
    redis4.0下MEMORY命令详解

    “redis4.0下MEMORY命令详解”,在日常操作中,相信很多人在redis4.0下MEMORY命令详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis4.0下MEMORY命令详解”的疑惑有所帮助...

    2021-08-31 10:52:19
  • MySQL内存线程独享使用的方法
    MySQL内存线程独享使用的方法

    “MySQL内存线程独享使用的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL内存线程独享使用的方法”吧!  今天这篇文章暂时先分析 MySQL 中主要的 “线程独享内存” 的。...

    2021-08-25 10:37:36
发表评论