【问题标题】:Fast loading of data from a linked server ORACLE in MSSQL在 MSSQL 中从链接服务器 ORACLE 快速加载数据
【发布时间】:2019-10-21 13:37:51
【问题描述】:

我在 DB MSSQL 中有用于从链接服务器 ORACLE 加载数据的过程

在 DB MSSQL 中有一个表:

  1. table_1 包含订单 ID 列表
  2. table_2 包含有关订单的详细信息

在 DB MSSQL 中使用过程更新和加载数据到 table_2,过程使用运算符 IN 和 CURSOR ,它可以工作很长时间。 table_2 包含 1-2 百万行。

有没有其他方法/方法可以使用 table_1 中的初始数据将数据从 ORACLE DBMS 快速加载到 MSSQL 中?

【问题讨论】:

    标签: sql-server oracle linked-server


    【解决方案1】:

    听起来好像您想在 SQL*Server 和 Oracle 之间同步数据。最好的方法是使用执行此操作的商业产品。我已经在我们的商店中开发了一些执行此操作的例程,但这并不是微不足道的。

    执行此操作的最简单方法是使用升序 UID。在同步结束时将最大值记录到表中。下次运行同步时,请从 > 唯一值开始。

    我尽量避免使用游标,我使用插入/选择。它们更容易编码,运行速度非常快,并且作为一个单元失败。我每 4 小时将 60 万条记录从 Oracle 复制到 SQL Server。

    下面的示例是 TSQL,从 SQLServer 执行。如果您需要从 Oracle 执行,相同的代码很容易翻译成 PL/SQL。这两种方法我都做到了。

    • @last_loaded - 跟踪已加载到数据库中的最高 ID
    • tracker_table - 用于存储 last_loaded 值的表。
    • load_type = 2 - 跟踪器表可用于跟踪不同负载的 id。
    • oracledb.. - 连接到 Oracle 的 SQL Server 链接服务器的名称
    • COPYSCHEMA - 包含 Oracle 表的模式名称。始终指定!
    • COPYTABLE - 我们从中复制的 Oracle 表的名称

      -- 示例代码

       DECLARE @last_loaded INT;
      
       SELECT last_loaded
       INTO @last_loaded
         FROM tracker_table
        WHERE load_type = '2';
      
       INSERT INTO            LOAD_TABLE ( ID
                                         , COLUMNA
                                         , COLUMNB
                                         , COLUMNC )
       SELECT ID
            , columna
            , columnb
            , columnc
         FROM oracledb..COPYSCHEMA.COPYTABLE
        WHERE ID > coalesce(@last_loaded, 0);
      
       SELECT MAX(LAST_LOADED)
       INTO @last_loaded
         FROM LOAD_TABLE;
      
       UPDATE TRACKER_TABLE
         SET
             LAST_LOADED = @last_loaded
        WHERE LOAD_TYPE = 2;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2011-05-19
      • 2011-04-11
      相关资源
      最近更新 更多