2017-10-19 115 views
1

我需要update表的字段中Merge Into声明,我在做什么是这样的的Oracle SQL:更新

MERGE INTO A_TABLE a 
USING (ANOTHER_TABLE b) 
ON (SOME_PK) 
WHEN MATCHED THEN 
UPDATE 
SET a.field = b.field 
WHERE a.field != b.field 

我的问题前,检查数据库字段的值是关于最后我检查这些值是否为equal or not。我可以声称这些表之间可能只有%2 difference。在这种情况下,我会在WHERE条款中输赢什么?也许oracle在这种情况下有一些优化,其中更新的字段与将要设置的值相同。

+0

离开声明没有问题。 。 。假设旧的和新的值都不是“空”。 –

+0

请删除您的评论之一。我知道没有问题,我有dbUnit测试证明这一点。我在问什么是优点或缺点。 –

+0

@Erdiİzgiiki durumdaki'解释计划'dan gelen,'cost'değerlerinebakmıştınızdeğilmi Erdi bey? –

回答

1

问题是,我可以使用WHERE子句或没有它来完成此任务。没有WHERE语句,我正在进行1M更新,我有1M次检查+ 20K更新。我在问哪一个更好。

在我看来1M checks + 20K updates更好。原因:你需要更新

1)更新行,也没有使身份运行A => A

2)如果您有该表触发器您可以在故障结束点。

  • 更新LAST_UPDATE日期(对于合并的每次调用它看起来就像整个表已经改变)

  • 插入到历史表(大量重复的)

3)可能在自动刷新的情况下在该表的顶部具有物化视图

4)更新索引/检查外键的额外开销