YUNBEE云贝-技术分享:PostgreSQL分区表

news2024/11/18 6:48:10

引言

PostgreSQL作为一款高度可扩展的企业级关系型数据库管理系统,其内置的分区表功能在处理大规模数据场景中扮演着重要角色。本文将深入探讨PostgreSQL分区表的实现逻辑、详细实验过程,并辅以分区表相关的视图查询、分区表维护及优化案例,以揭示这一功能的强大之处。

一、PostgreSQL分区表实现逻辑

1.1. 分区类型详解

PostgreSQL支持两种主要的分区类型:

• 范围分区(Range Partitioning)

根据表中某一列的值范围将表分割成若干个分区。例如,我们可以按照时间字段(如日期)创建按年、季度或月份的范围分区。

图片

• 列表分区(List Partitioning)

根据某一列的特定值列表来划分分区。例如,可以根据国家/地区的枚举值进行列表分区。

图片

• hash分区(hash Partitioning)

根据某一列的特定值列表来划分分区。例如,可以根据国家/地区的枚举值进行列表分区。

图片

查看表结构

图片

插入数据,查看数据分布

图片

二、分区表维护操作

2.1 添加分区

示例:添加range分区

图片

2.2 删除分区

图片

2.3 ATTACH分区

ATTACH操作:ATTACH操作用于将一个已存在的表作为分区添加到一个分区表中。这样做的好处是可以将预先填充好数据的表作为分区快速加入到分区表体系中,或者在需要调整分区布局时将一个表转换为分区表的分区。

图片

其中:

• partitioned_table:已存在的分区表名。
• new_partition_table:要作为分区添加的已存在的表名,该表应具有与partitioned_table相同的结构,并且其数据应符合所指定的分区范围。
• FOR VALUES IN (partition_range):指定新分区所对应的分区键值范围。partition_range应与分区表的分区策略相匹配。
 

示例:

假设有一个按年份分区的销售表sales,现在有一张名为sales_2024的表,里面存储了2024年的销售数据,希望将其作为sales表的一个分区。

图片

-- 假设sales_2024表已存在且结构与sales表相同,数据均为2024年的销售记录

图片

2.3 DETACH分区

DETACH操作:DETACH操作用于从分区表中移除一个现有的分区。

这通常在需要临时独立处理某个分区的数据(如备份、迁移、清理等)或者调整分区布局时使用。

语法:

ALTER TABLE partitioned_table DETACH PARTITION existing_partition;

其中:

• partitioned_table:已存在的分区表名。

• existing_partition:要从分区表中分离出去的现有分区表名。

示例:假设要将sales表中存储2023年销售数据的分区sales_2023分离出来,以便单独进行数据清理。

图片

注意事项:

• ATTACH与DETACH操作都会立即生效,对分区表结构进行更改。在执行这些操作时,应确保没有正在进行的事务依赖于被操作的分区。

• 分离出来的分区表仍保留其数据,可以独立进行查询、更新等操作。但在DETACH之后,该分区不再受分区表的查询优化等特性影响。

• 在ATTACH操作中,新分区表的数据应严格符合所指定的分区范围,否则可能会导致数据完整性问题或查询错误。

• 对于DETACH操作,确保在分离后对分区表的查询不受影响,可能需要调整查询条件或创建合适的索引。

2.4 自动扩建分区

请读者使用pg_partman插件完成

三、分区表优化示例

在处理海量数据的场景下,PostgreSQL的分区表功能成为了提升查询性能和管理效率的关键利器。案例背景一家电子商务公司拥有一个庞大的订单表,表中记录了历年来的所有订单数据。随着业务的发展,订单表的数据量已经达到了数十亿行,导致查询性能严重下滑,尤其在处理特定时间段的报表查询时,响应时间变得极其漫长。问题分析

1. 查询性能低下:由于订单表庞大,任何涉及到全表扫描的查询都会花费很长时间。

2. 数据维护困难:数据清理和归档工作复杂,难以对老旧数据进行高效管理。

分区表优化方案基于上述问题,我们采用了PostgreSQL的范围分区功能对订单表进行优化。

步骤一:创建分区表

首先我们决定按年份对订单表进行范围分区,每年一个分区:

图片

-- 创建2010年至2022年的分区

图片

--查看当前分区

图片

--模拟数据

图片

步骤二:创建普通表

图片

步骤三:对比性能

1)非分区表

图片

2) 分区表

图片

对比以上两个执行计划

图片

效果验证优化后,查询性能有了显著提升,因为查询仅针对特定年份的分区,避免了对整个大表的扫描。此外,数据维护工作也变得更加方便,可以直接操作单个分区进行数据清理和归档。

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的番茄成熟度检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要:在本博客中,我们深入探讨了基于YOLOv8/v7/v6/v5的番茄成熟度检测系统。核心技术基于YOLOv8,同时融合了YOLOv7、YOLOv6、YOLOv5的算法,对比了它们在性能指标上的差异。本文详细介绍了国内外在此领域的研究现状、数据集的处理方…

OpenHarmony实战:轻量级系统之移植验证

