如何在没有事务日志的情况下运行oracle proc?

时间:2011-08-25 15:03:03

标签: oracle

在Oracle中,当我们有一个删除大量数据的过程时,我想它会更新“事务日志”。提交时,日志将被清除。

但是如果有大量的删除操作,日志将变满。有没有办法在没有记录的情况下运行proc?

2 个答案:

答案 0 :(得分:4)

您要解决的问题是什么?我猜测你的关注点是性能,但是你说问题是"日志会变满#34;这可能表示您在此过程中遇到了一些错误。

表格中有多少数据被删除?

如果要删除表格中的所有数据,则可以改为TRUNCATE

TRUNCATE TABLE <<table name>>

是一个DDL语句,它将删除表中的所有数据。由于它是DDL并且无法回滚,因此生成的REDO和UNDO非常少(Oracle为REDO和UNDO提供了单独的工具,而SQL Server将两者放在同一个事务日志中)。

如果要从表中删除大部分数据,

可能会更有效
INSERT /*+ APPEND */ INTO staging_table( column_list )
  SELECT column_list
    FROM table_name
   WHERE <<criteria for the data to save>>

TRUNCATE TABLE table_name;

INSERT /*+ APPEND */ INTO table_name( column_list )
  SELECT column_list
    FROM staging_table

删除旧表并将登台表重命名为旧表名可能更有效,但这可能涉及重新创建一些约束和索引。

如果您经常执行归档旧数据之类的操作,则另一种可能性是将表分区为某个日期列,并定期删除最旧的分区。这也非常有效,但它确实需要分区选项,这是企业版许可证之上的额外成本选项。

答案 1 :(得分:1)

事务日志在oracle中称为重做日志。如果更改未写入重做日志,则无法恢复。某些操作(如数据加载或索引构建)可以标记为不可恢复。

日志将变满的声明是错误的。重做日志使用一个文件环。一旦最后一个被填满,它就会再次开始写第一个。如果启用了归档,则会在覆盖之前将文件复制到归档目标。可能的是,重做日志的切换必须等待归档完成(或归档目的地中没有空间)。因此,正确的解决方案是正确调整重做日志的大小。这包括重做日志组的数量。

之前使用truncate的解决方案无效,因为涉及多个表。