用Partition Exchange(分区交换)卸载数据


我们有个应用每天操作相关的一张核心表t_ms_mdeia_task,此表是按天来做的List分区,分区键为monthday,列值类似于‘mmdd’,共有366个分区。

每天的数据量在3千万以上,应用的要求是只保存31天,之前的全部迁移到历史表中,用于查询。也就是说每天要把31天前那一天的数据迁移到hist表里面,当然hist表也是分区的。

应用侧原先通过存储过程来大批量的进行删除和insert,对于这样的操作,而且过程搞的非常复杂且影响数据库性能。

看提交的的过程:

  1. CREATE OR REPLACE PROCEDURE P_MS_MOVEMEDIATASK(  
  2.    i_time DATE  
  3. )  
  4. AS  
  5.   v_time        DATE;  
  6.   v_beginTime   DATE;  
  7.   v_monthday    VARCHAR2(4);  
  8.   v_month       VARCHAR2(2);  
  9.   v_count       NUMBER;  
  10.   v_sql         VARCHAR2(5000);  
  11.   v_ret         VARCHAR2(10);  
  12.   v_errMsg      VARCHAR2(500);  
  13.   v_total       NUMBER;  
  14. BEGIN  
  15.   v_beginTime :SYSDATE;  
  16.   --转移31天前的数据  
  17.   v_time :i_time;  
  18.   --取转移数据的monthday  
  19.   v_monthday :to_char(v_time,'mmdd');  
  20.   --取转移数据的月份,按月分转移到不同的表里时用  
  21.   v_month :to_char(v_time,'mm');  
  22.   --  
  23.   SELECT COUNT(1)  
  24.         INTO v_count  
  25.         FROM T_MS_MEDIA_TASK T  
  26.         WHERE T.MONTHDAY = v_monthday;  
  27.   v_total :v_count;  
  28.   WHILE(v_count > 0) LOOP  
  29.      --将要转移的数据RESERVE79字段置0  
  30.       UPDATE T_MS_MEDIA_TASK T  
  31.         SET T.RESERVE79 = '0'  
  32.         WHERE T.MONTHDAY = v_monthday  
  33.         AND ROWNUM <= 50000; --每次最多提交50000条  
  34.   
  35.       --将待转移数据插入历史表中  按月插入不同历史表 动态SQL  
  36.       v_sql :'insert into t_ms_media_task_his'||v_month  
  37.  ...  
  38.  ...  
  39.       EXECUTE IMMEDIATE v_sql;  
  40.   
  41.       --删除转移过的数据  
  42.       DELETE FROM T_MS_MEDIA_TASK T  
  43.         WHERE T.MONTHDAY = v_monthday  
  44.         AND T.RESERVE79 = '0';  
  45.       COMMIT;  
  46.       --获取需要转移的数据条数  
  47.       SELECT COUNT(1)  
  48.         INTO v_count  
  49.         FROM T_MS_MEDIA_TASK T  
  50.         WHERE T.MONTHDAY = v_monthday;  
  51.   END LOOP;  
  52.   EXCEPTION  
  53.    ...  
  54. END P_MS_MOVEMEDIATASK;  
  55. /  
  • 1
  • 2
  • 3
  • 下一页

相关内容

    暂无相关文章