免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1419 | 回复: 3
打印 上一主题 下一主题

在线苦求 大量删除数据的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-16 18:26 |只看该作者 |倒序浏览
有a,b,c三个表,
要求把a表中满足如下条件的数据删除
1。在a,b,c表中同时存在(三表的主键都是产品番号)
2. b表中这些记录的更新年月日要大于20010101
3.c表中的登录年月日和a表中登录年月日相等

小弟,代码如下
        DELETE FROM atbl a
          WHERE EXISTS
          (SELECT 'X'
             FROM btbl b ,ctbl c
             WHERE a.cp_no = b.cp_no and
                   b.gx_ymd>;=20010101 and
                   a.cp_no = c.cp_no and
                   a.dl_ymd=c.dl_ymd);   
可是,当a表中有上万条记录时,程序爆慢。各位大虾,原因何在?

小弟,改了一下代码
        DELETE FROM atbl
          WHERE EXISTS
          (SELECT 'X'
             FROM atbl a,btbl b ,ctbl c
             WHERE a.cp_no = b.cp_no and
                   b.gx_ymd>;=20010101 and
                   a.cp_no = c.cp_no and
                   a.dl_ymd=c.dl_ymd);   
速度是快了,但是把不该删除的数据又删除了。
我哭呀!!!
好心的大虾们,救救我吧!

论坛徽章:
0
2 [报告]
发表于 2004-05-16 20:01 |只看该作者

在线苦求 大量删除数据的方法

建索引:
  
  create index aa on b(cp_no,gx_ymd);
   create index cc  on c(cp_no,dl_ymd);

如果a表极端巨大,delete会大量写回滚段,就存在硬盘读写的瓶颈。
可用以下等效的程序来删除记录:

sql>;declare
         cursor c1 is select cp_no ,dl_ymd from atbl;
         v_cp_no  number;
         v_dl_ymd char(;
         v_dummy char;
         i number:=0;    -- 记数器,便于观察过程的执行进度。
                      --  看着记数器在飞快上跳,等起来就有信心了
     begin
     open c1;
     loop
     fetch c1 into v_cp_no;v_dl_ymd
     exit when c1%notfound;
     i:=i+1;
     dbms_output.put_line('以处理了'||to_char(i)||'条记录');
       begin
       select 'X' into v_dummy
       from btbl b ,ctbl c
       where b.cp_no =v_cp_no
        and  c.cp_no =v_cp_no
        and  b.gx_ymd>;=20010101
        and  c.dl_ymd=v_dl_ymd;
       -- 如果不存在,即不满足条件,就跳到exception后,跳过执行delete,再一次循环。
       delete atbl where current of c1;
       commit; --  及时提交,不占回滚段资源
       exception when no_data_found
       then null;
       end;
     end loop;
     close c1;
  end;
/

论坛徽章:
0
3 [报告]
发表于 2004-05-16 20:18 |只看该作者

在线苦求 大量删除数据的方法

补充罗嗦几句:
要dbms_output.put_line('aaa');显示在屏幕上
事先可别忘了要
   
sql>;set severoutput on
sql>;execute dbms_output.enable;
  

论坛徽章:
0
4 [报告]
发表于 2004-05-16 20:25 |只看该作者

在线苦求 大量删除数据的方法

好,谢谢兄台!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP