我有一个Oracle PL / SQL脚本。它处理大约51个寄存器,并将结果写入5个不同的表。
问题是我昨晚离开了这个过程,显然UNDO日志中有溢出。
特别是,我们对回滚此脚本不感兴趣,如果失败,我们可以再次运行它。
有没有办法优化撤消/重做日志的使用?避免写它们或最小化这些写入?
据我了解,除了使用APPEND插入(如here所述)之外,设置NOLOGGING属性输出表会有所帮助。
答案 0 :(得分:2)
您不应仅在一批中处理5100万个寄存器。例如,尝试将其拆分为几千个较小的块。如果您在每个较小的批处理之后执行COMMIT(无论如何,当您说您不打算回滚时),重做/撤消日志的使用将仅用于未提交的部分,您将避免溢出。
答案 1 :(得分:1)
这确实是一件事,或者减少了你正在做的工作量。
直接路径插入上的表UNDO总是很小,因为系统只需要记录应从段中删除某些范围的块。索引仍然需要大量撤消。在直接路径插入上进行Nologging可以最小化表REDO。
答案 2 :(得分:1)
此外,禁用约束和索引也可以加快插入速度。您可以使用nologging重建索引。
答案 3 :(得分:0)
“特别是,我们对回滚此脚本不感兴趣,如果失败,我们可以再次运行它。”
一个问题是,您是否需要,并且您是否准备好,回到之前的备份以便再次运行脚本? 也就是说,如果进程在1000万行之后失败,那么只需重新运行脚本结果就可以插入6100万行,或者会跳过/忽略1000万行,还是会更新1000万行和插入4100行。
此外,如果您执行NOLOGGING插入,则可能需要在作业后立即进行全新备份。在脚本运行期间,您在执行时间点恢复时遇到问题,因此您还需要考虑脚本运行时数据库上发生的其他活动。
根据您编写PL / SQL脚本的方式,您可能会发现使用大型SQL而不是逐行处理可以减少撤消(例如,通过最小化对已处理块的重访)。
除非你真的了解减少撤消或提交允许重用撤消的影响,否则我的第一个建议就是增加撤销表空间的大小。当然,你确实有一个缺点,即如果你已经生成了桶的撤销负载,那么失败将需要很长时间才能回滚。
答案 4 :(得分:0)
您还可以使用隐藏参数_disable_logging = true来减少重做,但要注意导致的导入将无法恢复。