Greeplum以每日一个区间,批量创建多个分区

目录

一、需求分析

二、实施流程

        2.1、创建以日期分区的临时表

        2.2、循环创建每日的分区

        2.3、单语句新增分区

        2.4、删除特定分区

三、其他


一、需求分析

        如标题所示,现在需要建一张临时表来存储每日增量的流水数据。存储周期为近两年,其中日增量约1000W ~ 1200W,一年约40亿数据,两年90亿左右。经过讨论,决定用日分区的方式来建流水分区表。

        则,分区表维持在近两年内即可,每日先增后删。取n-2天数据

二、实施流程

        2.1、创建以日期分区的临时表
CREATE TABLE my_partitioned_table
(
    id INT,
    data_dt date
)
PARTITION BY RANGE (id)
;
        2.2、循环创建每日的分区

其中inclusive代表包括,exclusive代表不包括。所以下一条语句衔接的时候一定要注意,如漏掉那么在插入当天数据的时候会提示分区找不到等错误。

-- do语句嵌套循环解决批量创建分区的问题
DO $$
DECLARE
    partition_date DATE := '2021-07-01';  -- 起始日期
    end_date DATE := '2025-01-01';  -- 结束日期
BEGIN
    WHILE partition_date <= end_date LOOP
        partition_name := to_char(partition_date, 'YYYYMMDD');  -- 格式化日期为字符串,例如20230101
        
        EXECUTE 'alter table my_partitioned_table add partition p_' || partition_name || start (date'''to_char(current_date)''')

        partition_date := partition_date + interval '1 day';  -- 增加一天
    END LOOP;
END;
$$;
        2.3、单语句新增分区
alter table aa add partition p_20210701 start ('20210701') inclusive end ('20210702') exclusive
        2.4、删除特定分区
-- 两种方式
-- 1、单个分区删除
-- 2、批量分区删除


-- 删除一个特定分区
ALTER TABLE my_partitioned_table DROP PARTITION partition_name;

-- 删除多个特定分区
ALTER TABLE my_partitioned_table DROP PARTITION partition_name1, partition_name2;

三、其他

        新建分区后,可以单独访问分区表里某一天分区数据。默认的分区名称是schema.xxx_xxx_xxx_1_part_partition_name。(其中xxx_xxx_xxx为表名)

-- 如果分区名称partition_name为20220101
-- 那么查询出来的数据是2022-01-01那一天的数据

select *
from schema.xxx_xxx_xxx_1_part_partition_name
;

你可能感兴趣的:(postgresql,postgresql,数据库)