【发布时间】:2016-05-13 19:10:50
【问题描述】:
我试图在网上寻找它,但找不到任何可以解决我疑问的东西。
我想弄清楚哪个更好用,什么时候用,为什么用?
我知道 MERGE 通常用于 upsert,但在某些情况下,使用 with 子查询的正常更新必须从表中选择两次(一次来自 where 子句)。
例如:
MERGE INTO TableA s
USING (SELECT sd.dwh_key,sd.serial_number from TableA@to_devstg sd
where sd.dwh_key = s.dwh_key and sd.serial_number <> s.serial_number) t
ON(s.dwh_key = t.dwh_key)
WHEN MATCHED UPDATE SET s.serial_number = t.serial_number
就我而言,我必须在一个环境中更新一个包含大约 2 亿条记录的表,基于另一个环境中的同一张表,其中序列号字段发生了变化。如您所见,它从这个巨大的表中选择了一次。
另一方面,我可以使用这样的 UPDATE STATEMENT:
UPDATE TableA s
SET s.serial_number = (SELECT t.serial_number
FROM TableA@to_Other t
WHERE t.dwh_serial_key = s.dwh_serial_key)
WHERE EXISTS (SELECT 1
FROM TableA@To_Other t
WHERE t.dwh_serial_key = s.dwh_serial_key
AND t.serial_number <> s.serial_number)
如您所见,这个从巨大的表格中选择了两次。所以,我的问题是,什么更好?为什么?..哪种情况会比另一种更好..
提前致谢。
【问题讨论】:
-
你不能修复那个更新(自己使用连接表)然后检查速度/执行计划吗?
-
@Veljko89 我将如何在 oracle 中做到这一点?
-
在 oracle 上工作不多,但我确定里面有内部连接......我可以试着把它写下来,给我几分钟
-
@Veljko89 这是在 oracle 中加入更新的语法
-
该死的语法糟透了......只是用谷歌搜索......Oracle不支持在UPDATE语句中加入。 ...您每天都会学到新东西!
标签: sql oracle performance merge sql-update