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

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

时间:2022-11-02 20:59:35浏览次数:36  
标签:postgresql name 删除 -- 天数 分区 period 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,select,schema
From: https://www.cnblogs.com/liujinhui/p/16852389.html

相关文章

  • postgresql函数:满足特定格式的表及指定日期前的删除
    --一、现有函数--1、现有函数调用select"ap"."delete_analysis_backup"('ap');--2、函数内容CREATEORREPLACEFUNCTION"ap"."delete_analysis_backup"("schema_name......
  • postgresql从库搭建--物理复制
    图如下:  Postgresql早在9.0版本开始支持物理复制,也称为流复制,通过从实例级复制出一个与主库一模一样的备库。流复制同步方式有同步,异步两种,如果主节点和备节点不是很......
  • postgresql数据库查看表结构
    1、https://wenku.baidu.com/view/ab5931356ddb6f1aff00bed5b9f3f90f76c64dc3.html?_wkts_=1667367450919&bdQuery=postgresql+%E6%9F%A5%E7%9C%8B%E8%A1%A8%E7%BB%93%E6%......
  • 05_greenplum定义数据库对象_分区
    一、分区概念(提高性能) 1、表分区 2、分区示意图  注:三个分区,九个子分区 3、数据分布&分区  4、全表扫描VS分区扫描 注:全表扫描:会对全部segmen......
  • 分片架构和分区架构
    分片架构 通过叠加更多的服务器来提高性能分片规则选取技术比较大的某个数据键值,让数据均匀分布,避免热点分布适合主业务数据hash分片 ......
  • swap分区创建与删除
    #创建swap分区1、创建一个swap文件cd/varmkdirswapddif=/dev/zeroof=swapfilebs=1024count=2000000#count代表创建2G大小,一般swap内存是物理内存的1.5倍。2......
  • postgresql13 rpm方式安装
    环境:OS:Centos7DB:13.8 1.介质下载可以到官网下载相应版本的rpm介质我这里下载的如下介质[root@localhostpg]#ls-lrttotal7968-rw-r--r--.1rootroot1481300......
  • sqlserver 分区函数去重复排序
     sqlserver分区函数去重复排序--获取,FlowID去重复的,按时间排序的,前一行select*from(select*,row_number()over(partitionbyFlowIDorderbyConfirmDat......
  • 使用yum安装部署postgresql13+postgis3.2
    环境:OS:Centos7PGDB:13.8postgis:3.2 1.创建相应的用户[root@localhostopt]#groupaddpostgres[root@localhostopt]#useradd-gpostgrespostgres该步骤可以不......
  • centos postgresql命令行中文显示乱码
    【1】查看当前系统语言登陆linux系统打开操作终端之后,输入echo$LANG可以查看当前使用的系统语言。[root@localhost~]#echo$LANG查看安装的语言包查看是否有中文......