IT分销/经销数据库

怎么解决定期删除大表的数据

db2v9.7现在库里有几张以日期命名的表,从0101 到1231日 365张表数据保留90天左右,那么超过90天的表需要删除。这样类型的表有4张,大家有什么好的方法来做这个事情!  每张表每天大概300万的数据量,以后会逐步增加我自己想到的几个方法:方法一:delete table   ...显示全部
db2v9.7
现在库里有几张以日期命名的表,从0101 到1231日 365张表
数据保留90天左右,那么超过90天的表需要删除。

这样类型的表有4张,大家有什么好的方法来做这个事情!  每张表每天大概300万的数据量,以后会逐步增加

我自己想到的几个方法:
方法一:
delete table    我担心大表delete 太慢,会影响其他事务处理
reorge table

方法2:
truncate table immediate; 但是在储存过程中调用这个的时候报错 SQL0428N
查询了一下原因 ,大概意思是说 执行这个命令前 需要 关闭游标(储存过程中就是用游标把表名选择出来的,关闭游标,那么就无法循环了)

方法3:
alter table activate not logged initially with empty table;        --把表变成 not logged ,怎么把表变回logged 呢?
reorg table table_name    ;

想征求一个比较好的方法 ,我在一个表里维护了要删除表的信息
t_delete_manage表里维护了一下信息
TNAME(不好意思,表名替换一下)                 DELETE_COL                     DELETE_PERIOD      
a                                                 BUSINESSDAY                                      90
b                                                 BUSINESSDAY                                      90
c                                                BUSINESSDAY                                      90
d                                                 BUSINESSDAY                                      90
e                                                 FILE_RECEIVED_TIME                               90
f                                              FILE_RECEIVED_TIME                               90
根据这个表里的信息,组成sql 进行 删除操作
我写了这么个储存过程
CREATE OR REPLACE  PROCEDURE  CRB_TEST
()
LANGUAGE SQL
BEGIN
    declare      sqlcode         integer default 0; --
    declare      v_notfound       integer default 0; --
    declare      v_tname          varchar(50);--
    declare      v_delete_col     varchar(30); --
    declare      v_delete_rows    integer;--
    declare      v_delete_log     varchar(100);--
    declare      v_delete_period  integer;--
    declare      sqlStr           varchar(300);--
    declare      condition1       varchar(100);--
    declare      n_is_partition  integer;--
    declare fetchSeqCursor cursor for
            select tname,delete_col,delete_period,IS_PARTITION from tsy_delete_manage order by tname;--
  
    declare  CONTINUE  handler for NOT FOUND set v_notfound = 100; --
    set  v_notfound = 0;--
    open fetchSeqCursor;--
    fetch fetchSeqCursor into v_tname, v_delete_col,v_delete_period,n_is_partition;--
    WHILE  v_notfound=0 DO
   
              set sqlStr='truncate table  '||v_tname||'_'||to_char(current_date-90 days,'mm')||to_char(current_date-90 days,'dd')||' IMMEDIATE';--
              execute immediate sqlStr ;--
              
    set  v_notfound = 0;--
    fetch fetchSeqCursor into v_tname, v_delete_col,v_delete_period,n_is_partition;--
    end WHILE;--
    close fetchSeqCursor;--
END
commit;

call crb_test
SQL0428N  只允许将该 SQL 语句作为工作单元的第一条语句。  SQLSTATE=25001
大家有什么好的方法赐教一下 ,谢谢了收起
参与26

查看其它 24 个回答nowhill的回答

nowhillnowhill系统工程师
虽然我没有采取 hmily1688 的方法,但是 这个方法应该是可行的
IT分销/经销 · 2012-03-02
浏览1153

回答者

nowhill
系统工程师

nowhill 最近回答过的问题

回答状态

  • 发布时间:2012-03-02
  • 关注会员:1 人
  • 回答浏览:1153
  • X社区推广