PostgreSQL 分区

news/2024/7/9 20:07:07 标签: postgresql, 数据库

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

什么是 PGSQL?

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

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

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

 

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


http://www.niftyadmin.cn/n/5305267.html

相关文章

LCR 176. 判断是否为平衡二叉树

解题思路: class Solution {public boolean isBalanced(TreeNode root) {return recur(root) ! -1;}private int recur(TreeNode root) {if (root null) return 0;int left recur(root.left);if(left -1) return -1;int right recur(root.right);if(right -1) …

Python元组(tuple)一种不可变的有序数据类型的使用

Python元组(tuple)是一种不可变的有序数据类型,用于存储多个元素。元组的元素可以是不同的数据类型,如整数、浮点数、字符串等,并使用逗号进行分隔。元组一旦创建,其元素和长度都是固定的,不可被…

【编译原理】期末预习PPT前四章笔记II

看了看学校的ppt,记的比较随意O.o 因为我的考试范围里边没有简答所以概念什么的没怎么记 没有简答只有选择真是太好了嘿嘿嘿 目录 I. 概述(好多字。。) 一、高级语言的分类 1、体裁 2、执行方式 二、各种语言的执行方式 三、编译程序…

安卓11通过脚本修改相应板型系统属性

安卓10以后rk的一套源码兼容很多板型,多种cpu型号都兼容了,这一点相比之前省心了很多,所以就诞生了需要一套代码兼容多种板子的需求,定制修改中需要经常修改系统属性,通过以下脚本一次实现: #!/bin/bashfu…

kubernetes(一)概述与架构

云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes 更新:移除 Dockershim 的常见问题 | Kubernetes B站课程:https://www.bilibili.com/video/BV13Q4y1C7hS/?p26 1.概述 概述 | Kubernetes 大规模容器编排系统 kubernetes具有以下特性&#xf…

【技能---500G硬盘-Ubuntu 20.04安装分区参考】

文章目录 Ubuntu 20.04安装分区指导安装分区流程Ubuntu 系统分区关键一步----- 选择安装启动引导器的设备 Ubuntu 20.04安装分区指导 安装Ubuntu 20.04的时候可以自己指定各个内存空间的占用,值得注意的是,这里的分区有一定的技巧!&#xff0…

class_order 数组来实现重新编号或者改变类别

当你在处理分类问题时,数据集的标签(类别)可能是从0到n-1的整数,其中n是类别的总数。有时候,在进行模型训练之前,你可能想要改变类别的顺序或者重新编号。这可以通过class_order数组来实现。 问题描述&…

宝宝的听力发育进程

小宝宝听力发育进程: 在母亲怀孕中晚期,小宝宝就有了听觉:6个月胎儿的听力已经和成年人相当了。 ◆ 出生0-7天的小宝宝会随声音变化产生不同反应,当在宝宝耳边拍巴掌或摇摇铃,宝宝可能会有惊跳反应,或吓哭…