Oracle将来自多个源的大量数据合并到一个表中

lnxxn5zx  于 2023-03-17  发布在  Oracle
关注(0)|答案(1)|浏览(225)

嗨,我正在尝试解决同步问题。我有三个相似的表,包含ID列+ 10列以上,在三个独立的数据库中,通过DB-link连接。每个表有12.88亿行
我所需要的,是在一个数据库创建证据表
预期结果:
| 识别号|数据库1中可用| db2 中可用|数据库3中可用|
| - ------|- ------|- ------|- ------|
| 一百二十三|“是”|“否”|“是”|
| 二百三十四|“否”|“否”|“否”|
| 三四五|“是”|“是”|“是”|
我想到了什么

  • 第一步-为每个数据库创建本地索引组织表(IOT)-仅使用ID
  • 第二步-使用Global_STATUS(包含所有ID和区域Y/N)填充/创建表

在第一步中,我使用了CTAS(创建表作为选择)使用parralel提示。和表创建约17分钟。-它相当不错
在第二步中,我尝试使用Merge语句...但是我的数据库运行完了UNDO。游标已经运行了很多个小时,仍然没有结果...操作必须快速,最好是2-3个小时,同时还要可靠。
我已经没有办法解决这个问题了。我会为任何想法或解决方案感到高兴!

fhg3lkii

fhg3lkii1#

IOT可能不是一个好的选择。您将执行全表扫描,因此索引结构对您没有好处,并且它消除了应用压缩的能力。另外,任何其他索引都将更宽,因为它们必须在其叶块中保存PK值。
由于您只需要知道值是否存在,因此ID列是您需要跨链接拉取的唯一列。(就像所有数据库链接流量一样),然后过渡到并行连接。在旧版本中或者如果您在这方面有困难,您可以将ID写入临时表作为第一步,这样连接就可以是非分布式查询。
最后,因为你没有一个包含所有ID的master,你需要一个完全连接(或者其他类似的连接),这需要在网络上移动数据两次。所以,无论如何,在本地实体化都是一个好主意。尝试如下:

WITH db1 AS (SELECT /*+ materialize */ id
               FROM table@db1),
     db2 AS (SELECT /*+ materialize */ id
               FROM table@db2),
     db3 AS (SELECT /*+ materialize */ id
               FROM table@db3),
     full AS (SELECT id
                FROM db1
              UNION
              SELECT id
                FROM db2
              UNION
              SELECT id
                FROM db3)
SELECT /*+ parallel(8) */
       full.id,
       DECODE(db1.id,NULL,'N','Y') db1,
       DECODE(db2.id,NULL,'N','Y') db2,
       DECODE(db3.id,NULL,'N','Y') db3
  FROM full
       LEFT OUTER JOIN db1 ON db1.id = full.id
       LEFT OUTER JOIN db2 ON db2.id = full.id
       LEFT OUTER JOIN db3 ON db3.id = full.id

相关问题