首页 > 代码库 > Oracle 根据条件大量删除数据
Oracle 根据条件大量删除数据
金蝶BOS里系统表 t_bas_message 表用于存放系统消息.实际操作中,客户端默认15分钟查询一次是否有新消息
用户基本不会去删除已读的消息,这就导致这张表大得惊人,系统运行一年多以来,大约有 450万条数据.再加上这张表上存在索引,对数据库而言,一旦操作失误导致表中索引失效,数据库会因为全表扫描太多彻底卡死.
之后考滤删除一个月以前的数据执行SQL语句如下
DELETE FROM t_bas_message t WHERE t.fsendtime > Sysdate-30;
这段代码在测试库运行了两个多小时.一方面是数据量很大,另一方面是因为表中有几列索引.实际中这种方案肯定不行.
跟DBA讨论了一下,有两种方案.
A 通过表分区操作.通过表进行分区,然后直接删除无关分区.
B 把有用的数据转移到一张表,然后Drop 掉原表.重新创建原表后导入数据.
B方案代码如下
CREATE TABLE t_bas_message_bak AS SELECT * FROM t_bas_message t WHERE t.fsendtime> Sysdate-30; DROP TABLE t_bas_message; CREATE TABLE t_bas_message AS SELECT * FROM t_bas_message_bak; create index IX_MESSAGE_TEXT on T_BAS_MESSAGE (FRECEIVER, FORGID); create index IX_MSG_RECEIVER on T_BAS_MESSAGE (FRECEIVER); create index IX_MSG_SOURCE on T_BAS_MESSAGE (FSOURCEID); alter table T_BAS_MESSAGE add constraint PK_BAS_BMCMESSAGE primary key (FID); DROP TABLE t_bas_message_bak;
PS:这里的三个索引,是原表就有的,所以加上.但实际上我认为,第一个组合索引在Oracle 中完全取代了第二个索引,应该去掉的.
Oracle 根据条件大量删除数据
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。