我想运行涉及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?
有两个因素会限制您可以插入的行数:临时空间和撤消空间.
您可以在临时表中放置尽可能多的数据,因为临时表空间中有空间.如果允许临时表空间增长(使用自动扩展数据文件和表空间),则只会受磁盘空间的限制.现在,您要估计行的大小,并为开销留出一些额外空间.这将为您提供临时表空间所需大小的粗略估计.
单个事务需要完全适合撤消表空间.对于插入的撤消数据小于其他DML,仍然80M行将产生很多撤消.如果您还要从其他表中删除这些行,则撤消将占用与原始行大致相同的空间.您可能正在使用自动撤消管理,只需将表空间及其数据文件设置为自动扩展,您就可以了.
如果这是一次性的,您可能希望在完成后减小临时表和撤消表空间的大小.如果您要定期执行此操作,请让表空间增长,然后将其保留在那里.
80M行事务唯一真正的问题是,如果出现问题,您可能会遇到looooooong回滚时间.特别是删除的行将使您的回滚比实际删除更长.
虽然Oracle和大型事务(Oracle 将扩展)没有任何根本性的错误,但是将总工作分成更小的工作单元将允许您在发生故障时更快地重新启动流程并在较小的数据子集上重新启动流程.
如果唯一的提交是在过程的最后,则该on commit
子句有点无关紧要,除非此过程只是更大过程的一部分.当您的会话结束时,无论on commit
设置如何,GTT数据都将消失,因此您的"备份"数据仅在执行该过程的会话中可用.从上下文来看,目前尚不清楚你是否意识到你的"备份"是暂时的.
该on commit preserve rows
子句的作用是允许您在会话期间提交非GTT数据,而不会丢失GTT中的内容.假设您要以块的形式删除数据,一次可能删除一百万行.因此,您可以识别百万行,将它们复制到GTT,从原始表中删除它们,然后提交.如果您的on commit
设置delete rows
此时此GTT再次为空,那么您没有备份.但是,如果你on commit
的preserve rows
话,你的GTT会保留你插入的百万行.
重复80次......最后delete rows
GTT是空的,一次不超过一百万行; 随着preserve rows
它将每次增长,并将拥有所有8000万条记录.但直到会议结束.
有了preserve rows
,如果你遇到的任何点问题,您可以重新插入所有从你的"备份" GTT的数据到原始表.随着delete rows
你只能重新插入自上次提交任何已被删除-但你可能也只是回滚在这一点上.
归档时间: |
|
查看次数: |
4767 次 |
最近记录: |