Oracle MERGE语句是否在提交完成之前返回

Oracle MERGE语句是否在提交完成之前返回,oracle,Oracle,我有一个大约700万行的表和一个SSIS包,该包使用如下语句更新该表中的560万行 MERGE INTO Target t USING ( select ID, Type from SomeTable ) s ON (t.ID = s.ID) WHEN MATCHED THEN UPDATE SET t.Type = s.Type 然后,我启动几个大型select语句,对Target进行内部连接。我从那些select语句中得到了ORA-01555(快照太旧:名称为“string”的回滚段

我有一个大约700万行的表和一个SSIS包,该包使用如下语句更新该表中的560万行

MERGE INTO Target t
USING
(
 select ID,
 Type
 from SomeTable
) s
ON (t.ID = s.ID)
WHEN MATCHED THEN UPDATE SET t.Type = s.Type
然后,我启动几个大型select语句,对
Target
进行内部连接。我从那些select语句中得到了ORA-01555(快照太旧:名称为“string”的回滚段编号字符串太小)。在我看来,MERGE语句在提交完成之前返回。我最初的想法是增加回滚段的大小(无可否认,这可能会带来完整性问题),但我们的DBA并不热衷于这个想法。他们建议我在开始select语句之前等待1分钟。(对我来说,与人工等待同步是一个危险信号。)


我的问题是,有没有办法确保MERGE语句返回之前MERGE提交已经完成?对我来说,这将解决问题。

我将避免合并整个表(如果可能):


如果要提交,请发出提交。合并(或任何其他DML语句)不会提交。您需要在它完成后显式提交;或者使用设置为“自动提交”的客户端/驱动程序,合并完成后仍然会发生这种情况。那么,如何运行合并和后续查询呢?查询是否在不同的会话中,并且正在尝试查看预合并数据,因为它还没有提交?是否可以使用内部联接发布SQL。你是在打电话给他们吗?DBA的推荐听起来很奇怪。“合并不提交。@AlexPoole我一直在想提交的事。我的SSIS包使用Oracle OLEDB提供程序,因此,如果我没有显式提交,则必须在封面下有某种东西进行提交。合并是一个SSIS执行SQL任务,选择是使用Attunity Oracle源组件的SSIS数据流。是否存在隐式提交或OLDB提供程序是否插入提交?但是如果解决方案像那样简单,那就太好了。而且,我碰巧知道t.Type在这一点上是空的。这就是为什么我在更新中没有where子句的原因。@Rubio
另外,我碰巧知道t.Type此时为null。这就是为什么我在更新中没有where子句,这是一个糟糕的解释。如果在
UPDATE
中有多个列,则有解决方案不确定“解释不好”是什么意思。如果我有不止一个专栏要更新,我会处理它,但我没有。我的解决方案是否存在可能的问题、完整性和性能?@Rubio是的,不必要的更新。没有必要更新所有匹配的行并生成大量的撤消/重做操作。
MERGE INTO Target t
USING( select ID, Type
      from SomeTable
      where some_kind_of_timestamp_column > date_of_last_incremental_load
) s
ON (t.ID = s.ID)
WHEN MATCHED THEN UPDATE SET t.Type = s.Type
                  WHERE (t.Type != s.Type)
                    OR (t.Type IS NULL AND s.TYPE IS NOT NULL)
                    OR (t.Type IS NOT NULL AND s.TYPE IS NULL)
                  -- there is no need for updating A -> A

COMMIT;

-- some select