当一张表数据过大时,可以进行垂直拆分(每张表存储部分字段)和水平拆分(每张表字段完整,数据只存储一部分)
这里记录的是水平拆分
首先对数据进行备份
create table 备份表名 as (select * from 原表名);
获取原表建表语句,例:
CREATE TABLE 原表名 (
uuid varchar(32) NOT NULL, -- uuid
device_id varchar NULL, -- 设备id
device_name varchar NULL, -- 设备名称
cjdbh varchar(64) NULL, -- 采集点编号
sjrq date NULL, -- 数据日期 YYYY-MM-DD
create_time timestamp(0) NULL DEFAULT now(), -- 创建时间
CONSTRAINT pk_mdn_glysyc_result PRIMARY KEY (uuid)
);
备份完成后对原表进行删除(注意,此数据是冷数据,不在使用中,如果生产环境,请先将数据指向备份表中,原表数据完全断开,避免数据丢失)
drop table 原表名;
重新建分区表,注意(分区字段一定要添加为主键)[PARTITION BY LIST (根据哪个字段进行分区)]
CREATE TABLE 原表名(
uuid varchar(32) NOT NULL, -- uuid
device_id varchar NULL, -- 设备id
device_name varchar NULL, -- 设备名称
cjdbh varchar(64) NULL, -- 采集点编号
sjrq date NULL, -- 数据日期 YYYY-MM-DD
create_time timestamp(0) NULL DEFAULT now(), -- 创建时间
CONSTRAINT pk_mdn_glysyc_result PRIMARY KEY (uuid,sjrq)
)PARTITION BY LIST (sjrq);
恢复数据(恢复数据时一定要将对应的分区表建好)
查询需要创建哪些分区
select distinct(分区字段) from 备份表名;
例:
创建分区
create table fx_glysyc_result_20220728 partition of mdn_glysyc_result for values in('20220728');
create table fx_glysyc_result_20230201 partition of mdn_glysyc_result for values in('20230201');
恢复数据
insert into mdn_glysyc_result select * from mdn_glysyc_result_20230518_bak;
以上整个创建分区并恢复数据的过程就完成了,如果在实际使用中,可以一次创建多个分区以免插入数据无对应分区而报错
以下为在存储过程中使用
-- (1)删除分区
V_SQL := ' DROP TABLE IF EXISTS fx_data_quality_day_'||in_data_date ||'';
EXECUTE V_SQL;
-- (2)新建分区
V_SQL := 'create table fx_data_quality_day_'||in_data_date ||' partition of mdn_data_quality_day for values in('''
||in_data_date||''')';
EXECUTE V_SQL;
-- (3)设置 unlogged
V_SQL := 'alter table fx_data_quality_day_'||in_data_date ||' set unlogged';
EXECUTE V_SQL;