目录
一、需求分析
如标题所示,现在需要建一张临时表来存储每日增量的流水数据。存储周期为近两年,其中日增量约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
;