PostgreSQL 分区

       由于大量数据存储在数据库同一张表中,后期性能和扩展会受到影响。所以需要进行表分区,因为它可以将大表分成较小的表,从而减少内存交换问题和表扫描,最终提高性能。庞大的数据集被分成更小的分区,更易于访问和管理。

什么是 PGSQL?

PGSQL 是一个开源关系数据库系统。它支持关系 (SQL) 和非关系 (JSON) 查询。它被用作基于 Web 、移动和分析应用程序的主要数据库。

以下是 PGSQL 的一些常见用例:

  • LAPP(Linux、Apache、PostgreSQL 和 PHP)堆栈中的强大数据库。

  • 地理空间数据库。

  • 通用事务数据库。

PGSQL的主要特性

  • 用户定义的数据类型:PGSQL 可以扩展以创建用户定义的数据类型。

  • 复杂的锁定机制:存在三种锁定机制,行级锁、表级锁和资询锁。

  • 表继承:PGSQL 允许基于另一个表创建子表。

  • Foreign Key Referential Integrity:指定外键值对应于另一个表中的实际主键值。

嵌套事务(保存):这意味着子查询的结果不会在其父查询回滚时回滚。但是对于保存,若顶层事务被回滚,所有的保存点也会被回滚。

什么是 PGSQL 分区?

分区是指将一个大表拆分成更小的物理块,这些块可以根据其用途存储在不同的存储介质中。每个部分都有其特点和名称。分区有助于提高数据库服务器的性能,因为需要读取、处理和返回的行数明显减少。您还可以使用 PostgreSQL 分区来划分索引和索引表。

PGSQL 分区主要有两种类型:垂直分区和水平分区。在垂直分区中,我们按列划分,在水平分区中,我们按行划分。

水平分区涉及将不同的行放入不同的表中。例如,您将 18 岁以上学生的详细信息存储在一个分区中,将 18 岁以下的学生详细信息存储在另一个分区中。可以在两个分区上创建联合视图以显示所有学生。

垂直分区包括创建列较少的表,并使用其他表来存储剩余的列。规范化还涉及到跨表的列分割,但是垂直分区不仅限于此,甚至在已经规范化的情况下还会对列进行分区。

如何创建分区表

简单描述一下自己创建分区表的步骤(水平,按创建时间分区)

1. 创建主表 分区键:order_created_time

CREATE TABLE "mac_id_new" (
  "id" int8,
  "created_by" varchar(255) COLLATE "pg_catalog"."default",
  "created_time" timestamp(6),
  "last_modified_by" varchar(255) COLLATE "pg_catalog"."default",
  "last_modified_time" timestamp(6),
  "deleted" bool,
  "deleted_by" varchar(255) COLLATE "pg_catalog"."default",
  "deleted_time" timestamp(6),
  "optimistic_locking_version" int8,
  "order_id" int8,
  "order_created_time" timestamp(6)
) PARTITION by range(order_created_time);

2.创建分区表函数 

CREATE OR REPLACE FUNCTION f_create_partition_table(t_name VARCHAR,bengin_date TIMESTAMP ,end_date TIMESTAMP)
RETURNS boolean AS $$
DECLARE
    create_partition_table_sql varchar(1024);
    create_table_index_sql varchar(1024);
    create_table_pk_sql varchar(1024);
        bengin_date_str varchar(64);
        end_date_str varchar(64);
        query_partition_table_sql varchar(1024);
        t_row record;
