【问题标题】:Fast loading of data from a linked server ORACLE in MSSQL在 MSSQL 中从链接服务器 ORACLE 快速加载数据
【发布时间】:2019-10-21 13:37:51
【问题描述】:
我在 DB MSSQL 中有用于从链接服务器 ORACLE 加载数据的过程
在 DB MSSQL 中有一个表:
- table_1 包含订单 ID 列表
- 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;