【发布时间】:2025-12-20 12:10:12
【问题描述】:
Oracle 10g -- 由于与 9i 数据库的兼容性问题,我正在使用 INSERT INTO...SELECT 语句通过 10g 数据库(供 11g 数据库使用)通过运行每个15分钟。我注意到 TRUNCATE 语句比 DELETE 语句快得多,并且已经读到 DELETE 语句的“缺点”是它们永远不会降低表的高水位线。我对这些数据的使用纯粹是只读的——永远不会针对有问题的表发出 UPDATE 和 INSERT。
鉴于上述情况,我想避免我的“工作”数据库 (Oracle 11g) 尝试从我的暂存数据库 (10g) 上的表中读取数据的情况,该表在一段时间内为空,因为 TRUNCATE 直接发生9i 数据库中的 INSERT INTO...SELECT 需要几分钟才能完成。
所以,我想知道这是否是 Oracle 在事务中处理 TRUNCATE 的方式,或者是否执行并提交了整个操作,尽管 TRUNCATE 无法回滚?或者,换一种说法,从外部 SELECT 的角度来看,如果我在事务中的表上包装 TRUNCANTE 和 INSERT INTO...SELECT,那么从表中读取的外部 SELECT 表会不会显示为空?
【问题讨论】:
-
TRUNCATE语句会导致隐式提交。因此,紧跟在TRUNCATE之后,启动查询表的事务的其他会话将看到它为空,直到使用INSERT和COMMIT将行添加到表中。 -
不,他们没有。截断是 DDL 语句并且 DDL 总是提交。截断只是删除整个表的段并创建一个新段。此操作还会使库缓存中针对此表的所有执行计划无效。
标签: database oracle oracle11g transactions oracle10g