begin
        bengin_date_str := to_char(bengin_date,'YYYYMMDD');
        end_date_str := to_char(end_date,'YYYYMMDD');
         
        create_partition_table_sql := ' create table if not exists '||  t_name ||'_' || bengin_date_str  || '_' || end_date_str ||
                                                                    ' partition of '||t_name ||
                                                                    ' for values from ('''|| bengin_date ||''') ' ||
                                                                    ' to ('''|| end_date ||''')';
                                                                     
        create_table_index_sql := ' CREATE INDEX IF NOT EXISTS idx_'|| t_name ||'_'|| bengin_date_str || '_' || end_date_str ||'_business_id ON '
                                                                    || t_name ||'_'|| bengin_date_str || '_' || end_date_str || ' USING btree (business_id);';
                                                                     
        create_table_pk_sql := 'ALTER TABLE '|| t_name ||'_' || bengin_date_str || '_' || end_date_str ||' ADD CONSTRAINT '|| t_name ||'_' || bengin_date_str || '_' || end_date_str ||'_PK PRIMARY KEY ("id");';
    execute create_partition_table_sql;
    execute create_table_index_sql;
    execute create_table_pk_sql;
    return true;
end;
$$ LANGUAGE plpgsql;

3.创建分区表,执行后刷新数据库,在表mac_id_new下查看验证分区表

SELECT f_create_partition_table('mac_id_new','2023-07-01','2024-01-01');
SELECT f_create_partition_table('mac_id_new','2024-01-01','2024-07-01');
SELECT f_create_partition_table('mac_id_new','2024-07-01','2025-01-01');
SELECT f_create_partition_table('mac_id_new','2025-01-01','2025-07-01');
SELECT f_create_partition_table('mac_id_new','2025-07-01','2026-01-01');

 

最后进行数据迁移,数据校验,至此分区表创建完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

静态网页设计——电影角(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 使用技术:HTMLCSSJS 主要内容:本网页主要利用HTML语言编写,简要介绍世界上一些主要国家,例如,中,…

RT-DETR Gradio 前端展示页面

效果展示 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradio,你只需几行代码就可以生成一个网页应用程序,…

从不同应用,划片机主要包括如下几个方面

在半导体行业中,划片机被广泛应用于各种材料和应用的切割和加工。根据不同的应用,划片机主要可以分为以下几个方面: 一、半导体材料划片 半导体材料划片是划片机最早的应用领域之一。在这个领域中,划片机主要被用于将半导体材料&…

elasticsearch的查询方式和数据库事务隔离级别的思考

项目中用到了 elasticsearch,发现有几种查询方式不太一样,思考了一下,总结如下 普通分页 等同于关系数据库的分页查询,例如 mysql 的 limit,如下 sql select * from test limit 100000,10 这种查询方式有一个问题&a…

Redis 持久化—RDB

文章目录 1. 为什么需要Redis持久化?2. Redis持久化的几种方式3. RDB简介4. 持久化触发4.1 手动触发4.1.1 save命令4.1.2 bgsave 命令 4.2 自动触发4.2.1 save m n4.2.2 flushall4.2.3 主从同步触发 5. 配置说明6. 配置配置7. 配置配置8. RDB 文件恢复9. RDB 优缺点…

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统(完整项目) 前言1、搭建步骤及方法2、集成多种插件功能,实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结: 前言…

csdn查看积分的方法(最快)

我在浏览别人“资源”的时候,发现需要积分下载。下面分享最快查看积分的方法,非常简单。 在个人主页,选择任意一篇文章。最左边会显示积分(如果不在主页,点击上面的csdn头像会跳到首页)。如图:…

Cesium自定义电子围栏特效材质

1.new Cesium.Viewer中添加 requestWebgl1: true, 2. 编写材质,主要分三步 (1)定义MaterialProperty (2)设置材质 (3)添加材质 //定义材质对象及变量 function DynamicWallMaterialPropert…

深入浅出Prometheus架构原理

目录 1 Prometheus简介 2 Prometheus 的优势 2.1 Prometheus 适用于什么场景 2.2 Prometheus 不适合什么场景 3 Prometheus 的架构 4 Prometheus 的组件 4.1 组件介绍 4.1.1 Prometheus Server 4.1.2 Exporter 4.1.3 Push Gateway 4.1.4 Grafana 4.1.5 Alert…

Python批量读取大量nc格式文件并导出全部时间信息

本文介绍基于Python语言,逐一读取大量.nc格式的多时相栅格文件,导出其中所具有的全部时间信息的方法。 .nc是NetCDF(Network Common Data Form)文件的扩展名,表示一种常用的科学数据存储格式。NetCDF是一种自描述的、可…

Alibaba Cloud Linux镜像操作系统超详细测评!兼容CentOS

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版,针对阿里云服务器ECS做了大量深度优化,Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS,Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

【基础篇】十二、引用计数法 可达性分析算法

文章目录 1、Garbage Collection2、方法区的回收3、堆对象回收4、引用计数法5、可达性分析算法6、查看GC Root对象 1、Garbage Collection C/C,无自动回收机制,对象不用时需要手动释放,否则积累导致内存泄漏: Java、C#、Python、…

跟着仙凡兄学习 ros2 ubuntu与windows的安装(本人小白开始,一步一步跟着坑走,最后都成功的)

目 录 1 ROS安装的步骤 2 1.1 ROS UBUNTU安装 2 1.1.1 环境配置:UBUNTU20.04 2 1.1.2 设置编码 2 1.1.3 添加ROS2 APT仓库 3 1.1.4 接下来可以安装ROS2了 3 1.1.5 创建 COLCON 工作区并下载教程 3 1.1.6 设置环境 4 1.1.7 双环境设置 4 1.1.8 验证之一 5 1.2 ROS2 W…

《剑指offer》数学第二题:求1+2+3+...+n

题目描述: 求123...n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路: 我们可以用递归和短路运算符来进行运算,具体代码如下。 代码实现: pac…

基于知识图谱的图神经网络推理

基于知识图谱的图神经网络推理 - 知乎导读 本次分享题目为基于知识图谱的图神经网络推理,首先会介绍知识图谱相关的背景。第二部分GNN for KG会以CompGCN为基础,介绍将图神经网络迁移到知识图谱上面的工作。第三部分主要介绍针对知识图谱所设计的GNN…ht…

开启Android学习之旅-1

最近在学习《第一行代码 Android》,两天看书把所有代码都敲了一遍。由于之前没有接触过 Kotlin,导致了囫囵吞枣,跟着书会敲,离开就忘了。Android 大佬开发的各种框架、控件好像大部分都用了 Kotlin。看他们的源码,理解…

齐次和非齐次线性方程组和非线性方程组的求解

1.非齐次线性方程组的求解 AXb为非齐次线性方程组的向量表示 求解方法1就是上面所述,其中求解方法2解决求解方法1中ATA不可逆或括号中计算过程过于麻烦的问题。 2.齐次线性方程组的求解 AX0为齐次线性方程组的向量表示 当p>q的时候 A进行SVD分解后的V矩阵正好…

Linux的LVM与磁盘配额

一.LVM 1.什么是LVM Logical Volume Manager 逻辑卷管理 能够在保持现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件,不能基于LVM创建 解释:就是将多个不同的物理卷组合在一起形…

iOS手机查看蓝牙底层日志

文章目录 一、需要的环境二、在iOS设备上安装Profiles文件三、安装Xcode四、安装packetLogger五、启动蓝牙数据包分析 参考文档:A New Way to Debug iOS Bluetooth Applications 一、需要的环境 iOS 13 device and cableMac computer/laptopApple Developer Progr…

大数据情况下如何保证企业数据交换安全

数据交换是指在网络或其他方式下,不同主体按照规定的规则和标准实现数据的共享、传输和处理的过程。大数据时代的到来使得数据交换的重要性更为凸显,大数据带来了海量、多样、高速、低价值密度等特点,也带来了更多的价值挖掘和应用场景。 保障…