有多少条记录可以包含GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS?

时间:2010-09-03 08:29:36

标签: oracle plsql

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

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

我怎么知道有多少记录可以包含这个GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS?

这些表的大小限制是什么,仅在PL / SQL过程结束时使用COMMIT?

2 个答案:

答案 0 :(得分:7)

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

由于临时表空间中有空间,您可以在临时表中放入尽可能多的数据。如果允许临时表空间增长(使用自动扩展数据文件和表空间),则只会受磁盘空间的限制。现在,您要估计行的大小,并为开销留出一些额外空间。这将为您提供临时表空间所需大小的粗略估计。

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

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


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

虽然Oracle和大型事务没有任何根本性的错误(Oracle 扩展),但将总工作量划分为更小的工作单元将允许您更快地重新启动流程并在较小的子集上失败时的数据。

答案 1 :(得分:5)

如果唯一的提交是在过程结束时,则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,您只能重新插入自上次提交以来已删除的内容 - 但是您可能只是在此时回滚。