sql归档
insert into 归档表 select * from待归档表,
这种归档方式速度极快,原因有五
1.无网络往返,数据在服务端直接从源表读取写入目标表,不需要将数据传回客户端,避免网络io,
2.最小化日志,在某些数据库中可以使用批量日志模式,比逐行insert产生的redo/undo日志少的多,
3.无解析优化开销,解析和执行计划只做一次,而逐行insert都要解析,
4.批量io,数据库引擎以大块单位读写,属于顺序io,远快于随机io,
5.无索引维护逐行代价,目标表的索引更新可以批量合并,而非逐行维护
手动分区归档
1.主要步骤
创建分区表,一般按照时间范围,
create table order(
id integer,
order_time timestamp,
...
)partition by range (order_time)
创建月度分区
create table order_2026_01 partition of order for values from(2026-01-01)to (2026-02-01)
需要定期创建分区表
归档旧分区
方式一,betach分区后导出归档
alter table order betach partition order_2026_01;
导出为文件存入冷库存
copy order_2026_01 to "/archive/order_2026_01.csv"
删除已归档分区
delete table order_2026_01,
方式二
betach后保留为普通表(仍在线但不算分区)
alter table order betach partition order_2026_01
4.临时挂载回查
alter table order attach partition order_2026_01 for values from (2026-01-01)to (2026-02-01)
优势:
1.归档快,秒级完成,整个分区操作,
2.无锁表
3.主库可控,旧分区可直接drop
4.回查方便
5.分区裁剪自动跳过不相关分区