首页 > 数据库 >postgresql函数:定期删除模式下指定天数前的表数据及分区物理表

postgresql函数:定期删除模式下指定天数前的表数据及分区物理表

时间:2022-11-16 19:06:44浏览次数:39  
标签:postgresql name -- 天数 分区 period tb select schema

一、现有函数
-- 1、现有函数调用
select ods.deletePartitionIfExists('fact_ship' || '_' || to_char(CURRENT_DATE - INTERVAL'2 month','yyyymmdd'));
-- 2、函数内容
CREATE OR REPLACE FUNCTION "ods"."deletepartitionifexists"("tb_name_partiton_val" varchar)
  RETURNS "pg_catalog"."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 %s ',tb_name_partiton_val);
    END IF;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

-- 二、依赖项
-- 要求:保留近一个月、两个月、一星期的分区,之前的都删除
-- 函数体:del_schema_period(schema_name,table_name,period_saved)
-- 1、现有函数逻辑
-- 判断存在表的话(to_regclass (tb_name_partiton_val)),删除两月前的当日分区
drop table if exists ap.fact_ship_20220910;
select to_regclass('fact_ship') ; --是否存在此表,不存在返回null,存在返回表名
-- 2、日期
select to_char(date_trunc('day',now())+'-1 day','yyyymmdd');
-- 3、查询模式下的表
select tablename
from pg_tables
where schemaname = 'ods'
and tablename like 'ods_icsale_%';
-- and position ('_2' in tablename) = 0;

-- 三、过程
-- 要求:保留近一个月、两个月、一星期的分区,之前的都删除【先删除数据,再判断是否存在表,删除结构】
-- 函数体:del_schema_period(schema_name,table_name,period_saved)
-- 调用:select ods.del_schema_period('ap','fact_ship','4 days')
select ods.del_schema_period('ap','fact_ship','4 days')
-- 1、删除指定日期的数据
CREATE OR REPLACE FUNCTION "ods"."del_schema_period"(schema_name varchar,table_name varchar,period_saved varchar)
  RETURNS "pg_catalog".void AS $BODY$
  BEGIN
      EXECUTE format('delete from %s.%s where dt < to_char(date_trunc(''day'',now())+''- %s'',''yyyymmdd'')',schema_name,table_name,period_saved);
  END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

-- 2、如果是分区表,删除表结构
CREATE OR REPLACE FUNCTION "ods"."del_schema_period"(schema_name varchar,table_name varchar,period_saved varchar)
  RETURNS "pg_catalog".void AS $BODY$
  DECLARE arrat_t varchar[];
    DECLARE dt_split INTERVAL='-' ||period_saved;
    DECLARE tb_each VARCHAR;
  BEGIN
        -- 删除指定日期的数据
        EXECUTE format('delete from %s.%s where dt < to_char(date_trunc(''day'',now())+''- %s'',''yyyymmdd'')',schema_name,table_name,period_saved);
        -- 如果存在分区表,则删除对应的物理表
        select array(select tablename
        from (
            select tablename,concat('20',split_part(tablename,'_20',2)) as mon_day
            from pg_tables
            where schemaname = schema_name
            and tablename like concat(table_name,'_%')
        ) a
        where mon_day < to_char(date_trunc('day',now()) + dt_split,'yyyymmdd')) into arrat_t;
        raise notice 'helloworld %',arrat_t;
        -- 遍历数组的每个值,删除对应的表结构
                foreach tb_each in array arrat_t
        loop
            -- 删除表
                        raise notice 'helloworld %',tb_each;
                        EXECUTE format('DROP TABLE IF EXISTS %s.%s', schema_name,tb_each);
        end loop;
  END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
-- 使用:
select ods.del_schema_period('ap','fact_ship','70 days')

作者:​​哥们要飞​​



标签:postgresql,name,--,天数,分区,period,tb,select,schema
From: https://blog.51cto.com/liujinhui/5856999

相关文章

  • Centos7 yum安装及使用 postgreSQL 12 教程
    1、在postgreSQL官网查找源(https://www.postgresql.org/download/)按照系统配置进行选择,根据命令脚本执行就行:  2、开启远程连接postgreSQL的数据库可行性文件目录......
  • docker 安装postgresql
    docker中安装创建postgresql容器dockerrun-d-p5432:5432--namepostgresql-vpgdata:/var/lib/postgresql/data-ePOSTGRES_PASSWORD=123456postgres创建pg......
  • Flink 按键分区状态基本介绍
    在实际应用中,我们一般都需要将数据按照某个key进行分区,然后再进行计算处理;所以最为常见的状态类型就是KeyedState。之前介绍到keyBy之后的聚合、窗口计算,算子所持有的状态......
  • C++ 内存分区模型
    代码区:存放函数的二进制代码,由操作系统管理全局区:存放全局变量、静态变量以及常量。栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若......
  • MySQL分表分区
    表分区表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。水平分区这种形式分区是......
  • CentOS 7 patroni 搭建postgresql高可用
    CentOS7patroni搭建postgresql高可用InstallPatroni安装python等#!/bin/bashyuminstallpython-psycopg2-yyuminstallepel-release-yecho"installp......
  • Java 内存分区之什么是 CCS区 Compressed Class Space 类压缩空间
    https://blog.csdn.net/qq_27093465/article/details/106760961 Java内存分区之什么是CCS区CompressedClassSpace类压缩空间  了解到什么是ccs区,一般都是实际......
  • 分区卸载 、挂载、格式化问题
     1. 分区卸载、挂载、格式化相关问题案例:SD卡设备名:mmcblk0SD卡分区名:mmcblk0p1分区挂载点:/usr/local/data1.显示系统挂载情况df-......
  • postgresql数据库生成GUID
    CREATEorREPLACEFUNCTIONnew_guid()RETURNS"pg_catalog"."varchar"AS$BODY$DECLAREv_seed_valuevarchar(32);BEGINselectmd5(inet_client......
  • PostgreSQL 实时位置跟踪+轨迹分析系统实践 - 单机顶千亿轨迹/天
      背景随着移动设备的普及,越来越多的业务具备了时空属性,例如快递,试试跟踪包裹、快递员位置。例如实体,具备了空间属性。例如餐饮配送,送货员位置属性。例如车辆,实时位......