Oracle10g --由于与9i数据库的兼容性问题,我使用INSERT INTO...SELECT语句通过每15分钟运行一次的计划作业,通过10g数据库(将由11g数据库使用)从10g数据库中提取数据。我注意到TRUNCATE语句比DELETE语句快得多,并且已经读到了DELETE语句的一个‘缺点’就是它们永远不会减少表中的高水标记。我对这些数据的使用纯粹是只读的--更新和插入从来不会针对这些表发出。
鉴于以上所述,我希望避免出现这样的情况:我的“工作”数据库(Oracle11g)试图从临时数据库(10g)上的一个表中读取数据,该表在一段时间内是空的,因为截断立即发生,而从9i数据库插入的INTO...SELECT需要几分钟才能完成。
所以,我想知道这是否是Oracle在事务中处理截断的方式,还是整个操作被执行和COMMITted,尽管截断不能回滚?或者,换句话说,从外部选择的角度来看,如果我包装一个TRUNCANTE并在事务中的一个表上插入INTO...SELECT,该表是否会显示为空到从表中读取的外部选择?
发布于 2015-05-22 02:55:22
一旦事务中的表被截断,您就不能在同一事务中对该表执行任何其他操作;在再次使用该表之前,您必须提交(或回滚)事务。或者,截断表可以有效地终止当前事务。无论哪种方式,如果使用TRUNCATE,则当表被截断(空)但INSERT操作尚未完成时,就会有一个窗口。这不是您想要的,而是Oracle提供的。
发布于 2016-07-21 18:39:10
您可以进行分区交换。在暂存表中有两个分区;p_OLD和p_NEW。
使用这种方法,您的表永远不会对旁观者来说是空的。
为什么需要3个Oracle环境?
https://stackoverflow.com/questions/30387581
复制相似问题