首页 > 数据库 >【数据库】Postgresql、PG的分区操作:创建、删除指定分区,非分区表转分区表

【数据库】Postgresql、PG的分区操作:创建、删除指定分区,非分区表转分区表

时间:2022-09-26 19:33:52浏览次数:61  
标签:EXECUTE Postgresql name -- 分区 分区表 tb

〇、参考链接

 

一、为表创建指定分区

-- 表创建分区 参数  表名 分区序列  例如: ltc_customer , 20220915 则创建 ltc_customer_20220915 分区表
CREATE or replace FUNCTION createPartitionIfNotExists (tb_name VARCHAR, partiton_val VARCHAR) RETURNS void AS $body$
  DECLARE master_name TEXT := tb_name; -- 创建分区表的表名
  DECLARE partition_name TEXT := tb_name || '_' || partiton_val; -- 分区的表名称

  BEGIN
    -- 判断分区名称是否存在,不存在时才需要创建
    IF to_regclass (partition_name) IS NULL THEN
      -- 执行创建分区
      EXECUTE format (
          'create table %I partition of %I for values in (%s)',
          partition_name,
          master_name,
          partiton_val
      );
    END IF;
  END;
$body$ LANGUAGE plpgsql;

二、删除指定的表分区

-- 删除表分区 例如: ltc_customer_20220915
CREATE or replace FUNCTION deletePartitionIfExists (tb_name_partiton_val VARCHAR) RETURNS void AS $body$
  DECLARE master_name TEXT := tb_name_partiton_val; -- 删除分区表 表名

  BEGIN
    -- 判断分区名称是否存在,不存在时才需要创建
    IF to_regclass (tb_name_partiton_val) is not null THEN
      -- 执行创建分区
      EXECUTE format ('DROP TABLE IF EXISTS %s ',tb_name_partiton_val);
    END IF;
  END;
$body$ LANGUAGE plpgsql;

三、将原有的非分区表转换为分区表

-- 将原有的非分区表转化为分区表
CREATE OR REPLACE FUNCTION "table_migration"("tb_name" varchar, "partition_column" varchar)
  RETURNS "pg_catalog"."void" AS $BODY$ DECLARE
DECLARE
  old_name TEXT := tb_name || '_old';
declare d varchar;
declare days varchar[] :=   array(select to_char(date(t),'yyyymmdd')::varchar as day
 from 
 generate_series('2022-08-01'::date,'2022-11-01', '1 days') as t );
BEGIN
  IF
    to_regclass ( tb_name ) IS NOT NULL THEN
      -- 1. 表重命名
      EXECUTE format ( 'ALTER TABLE %s RENAME TO %s', tb_name, old_name );
      
      -- 2. 创建分区表
      EXECUTE format ( 'CREATE TABLE %s ( LIKE %s INCLUDING ALL ) PARTITION BY list ( %s )', tb_name, old_name, partition_column );
      
      -- 3. 创建2022年一年的分区
      foreach d in array days loop
        EXECUTE format ( 'create table %s partition of %s for values in (%s)', tb_name || '_' || d, tb_name, d );
      end loop;
      
      -- 4. 执行数据迁移
      EXECUTE format ( 'insert into %s select * from %s', tb_name, old_name );
      
      -- 5. 删除原来的表,可以先不做
      -- EXECUTE format ( 'drop table %s',  old_name );
  END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

 

标签:EXECUTE,Postgresql,name,--,分区,分区表,tb
From: https://www.cnblogs.com/liujinhui/p/16732092.html

相关文章

  • postgresql 分表
    createtabletest_part(idint,namevarchar,agenumeric)partitionbyrange(age);createtabletest_part_yongpartitionoftest_partforva......
  • 分区数量与reduce个数怎样才能不报错
    reduce数量只能是1个或者比分区的数量多,否则数据写入会出现问题报错。因为系统有自带的方法,也可以自定义,如果自定义就跑自定义的方法,是1就用系统默认的。大于的时候会产......
  • 【MySQL】MySQL分区表
    本想整理一下MySQL分区表的内容。发现有人已经写了很详细了,这里整理一下链接第36期:MySQL原生水平拆表第37期:适当的使用MySQL原生表分区第38期:MySQL时间类分区具体实......
  • PostgreSQL 函数稳定性在索引与全表访问下的性能差异
     一、构建测试数据createorreplacefunctiontest_volatile(idinteger)returnsbigintvolatilelanguagesqlas$$selectcount(*)fromt1$$;/......
  • PostgreSQL 视图练习
    练习来源于《SQL基础教程(第2版)》5.1创建初满足下述三个条件的视图(视图名称为ViewPractice5_1)shop=#createviewViewPractice5_1shop-#asshop-#selectproduct_ty......
  • Centos7设置postgresql数据库开机自启动
    前言PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下如果不知道具体的路径,可以用find命令进行查找。命令如下:[root@admin~]#find/-......
  • parted命令详解-分区
    parted命令详解-分区1、选择要分区的硬盘,此处为/dev/sdbroot@ubuntu-virtual-machine:~#parted/dev/sdbGNUParted3.2使用/dev/sdb欢迎使用GNUParted!输入'h......
  • KVM 虚拟机硬盘分区扩容
    分区情况如下,扩容sda1注意,sda1必须占满硬盘后面的所有空间(最后34个扇区,是GPT分区的备用区块,不能动)$lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsda......
  • PostgreSQL与Greenplum之区别
    一、区别:(1)Greenplum是用于报告、分析、机器学习、人工智能和高并发SQL的大规模并行数据库的开源软件。Greenplum以PostgreSQL为基础,Greenplum数据库被描述为以MP......
  • 内存分区
    内存分区模型不同区域存放的数据,赋予不同的生命周期,可以进行更大的灵活编程在程序编译后,生成exe可执行程序,为执行前分为代码区和全局区1.代码区存放函数体的二进制代......