暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle ETL更新的最佳实践

askTom 2017-07-28
276

问题描述

我们在具有38个可更新列的表上有一个ETL进程。源数据是具有单列唯一记录标识符的CSV文件,我们将此文件设置为外部表。目标表有一个对应的主键列。源数据可以包括新的和更新的记录,并且将不包含已被弃用的记录。插入新记录可以正常工作,将不推荐使用的记录更新为非活动状态也是如此。问题是更新修改后的行。该表目前有大约85,000行,6,800将被更新。使用以下语法,更新需要65分钟。

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

专家解答

合并可能是您最好的选择,因为插入阶段是可选的。你会有这样的东西:


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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论