【问题标题】:How many records can contain a GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS?COMMIT PRESERVE ROWS 上可以包含多少条记录?
【发布时间】:2010-09-03 08:29:35
【问题描述】:

我想运行一个涉及 80,000,000 条记录的 PL/SQL 过程。

这个 PL/SQL 过程删除了大约 80,000,000 条记录,并将它们备份到使用 ON COMMIT PRESERVE ROWS 子句创建的 GLOBAL TEMPORARY TABLE 中。

我如何知道有多少条记录可以包含此 GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS?

这些表的大小限制是多少,COMMIT 只在 PL/SQL 过程的末尾?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    有两个因素会限制您可以插入的行数:临时空间和撤消空间。

    您可以在临时表中放置与临时表空间中的空间一样多的数据。如果允许临时表空间增长(使用自动扩展数据文件和表空间),您将只受到磁盘空间的限制。现在您想估计行的大小并为开销留出一些额外空间。这将使您粗略估计临时表空间所需的大小。

    单个事务需要完全适合撤消表空间。插入的撤消数据比其他 DML 小,仍然 80M 行会产生很多撤消。如果您还从其他表中删除这些行,则撤消将占用与原始行大致相同的空间。您可能正在使用自动撤消管理,只需将表空间及其数据文件设置为自动扩展即可。

    如果这是一次性的,您可能希望在完成后减小临时表空间和撤消表空间的大小。如果您要定期执行此操作,只需让表空间增长,然后将它们留在那里。


    80M 行事务的唯一真正问题是如果出现问题,您可能会遇到很长的回滚时间。特别是删除的行会使您的回滚比实际删除的时间长很多。

    虽然 Oracle 和大型事务从根本上没有问题(Oracle 扩展),但将总工作划分为较小的工作单元将使您能够更快地重新启动流程并在较小的子集上失败时的数据。

    【讨论】:

      【解决方案2】:

      如果唯一的提交是在过程的末尾,那么on commit 子句有点无关紧要,除非这个过程只是更大过程的一部分。当您的会话结束时,无论on commit 设置如何,GTT 数据都将消失,因此您的“备份”数据仅在执行该过程的会话中可用。从给定的上下文中,不清楚您是否意识到您的“备份”是临时的。

      on commit preserve rows 子句的作用是允许您在会话期间提交非 GTT 数据,而不会丢失 GTT 中的内容。假设您想分块删除数据,可能一次删除一百万行。所以你确定你的百万行,将它们复制到 GTT,从原始表中删除它们,然后提交。如果您的on commit 设置为delete rows,那么此时您的 GTT 再次为空,因此您没有备份。但是,如果您的 on commitpreserve rows,那么您的 GTT 会保留您插入的百万行。

      重复 80 次...最后以 delete rows 结尾,GTT 是空的,一次保存的行数从未超过一百万行;使用preserve rows,它每次都会增长,并且将拥有全部 8000 万条记录。但仍然只有在会话结束之前。

      使用preserve rows,如果您在任何时候遇到问题,都可以将“备份”GTT 中的所有数据重新插入到原始表中。使用delete rows,您只能重新插入自上次提交以来已删除的所有内容 - 但您也可以在那时回滚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2013-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 2014-09-20
        相关资源
        最近更新 更多