三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

oracle 大表(1亿以上)迁移笔记一

oracle 大表(1亿以上)迁移笔记一

作者:蓝鸟 1974

CSDN:https://blog.csdn.net/weixin_42767242

关键字

大表迁移、存储过程批量归档、定时 JOB、索引维护、统计信息收集、NOLOGGING、BULK COLLECT、FORALL

一、场景概述

在医院 HIS/EMR 系统中,业务流水表、病历明细表数据增长极快,单表数据量轻松突破1 亿条。若不及时归档清理,会引发查询变慢、索引膨胀、数据库 IO 压力高、业务响应卡顿等问题。

本文记录 Oracle 超亿级大表在线归档迁移至历史表的落地实操方案:采用存储过程批量分批迁移 + 定时 JOB 调度,同时配套索引管理、统计信息收集、性能优化、日志管控全套落地规范,适合生产直接复用。

二、整体设计思路

  1. 数据留存策略:只保留近 90 天业务热数据,超期数据迁移至历史备份表,原表只留增量常用数据。
  1. 分批处理机制:采用BULK COLLECT + FORALL批量读取、批量插入、批量删除,避免单行循环性能瓶颈。
  1. 批次可控:设置单次最大处理条数、每批提交行数,防止一次性加载数据导致 undo、日志暴涨。
  1. 低峰调度:业务低峰凌晨 1-6 点定时 JOB 执行,避开白天业务高峰期锁竞争与资源争抢。
  1. 性能加速:迁移期间临时开启NOLOGGING减少重做日志生成,迁移完毕恢复LOGGING保障数据安全。
  1. 配套运维:迁移完成后维护索引、及时收集表统计信息,保证执行计划不走偏。

三、核心存储过程实现

3.1 过程设计要点

  1. 定义全局控制参数:单次最大处理量、每批批量提交大小;
  1. 通过关联业务主表筛选超期归档数据,住院 + 门诊数据合并筛选;
  1. 游标批量抓取主键 RID,避免全表扫描多次逻辑读;
  1. FORALL 批量插入历史表、批量删除原表数据,分批 COMMIT;
  1. 异常捕获自动回滚、关闭游标、抛出异常便于 JOB 监控告警;
  1. 迁移前后自动切换表日志模式,兼顾速度与数据安全。

3.2 完整存储过程代码

sql
CREATE OR REPLACE PROCEDURE PRO_EMR_BL_DLNR_TOLS AS
    V_DATE          DATE;
    -- 全局控制参数:单次任务最大处理条数
    V_ONCE_MAX     PLS_INTEGER := 1000000;
    -- 每批批量处理提交条数
    V_BATCH_SIZE   CONSTANT PLS_INTEGER := 1000;
BEGIN
    -- 设定保留近90天热数据
    

← 返回列表