返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈PostgreSQL表分区的三种方式
  • 234
分享到

浅谈PostgreSQL表分区的三种方式

2024-04-02 19:04:59 234人浏览 泡泡鱼
摘要

目录一、简介二、三种方式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表分区的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅谈PostgreSQL表分区的三种方式

本文链接: https://lsjlt.com/news/129375.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈PostgreSQL表分区的三种方式
    目录一、简介二、三种方式2.1、Range范围分区2.2、List列表分区2.3、Hash哈希分区三、总结一、简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会...
    99+
    2024-04-02
  • 浅谈Flutter解析JSON三种方式
    Dart实体类格式 class CategoryMo { String name; int count; CategoryMo({this.name, this.cou...
    99+
    2024-04-02
  • 浅谈Java实现分布式事务的三种方案
    目录一、问题描述二、分布式事务2.1、什么是分布式系统2.2、什么是事务2.3、什么是本地事务2.4、什么是分布式事务三、如何进行分布式事务控制3.1、CAP理论3.2、分布式系统如...
    99+
    2024-04-02
  • 浅谈MySQL8.0 异步复制的三种方式
    本实验中分别针对空库、脱机、联机三种方式,配置一主两从的mysql标准异步复制。只做整服务器级别的复制,不考虑对个别库表或使用过滤复制的情况。 实验环境 [root@slave2 ~]# cat /etc/ho...
    99+
    2022-05-26
    MySQL8.0 异步复制 MySQL 异步复制
  • 浅谈Spring解决循环依赖的三种方式
    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。第一种:构造器参数循环依赖表示通过构造器注入构成的...
    99+
    2023-05-30
    spring 循环 依赖
  • 浅谈Java 三种方式实现接口校验
    本文介绍了Java 三种方式实现接口校验,主要包括AOP,MVC拦截器,分享给大家,具体如下:方法一:AOP代码如下定义一个权限注解package com.thinkgem.jeesite.common.annotation; impor...
    99+
    2023-05-30
    java 接口 校验
  • 浅谈Java生成唯一标识码的三种方式
    目录前言正文UUID实现唯一标识码SnowFlake实现唯一标识码通过时间工具生成带有业务标示的唯一标识码前言 我们经常会遇到这样的场景,需要生成一个唯一的序列号来表明某一个数据的唯...
    99+
    2024-04-02
  • postgresql - 三种安装方式
    最近接触了postgresql的安装,和大家分享一下。一、简 介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统...
    99+
    2024-04-02
  • PostgreSQL表分区的方式有哪些
    这篇文章主要讲解了“PostgreSQL表分区的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL表分区的方式有哪些”吧!目录一、简介二、三种方式1、Range范围...
    99+
    2023-06-20
  • 谈谈Android的三种网络通信方式
    Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口)、Org.apache接口和Android.net.*(Android网络接口)。...
    99+
    2022-06-06
    通信方式 通信 Android
  • 浅谈QT打包的两种方式
    目录QT打包的两种方式具体步骤QT打包的两种方式 一个是QT5自带的windeployqt(不需要下载安装),它可以找到程序(exe)用到的所有库文件,并且都拷贝到exe程序的当前文...
    99+
    2023-03-10
    QT打包
  • 浅谈ubuntu执行.sh文件几种方式区别
    前言 不同的script执行方式会造成不一样的结果,尤其对bash的环境影响很大,脚本的执行方式有大概以下几种方式。 首先写一个简单的test.sh文件: #!/bin/bash read -p "Please ...
    99+
    2022-06-04
    ubuntu执行.sh文件 ubuntu执行.sh
  • 浅谈一种Laravel路由文件划分方式
    最初,我想到了利用路由组方法可以接收文件,这就是 laravel 在 RouteServiceProvider 处拆分路由的方式。 <?php namespace ...
    99+
    2024-04-02
  • 浅谈Java字符串比较的三种方法
    目录java字符串如何进行比较?1.通过使用 equals() 方法2.通过使用 == 运算符3.通过使用 compareTo() 方法java字符串如何进行比较? 我们可以根据内容...
    99+
    2023-05-14
    Java字符串 Java字符串比较
  • 浅谈SpringBoot @Autowired的两种注入方式
    Autowired有两种注入方式 by type by name 默认使用的是byType的方式向Bean里面注入相应的Bean。例如: @Autowire...
    99+
    2024-04-02
  • 浅谈MyBatis执行SQL的两种方式
    目录前言准备接口和Mapper配置文件:使用SqlSession 发送 SQL使用 Mapper 接口发送 SQL比较两种发送 SQL 方式前言 本文介绍MyBatis执行SQL语句...
    99+
    2024-04-02
  • 浅谈HashMap中7种遍历方式的性能分析
    目录一、前言二、HashMap遍历2.1、迭代器EntrySet2.2、迭代器 KeySet2.3、ForEachEntrySet2.4、ForEach KeySet2.5、Lamb...
    99+
    2024-04-02
  • 浅拷贝的三种实现方式
    1、ES6的方法 Object.assign()  作用:将第二个参数及以后的参数合并到第一个对象里。 参数1:target 参数2:对象…… 参数3:对象…. 例:       var obj = {a:{name:”kaiqin”,ag...
    99+
    2023-10-29
    三种 方式
  • 浅谈MySQL中分区表基本类型
    小编这次要给大家分享的是浅谈MySQL中分区表基本类型,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。MySQL分区表概述随着MySQL越来越流行,Mysql里面的保存...
    99+
    2024-04-02
  • 浅谈三种数据库的 SQL 注入
    目录SQL 注入原理SQL 注入分类1. 数字型注入2. 字符型注入3. 其他类型常见数据库的注入SQL ServermysqloracleSQL 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程...
    99+
    2022-08-11
    SQL 注入
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作