1

我有一个包含大约 7M 行的表和一个 SSIS 包,它使用如下语句更新该表中的 5.6M 行。

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

然后,我启动了几个大型的选择语句,它们对Target. 我从这些选择语句中得到了 ORA-01555(快照太旧:名称为“字符串”的回滚段编号字符串太小)。这在我看来就像 MERGE 语句在提交完成之前返回。我最初的想法是增加回滚段的大小(诚然这可能会引入完整性问题),但我们的 DBA 并不热衷于这个想法。他们建议我在开始选择语句之前等待 1 分钟。(对我来说,与人工等待同步是一个危险信号。)

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

4

1 回答 1

1

我会避免合并整个表(如果可能的话):

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
于 2018-06-14T07:27:28.137 回答