金蝶BOS里系统表 t_bas_message 表用于存放系统消息.实际操作中,客户端默认15分钟查询一次是否有新消息 用户基本不会去删除已读的消息,这就导致这张表大得惊人,系统运行一年多以来,大约有 4500万条数据.再加上这张表上存在索引,对数据库而言,一旦操作失误导致表中索引失效,数据库会因为全表扫描太多彻底卡死. 之后考滤删除一个月以前的数据执行SQL语句如下 DELETE FROM t_bas_message t WHERE t.fsendtime > Sysdate-30; 这段代码在测试库运行了两个多小时.一方面是数据量很大,另一方面是因为表中有几列索引.实际中这种方案肯定不行. 跟DBA讨论了一下,有两种方案. A 通过表分区操作. 通过表进行分区,然后直接删除无关分区.代码如下 -- 创建中间表,添加主键,索引,分区等信息 create table T_BAS_MESSAGE_bak ( fid VARCHAR2(44) not null ) partition by range (fsendtime) ( partition PART_20141201 values less than (TIMESTAMP' 2014-12-01 00:00:00'), partition PART_MAX values less than (MAXVALUE) ); -