科研院所db2 9.7

DB2 如何快速删除表中的部分数据 每次大约100万行

如题,主要是数据量较大,决定每天将数据从一张表中,转存到另一张表中,每次转存大约100万行,做法是将原来表中的部分数据load到新表中,然后将原来表中的那些数据删除掉,有什么比较快的删除数据的方法,不需要记日志。
参与17

16同行回答

zhendazhenda数据库管理员昆仑银行
回复 15# 共同进步    生产环境添加copy yes会做表空间级别备份,会中断业务。本案例中个人觉得可以做cursor + load方法,此方法直接通过内存传输数据减少了2次磁盘IO(读+写),直接读入内存,表数据传输,写入磁盘。100万条数据不是很大,确认100万条的数据量,这样能评估日志...显示全部
回复 15# 共同进步


   生产环境添加copy yes会做表空间级别备份,会中断业务。
本案例中个人觉得可以做cursor + load方法,此方法直接通过内存传输数据减少了2次磁盘IO(读+写),直接读入内存,表数据传输,写入磁盘。
100万条数据不是很大,确认100万条的数据量,这样能评估日志量,传输中减少并发,避免长事务和并发的日志填充。这样日志不会满,这样既保证不停服务,也能通过最小的修改,增加传输速度。


不记录日志可以用nonrecoverable

db2 "declare c_test cursor for select * from old table(delete from tabname where ......)"
db2 "load from c_test of cursor insert into tabname1 nonrecoverable"


之后做好在线备份。收起
软件开发 · 2014-06-09
浏览2114
ABCABC数据库运维工程师ABC
A表到B表可以使用load from cusor;清除B表的话你是V9.7可以用truncateydliujiang 发表于 2014-5-29 10:23 支持这种方法!显示全部
A表到B表可以使用load from cusor;清除B表的话你是V9.7可以用truncate
ydliujiang 发表于 2014-5-29 10:23


支持这种方法!收起
保险 · 2014-06-09
浏览2087
共同进步共同进步数据库架构师中国金融电子化公司
并不是所有的情况都可以轻易地改成分区表,另外,不记日志的方式又需要提前做好DB备份,建议按照如下方式db2 "declare c_test cursor for select * from old table(delete from tabname where ......)"db2 "load from c_test of cursor insert into tabname1 copy yes to ..."...显示全部
并不是所有的情况都可以轻易地改成分区表,另外,不记日志的方式又需要提前做好DB备份,建议按照如下方式
db2 "declare c_test cursor for select * from old table(delete from tabname where ......)"
db2 "load from c_test of cursor insert into tabname1 copy yes to ..."
这可以减少一次对源表的查询,同时又可以使load数据不落地收起
软件开发 · 2014-06-05
浏览2432
改造成分区表好了。如果编写高效的sql是为了解决糟糕的数据结构所引起的问题,不如直接优化数据结构来的痛快。显示全部
改造成分区表好了。如果编写高效的sql是为了解决糟糕的数据结构所引起的问题,不如直接优化数据结构来的痛快。收起
证券 · 2014-06-03
浏览2059
tramstrams数据库管理员交通银行信用卡中心
回复 3# 张东焕    如果使用表分区对于表查询量比较大时detach会出现锁超时的情况有什么好建议不?另外,有什么办法可以避免异步索引清理或者加速异步索引的清理过程吗?显示全部
回复 3# 张东焕


   如果使用表分区对于表查询量比较大时detach会出现锁超时的情况有什么好建议不?另外,有什么办法可以避免异步索引清理或者加速异步索引的清理过程吗?收起
银行 · 2014-06-02
浏览2015
sunchaosailorsunchaosailor软件开发工程师SIA
回复 10# wolfop    可是我不关闭log的话,直接删除,使用循环日志,还是会报事务日志已满,无法删除。请问,还有别的好的方案吗?显示全部
回复 10# wolfop


   可是我不关闭log的话,直接删除,使用循环日志,还是会报事务日志已满,无法删除。请问,还有别的好的方案吗?收起
科研院所 · 2014-05-29
浏览2025
sunchaosailorsunchaosailor软件开发工程师SIA
回复 9# wjf870128   谢谢啊,这个问题解决了。写了一个动态SQL,然后用execute IMMEDIATE,可以执行DDL,谢谢你啊!显示全部
回复 9# wjf870128


  谢谢啊,这个问题解决了。写了一个动态SQL,然后用execute IMMEDIATE,可以执行DDL,谢谢你啊!收起
科研院所 · 2014-05-29
浏览2209
wolfopwolfop其它Why should I tell you?
DB2删数据性能还好了,够胆就关logging,不过小心哦,中间中断或者出别的问题,整个表数据不可用显示全部
DB2删数据性能还好了,够胆就关logging,不过小心哦,中间中断或者出别的问题,整个表数据不可用收起
IT其它 · 2014-05-29
浏览2213
wjf870128wjf870128数据库管理员普惠金融
回复 8# sunchaosailor     试一下SYSPROC.ADMIN_CMD 调用alter语句,我之前都是在脚本中db2 +c 保证在一个事务中执行的。不知道存储过程中没有start atomic是不是能保证事务。你的auto-commit打开了吗?...显示全部
回复 8# sunchaosailor


    试一下SYSPROC.ADMIN_CMD 调用alter语句,我之前都是在脚本中db2 +c 保证在一个事务中执行的。不知道存储过程中没有start atomic是不是能保证事务。你的auto-commit打开了吗?收起
互联网服务 · 2014-05-29
浏览2248
sunchaosailorsunchaosailor软件开发工程师SIA
各位,我的转存存储过程如下, CALL SYSPROC.ADMIN_CMD ('LOAD FROM (DATABASE DATA11_2 SELECT * FROM db2admin.TD_PLANTMODEL_TESTS where result_on < ''2014-3-29 7:00:00'') OF       CURSOR INSERT INTO db2admin.TD_PLANTMODEL_TESTS_L1 NONRECOV...显示全部
各位,我的转存存储过程如下,
 CALL SYSPROC.ADMIN_CMD ('LOAD FROM (DATABASE DATA11_2 SELECT * FROM db2admin.TD_PLANTMODEL_TESTS where result_on < ''2014-3-29 7:00:00'') OF
      CURSOR INSERT INTO db2admin.TD_PLANTMODEL_TESTS_L1 NONRECOVERABLE');
   commit;
  alter table db2admin.TD_PLANTMODEL_TESTS activate not logged initially;
    delete from db2admin.TD_PLANTMODEL_TESTS where result_on < '2014-3-29 7:00:00';
   commit;
结果编译不通过,
SQL0104N  An unexpected token "alter" was found following "
".  Expected tokens may include:  "TRUNCATE".


这是什么问题啊?转存程序有问题吗?我是菜鸟,恳请大家帮忙!收起
科研院所 · 2014-05-29
浏览2212

提问者

相关问题

问题状态

  • 发布时间:2014-05-29
  • 关注会员:1 人
  • 问题浏览:12150
  • 最近回答:2014-06-09
  • X社区推广