在 MSSQL 中从链接服务器 ORACLE 快速加载数据

Fast loading of data from a linked server ORACLE in MSSQL

我在 DB MSSQL 中有程序从链接服务器 ORACLE 加载数据

在 DB MSSQL 中有一个表:

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

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

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

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

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

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

下面的例子是TSQL,从SQL服务器执行。如果您需要从 Oracle 执行,相同的代码很容易转换为 PL/SQL。两种方法我都做过。

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

    -- 示例代码

     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;