【问题标题】:MERGE vs. UPDATE合并与更新
【发布时间】: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


【解决方案1】:

我会首先尝试将所有必要的数据从远程数据库加载到临时表中,然后使用该临时表。

create global temporary table tmp_stage (
    dwh_key         <your_dwh_key_type@to_devstg>,
    serial_number   <your_serial_number_type@@to_devstg>
) on commit preserve rows;

insert into tmp_stage
select dwh_key, serial_number
from TableA@to_devstg sd
where sd.dwh_key = s.dwh_key;


/* index (PK on dwh_key) your temporary table if necessary ...*/

update (select
         src.dwh_key src_key,
         tgt.dwh_key tgt_key,
         src.serial_number src_serial_number,
         tgt.serial_number tgt_serial_number
       from tmp_stage src
       join TableA tgt
         on src.dwh_key = tgt.dwh_key
       )
  set src_serial_number = tgt_serial_number;

【讨论】:

  • 谢谢,我已经考虑过使用一个临时表来存储这两个表之间的所有差异。我发布了我的问题以找出哪个更好,MERGE 或 UPDATE。所以你会说更新会比这里的合并更快?为什么?
  • @sagi,只需在具有相同索引的较小数据集上测试和比较这两种方法... ;)
  • 这就是我要做的:) 我也想尝试另一种方法将循环(for rec in(....using Oracle's Rownum) 。我只是问是否有一些规则关于它以及合并/更新会更快的时间..无论如何我会赞成你的答案,但这仍然不能回答我的问题
  • 好吧,我不是 100% 确定,但我认为更新应该快一点。
  • 有时重构(创建具有所需值的新表)整个表比更新 200 mio 更容易/更快。行。
猜你喜欢
  • 1970-01-01
  • 2014-02-06
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多