OpenHarmony芯片移植完成后,需要开展OpenHarmony兼容性测试以及芯片SDK功能性测试。除可获得测试认证之外,还可以在开发阶段提前发现缺陷,大幅提高代码质量。 OpenHarmony兼容性测试 OpenHarmony兼容性测试是XTS(OpenHarmony生态…

基于深度学习的植物叶片病毒识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要:本文深入研究了基于YOLOv8/v7/v6/v5的植物叶片病毒识别系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Strea…

手搓链表(java)(不完整)

手搓链表(java)(不完整) 文章目录 手搓链表(java)(不完整)前言一、代码1.MyLinkedList类:2.测试类: 总结 前言 提示:以下是本篇文章正文内容&…

精品PPT-2023年无人驾驶汽车车联网网络安全方案

以下是部分PPT内容,请您参阅。如需下载完整PPTX文件,请前往星球获取: 无人驾驶安全架构是一个复杂的系统,它涉及到多个关键组件和层次,以确保无人驾驶车辆在各种情况下都能安全、可靠地运行。以下是一些主要的无人驾驶…

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况,用苹果手表Apple Watch录音,有的录1个多小时,有的录了3、4小时,甚至更长时间,因为手表没电,忘记保存等原因造成录音损坏,都是只能播放4秒,同步到手机也一样&…

AI绘图:Stable Diffusion ComfyUI局部重绘与智能扩图全面教程

前言 在数字艺术创作中,局部重绘和智能扩图是两个非常重要的功能。局部重绘允许我们在保留原有图像的基础上,对特定区域进行修改或创新。而智能扩图则能够帮助我们在图像的边缘添加新的元素,从而扩展图像的内容。本文将详细介绍如何在Stable…

鼎捷T100二次开发资料大全 T100 webservice开发明细 4GL从入门到实战 T100实战例子 鼎捷二次开发DEMO 鼎捷单档双档开发

在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案。   曾经参与鼎捷Tiptop GP、T100实施十多个项目,具有丰富的二次开发经验&am…

代码随想录算法训练营DAY16|C++二叉树Part.3|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

文章目录 104.二叉树的最大深度思路伪代码CPP代码 111.二叉树的最小深度思路伪代码CPP代码 222.完全二叉树的节点个数思路视为普通二叉树-递归视为普通二叉树-迭代利用完全二叉树特性-递归 伪代码视为普通二叉树-递归伪代码视为普通二叉树-迭代伪代码利用完全二叉树特性-递归伪…

SCP 从Linux快速下载文件到Windows本地

需求:通过mobaxterm将大文件拖动到windows本地速度太慢。 环境:本地是Windows,安装了Git。 操作:进入文件夹内,鼠标右键,点击Git Bash here,然后输入命令即可。这样的话,其实自己本…

维基百科推广方法及注意事项解析-华媒舍

1. 维基百科 维基百科是一个自由而开放的在线百科全书,由志愿者共同创建和编辑。它是全球最大的百科全书,包含了广泛的主题和知识。作为一个公共平台,维基百科是广告和宣传的禁区,但它可以是一个有效的推广工具,帮助您…

修改element-ui table组件展开/收起图标、支持点击行展开/收起、隐藏不可展开行得图标

Element中table默认支持的,展开和收起功能,如下: 针对表格的展开收起,本文改造的主要有3点: 1、修改展开/收起的图标; 2、对于不支持展开/收起的行,隐藏图标; 3、点击行&#xff0…

【Clang+LLVM+honggfuzz学习】(二)honggfuzz的安装与试用

书接上篇【ClangLLVMhonggfuzz学习】(一)LLVM简介、安装和第一个Hello Pass 本篇介绍honggfuzz的安装与简单使用 本文架构,PS:可选择观看哦 前言git安装试用编写测试文件demo.c设置环境变量开始fuzzFuzz-ing疑问 前言 漏洞检测做毕设&#…

mac/win使用pyinstaller打包app/exe文件,活着执行脚本,双击运行

🌸 踩坑记录 python环境最好使用虚拟环境,推荐使用conda管理,并且若本地有python环境,不要使用和 本地环境版本 相同的虚拟环境 这里踩坑较多,已经记不清楚注意点 虚拟环境python版本不要和本地环境一样 mac/win只能…

【Linux】从零认识文件操作

送给大家一句话: 要相信,所有的不美好都是为了迎接美好,所有的困难都会为努力让道。 —— 简蔓《巧克力色微凉青春》 开始理解基础 IO 吧! 1 前言2 知识回顾3 理解文件3.1 进程和文件的关系3.2 文件的系统调用openwrite文件 fd 值…

问题解决:写CSDN博文时图片大小不适应,不清晰,没法排版

项目环境: Window10,Edge123.0.2420.65 问题描述: 当我在CSDN写博文的时候,会经常插入一些图片,但有时候我插入的图片太大了,影响了整体排版。 比如我加入了一张图片,就变成了下面这个样子&…

前端三剑客 —— CSS (第三节)

目录 上节回顾: 1.CSS使用有以下几种样式; 2.选择器 1.基本选择器 2.包含选择器 3.属性选择器 [] 4.伪类选择器 : 5.伪元素选择器 ::before :after 3.常见样式的使用 常见样式参考表 一些特殊样式 媒体查询 自定义字体 变换效果 translate&…

OpenHarmony实战:小型系统平台驱动移植

在这一步,我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构: device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

win11安装wsl报错:无法解析服务器的名称或地址

一 说明 项目开发中,需要用到wsl,因此根据wsl官方(WSL安装教程)命令 wsl --install 进行wsl的安装。而本文主要是记录自己在安装wsl中遇到的问题 “无法解析服务器的名称或地址” 的解决办法。 二 方法一:更改DNS&…

RUST语言基本数据类型认识

1.RUST的基本数据类型参考: 2.使用RUST数据类型声明变量并赋值: let a:i81;//8位有符号整数let a1:u82;//8位无符号整数let b:i161;//16位有符号整数let b1:u162;//16位无符号整数let c:i321;//32位有符号整数let c1:u322;//32位无符号整数let d:i641;//64位有符号整数let d1:u…