用Partition Exchange(分区交换)卸载数据
用Partition Exchange(分区交换)卸载数据
我们有个应用每天操作相关的一张核心表t_ms_mdeia_task,此表是按天来做的List分区,分区键为monthday,列值类似于‘mmdd’,共有366个分区。
每天的数据量在3千万以上,应用的要求是只保存31天,之前的全部迁移到历史表中,用于查询。也就是说每天要把31天前那一天的数据迁移到hist表里面,当然hist表也是分区的。
应用侧原先通过存储过程来大批量的进行删除和insert,对于这样的操作,而且过程搞的非常复杂且影响数据库性能。
看提交的的过程:
- CREATE OR REPLACE PROCEDURE P_MS_MOVEMEDIATASK(
- i_time DATE
- )
- AS
- v_time DATE;
- v_beginTime DATE;
- v_monthday VARCHAR2(4);
- v_month VARCHAR2(2);
- v_count NUMBER;
- v_sql VARCHAR2(5000);
- v_ret VARCHAR2(10);
- v_errMsg VARCHAR2(500);
- v_total NUMBER;
- BEGIN
- v_beginTime := SYSDATE;
- --转移31天前的数据
- v_time := i_time;
- --取转移数据的monthday
- v_monthday := to_char(v_time,'mmdd');
- --取转移数据的月份,按月分转移到不同的表里时用
- v_month := to_char(v_time,'mm');
- --
- SELECT COUNT(1)
- INTO v_count
- FROM T_MS_MEDIA_TASK T
- WHERE T.MONTHDAY = v_monthday;
- v_total := v_count;
- WHILE(v_count > 0) LOOP
- --将要转移的数据RESERVE79字段置0
- UPDATE T_MS_MEDIA_TASK T
- SET T.RESERVE79 = '0'
- WHERE T.MONTHDAY = v_monthday
- AND ROWNUM <= 50000; --每次最多提交50000条
- --将待转移数据插入历史表中 按月插入不同历史表 动态SQL
- v_sql := 'insert into t_ms_media_task_his'||v_month
- ...
- ...
- EXECUTE IMMEDIATE v_sql;
- --删除转移过的数据
- DELETE FROM T_MS_MEDIA_TASK T
- WHERE T.MONTHDAY = v_monthday
- AND T.RESERVE79 = '0';
- COMMIT;
- --获取需要转移的数据条数
- SELECT COUNT(1)
- INTO v_count
- FROM T_MS_MEDIA_TASK T
- WHERE T.MONTHDAY = v_monthday;
- END LOOP;
- EXCEPTION
- ...
- END P_MS_MOVEMEDIATASK;
- /
|
评论暂时关闭