【问题标题】:How to run a oracle proc without a transaction log?如何在没有事务日志的情况下运行 oracle proc?
【发布时间】:2011-08-26 01:09:17
【问题描述】:

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

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

【问题讨论】:

  • 是删除表中的所有数据,还是删除特定数据集?它是影响单个表还是多个表?如果表很多,表之间是否存在依赖关系?
  • Yes..它从多个相互依赖的表中选择数据,并删除符合删除条件的数据

标签: oracle


【解决方案1】:

您要解决的问题是什么?我猜您关心的是性能,但您说问题是“日志将变满”,这可能表明您在此过程中遇到了一些错误。

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

如果您要删除表中的所有数据,您可以改为使用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

删除旧表并将临时表重命名为旧表名可能更有效,但这可能涉及重新创建许多约束和索引。

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

【讨论】:

    【解决方案2】:

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

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

    之前使用 truncate 的解决方案将不起作用,因为涉及到多个表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2014-03-04
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多