WHERE条件用不到索引的情况下如何删除大表记录?

如果开发人员在做表设计阶段没有考虑到大表历史数据的维护性,随着数据量越来越大,表就越来越难管理和维护.连创建索引的失败都可能会失败(因为创建索引要利用临时表空间的的排序,当临时表空间不够大创建索引的动作就会报错).如果过滤条件用不到索引,每成功完成一次delete操作就需要全表扫描一次...那么几十GB的大表,情何以堪...?

那么有什么方法可以解决这种问题吗?当然改造生产表是可以的(利用DBMS_REDEFINITION在线重定义的方法可以很好的控制阻塞时间)再者可以利用游标获取结果集每行的ROWID,然后用ROWID去匹配记录,游标是处理一行之后读取下一条再处理,直至所有记录处理完为止。这种方式能够利用ROWID快速找到记录的物理位置,因为ROWID能够标识每条记录的物理位置(文件号,块号,行号)。

例如,要删除tabA表2014-01-01 至2014-06-01之间的数据

简要的思路可以参考如下代码:

<span style="font-size:14px;">declare
  cursor c1 is
    select rowid from tabA where col > '2014-01-01' and col < '2014-06-01';
  v_rowid varchar2(18);
begin
  v_num := 0;
  open c1;
  fetch c1 into v_rowid;
  while c1%found loop
    v_num := v_num +1;
    execute immediate 'delete from tabA where rowid= :1' using v_rowid;
    IF (mod(v_num, 100000) = 0) THEN
      COMMIT;
    END IF;
    fetch c1 into v_rowid;
  end loop;
  close c1;
end;</span>

以上代码:先声明游标,将满足条件的条目ROWID保存于游标,打开游标,从游标逐条抽取进行删除,直至全部删除为止,每10万行提交一次,最后关闭游标。

道行尚浅,欢迎拍砖。

时间: 2024-08-25 07:38:30

WHERE条件用不到索引的情况下如何删除大表记录?的相关文章

在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VARCHAR2(2) DEFAULT 'XXX';”操作时,效率及安全性是必须要考虑的因素.若直接执行,则会在该过程中给表加上6级表锁,也就是连查询都需要等待,这在生产库上是相当危险的操作.因为Oracle在执行上述操作过程中,不仅要更新数据字典,还会刷新全部的记录,并且会使得Undo表空间暴涨,所以

如何在设备驱动冲突导致蓝屏的情况下强制删除该设备驱动

小梅哥编写,未经允许,不得用于任何商业用途. 插上设备,在设备管理器中选择要卸载的设备驱动,卸载其驱动,大家都会,但是万一设备一插上电脑就蓝屏,连设备管理器打开的机会都不给你咋办呢?这里找到了解决办法.该办法还可以帮忙清理一大堆无用的驱动哦. 这两天,玩儿了下CrazyBingo的那个USB Camera.他那个Camera是用USB2.0芯片CY7C68013做的,该芯片默认驱动不支持win764位.需要关闭windows强制签名.我就关了这个驱动签名,关闭之后成功的安装了驱动并捕获到了图像.

(hdu step 6.1.6)Jungle Roads(在索引为字符索引的情况下,求让n个点连通的最小费用)

题目: Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 126 Accepted Submission(s): 118   Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of

链表:在不给出整个链表头结点的情况下,删除单链表中的某个节点

问题描述: 有一个包含int型节点值的单链表,给定一个链表中的节点node,但不给定整个链表的头结点,删除链表中的某个结点. 算法实现: class Node { public int value; public Node next; public Node(int value) { this.value = value; } } public void removeWiredNode(Node node) { if(node == null) { return; } Node next = n

在忘记APPLE ID密码的情况下如何删除icloud账号?

忘了密码的用这方法就可以啦 1.现在我说你做 . 先进入 iCloud 点击 某某账户(要删的账户) 2.第二栏密码那里删除原来的再输入ios(任意密码) 3.然后点完成 之后会出现错误.请点 好.然后左上角.取消再进. 5.第三栏的描述那里,如果一开始有iCloud几个字,就全部删除:如果一开始没有这几个字,就先输入iCloud,完成 再删除 6.请拉到最下面..已经关闭,是? 直接删除账户

错误ORA-01110,在已删除数据文件情况下如何删除表空间

如果先行删除了数据文件,再删除表空间,drop tablespace 会出现如下错误: ORA-01116: error in opening database file 89 ORA-01110: data file 89: '/templv/osm/OSM_TABP_00.dbf' ORA-27041: unable to open file Linux Error: 2: No such file or directory Additional information: 3 解决方案: 首

MySQL索引的查看创建和删除

1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有3个未索引的表t1.t2.t3,分别只包含列c1.c2.c3,每个表分别含有1000行数据组成,指为1-1000的数值,查找对应值相等行的查询如下所示. SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3 此查询结果应该为1000行,每行包含3个相

SYSAUX表空间占用过大情况下的处理(AWR信息过多)

真题1.  SYSTEM和SYSAUX表空间存储的内容有哪些区别?若SYSAUX表空间占用过大则应该如何处理? 答案:在一般情况下,企业产生的业务数据应该存放在单独的数据表空间,而不应该使用系统已存在的表空间,尤其不能将业务数据保存到SYSTEM和SYSAUX表空间中,所以,DBA需要着重关注SYSTEM和SYSAUX表空间的占用情况. Oracle服务器使用SYSTEM表空间管理整个数据库.这个表空间包含系统的数据字典和关于数据库的管理信息,这些信息均包含在SYS方案中,只有SYS用户或者拥有

mysql什么情况下会触发表锁

锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著