问题描述
我们在具有38个可更新列的表上有一个ETL进程。源数据是具有单列唯一记录标识符的CSV文件,我们将此文件设置为外部表。目标表有一个对应的主键列。源数据可以包括新的和更新的记录,并且将不包含已被弃用的记录。插入新记录可以正常工作,将不推荐使用的记录更新为非活动状态也是如此。问题是更新修改后的行。该表目前有大约85,000行,6,800将被更新。使用以下语法,更新需要65分钟。
是否有更有效的方法来完成更新?
Thanx,D
update target_table tgt
set (
column1, ..., column38
) = (
select column1, ..., column38
from external_source_table src
where src.key_value = tgt.primary_key
)
where primary_key in (
select key_value
from (
select
key_value, column1, ..., column38
from external_source_table
minus
primary_key as key_value, column1, ..., column38
from target_table
)
);
是否有更有效的方法来完成更新?
Thanx,D
专家解答
合并可能是您最好的选择,因为插入阶段是可选的。你会有这样的东西:
尽管我对您的SQL有些困惑,因为您的子查询似乎只在查找表中已经 * 不是 * 的行,这表明插入而不是更新?
merge target_table tgt
using ( select ... from external_source_table ) src
on ( tgt.primary_key = src.primary_key )
when matched then
update
set tgt.col1 = src.col1,
tgt.col2 = src.col2,
...
尽管我对您的SQL有些困惑,因为您的子查询似乎只在查找表中已经 * 不是 * 的行,这表明插入而不是更新?
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




