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

Oracle 比较/合并大表的有效方法

askTom 2017-03-21
233

问题描述

亲爱的Oracle大师;)
我有两个大表 (客户端帐户,5000万行,相同的字段,但不同的行) 在DWH环境:

-第一个表每天作为原始数据从OLTP服务器到DWH服务器的暂存区域,包含所有客户端帐户
今天的快照

-DWH详细信息区域中的第二个表,包含数据作为先前加载的快照

第一个问题是 “将第一个表与第二个表进行比较并执行合并的最有效方法是什么 (即插入新的
行更新更改标记为 “删除” 行,不再存在于OLTP中)

选项有:

1) 来自第一个第二个表的完全外部联接时的单个合并语句

2) 多个语句 (插入更新删除),它允许使用追加提示

3) ...?

第二个问题是 (作为上面第二个选项的INSERT语句的子问题) “什么是最有效的方法来找到第一个表中存在的行,而第二个表中不存在的行。

选项有:

1) first_table left join second_table on key = key WHERE second_table.key为null (全扫描哈希JOIN)

2) 用的东西。.. 不在 () 或。.. 不存在 ()

3) ..?


我有意不提现有索引 -- 第三个问题是:
“任何索引都可以帮助 (= 提高性能),在哪些选项中,为什么...?”

由于问题主要是理论上的,因此我不附加任何liveSQL,但是如果您有有力证明其中一种选择的示例,请分享...

提前谢谢!

专家解答

对我来说,合并是一条路。要仅合并新事物和已更改的事物,可以使用简单的解码。例如

  merge into TARGET_TABLE w
  using ( select
             PK_COL
            ,COL2
            ,COL3
            ,...
          from SOURCE_TABLE ) p
   on (  p.PK_COL = w.PK_COL
  )
  when matched then
  update set
    w.COL2           = p.COL2
  , w.COL3           = p.COL3
  , ...
  where   decode(w.COL2,p.COL2,1,0)=0
     or   decode(w.COL2,p.COL2,1,0)=0
     or   ...
  when not matched then
  insert
    ( w.PK_COL
    , w.COL2
    , w.COL3
    , ...
  )
  values (p.PK_COL
         ,p.COL2
         ,p.COL3
         ,...
  );
复制


使用解码也会处理null
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论