我正从大型Oracle数据库中删除大量数据。我遵循的过程是删除记录表A,原因是表B上的CASCADE删除,其中某些表上有CASCADE删除。所以基本上有几个表用CASCADE删除相互关联。
目前,此过程在迭代中对表A中的许多记录起作用,而我只在迭代结束时进行COMMIT(当删除所有数据时)。该过程大约需要30个小时才能完成。
我被建议有常规COMMIT,即表A的每个记录删除的COMMIT(包括删除子表中任何后续记录)。
我知道常规提交会使撤消日志大小保持较低但是常规提交是否有任何性能提升?我会看到完成脚本所需的时间有所改善吗?
答案 0 :(得分:6)
不会期望频繁提交可以提高代码的性能。执行大量临时提交可能会迫使您花费更多时间等待同步操作,从而减慢代码速度。如果您在中间提交,则可能需要编写相当多的代码以确保代码完全可重新启动。
您是否拥有AWR或statspack快照或跟踪文件,以显示您实际等待的内容? 30个小时做任何事情似乎都是不合理的。这将导致我强烈怀疑您每次删除行时都会丢失一些导致级联删除执行全表扫描的索引。修复丢失的索引或进行多行删除以便不必频繁地执行全表扫描似乎更有可能提高性能,而不是担心何时提交更改。