在Oracle中删除大型记录集的最佳方法
我管理着一个应用程序,该应用程序具有非常大的Oracle数据库后端(一个表中的数据接近1TB,行数超过5亿)。数据库实际上并没有做任何事情(没有SProcs,没有触发器或任何东西),它只是一个数据存储。 每个月我们都需要从两个主表中清除记录。清除的标准各不相同,并且是行龄和几个状态字段的组合。通常,我们最终每月清除10到5000万行(我们每周通过导入增加大约3-5百万行)。 当前,我们必须批量删除约50,000行(即删除50000,提交,删除50000,提交,重复)。尝试一次全部删除整个批处理会使数据库在大约一个小时内无响应(取决于行数)。像这样批量删除行在系统上非常困难,我们通常必须在一周的时间内“在时间允许的情况下”进行删除。允许脚本连续运行可能会导致用户无法接受的性能下降。 我相信这种批量删除还会降低索引性能,并产生其他影响,最终导致数据库性能下降。一张表上有34个索引,索引数据的大小实际上大于数据本身。 这是我们的一位IT人员用来清除此错误的脚本: BEGIN LOOP delete FROM tbl_raw where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000; exit when SQL%rowcount < 49999; commit; END LOOP; commit; END; 该数据库必须达到99.99999%,并且我们每年只有一次2天维护窗口。 我正在寻找一种删除这些记录的更好的方法,但是我还没有找到任何记录。有什么建议么?