【问题标题】:SSIS, query Oracle table using ID's from SQL Server?SSIS,使用 SQL Server 中的 ID 查询 Oracle 表?
【发布时间】:2021-10-20 16:46:33
【问题描述】:

这是我想在 SSIS 中做的基本想法:

我有一个针对生产 Oracle 数据库的大型查询,我需要以下 where 子句,它会从 SQL Server 中引入一长串 id。从那里,结果被发送到其他地方。

select ... 
from Oracle_table(s) --multi-join
where id in ([select distinct id from SQL_SERVER_table])

或者,我可以这样编写查询:

select ...
from Oracle_table(s) --multi-join
...
join SQL_SERVER_table sst on sst.ID = Oracle_table.ID

这是我的限制:

  • Oracle 查询很大,没有where id in (... 子句就无法运行
    • 这意味着我无法运行 Oracle 查询,然后在另一个步骤中将其与 id 结合起来。我试过了,DBA 在临时表大小变为 3 TB 后将其杀死。
  • 我有 160k id
    • 这意味着逐个遍历 id 是不切实际的。过去,我使用逗号分隔的列表运行了大约 1000 个 ID。它的运行速度相对较快 - 几分钟。
  • 主要查询在 Oracle 中,但 ID 在 SQL Server 中
  • 我无法写入 Oracle

我发现了很多这样的问题。
我找到的答案都没有解决我的局限性。

类似的问题:

【问题讨论】:

  • 这些 ID 到底是什么? 160k x 4 字节(对于 int)似乎并不接近 3TB。
  • ID 是字母数字帐号。它们并不大。针对 Oracle 的查询正在提取 50 多列、20 多万行数据。
  • 您是否可以使用linked servers 的Oracle 等效项?然后,您可以在 Oracle 服务器上创建一个视图,用于查询链接服务器的 ID。
  • 假设 ID 不是连续的值,如何将来自 SQL 的 ID 分页为 1000 个批次并使用 in () 循环约 160 次以提取所有行?
  • @allmhuran:我们从 SQL SERVER ID 创建了一个对象,并遍历它们。 SSIS 有很多缓慢的开销步骤,这非常麻烦。不理想,但它最终奏效了。好吧,它实际上在中途死亡,并在第二次运行时完成了剩余的 ID。

标签: sql-server oracle ssis etl ssis-2012


【解决方案1】:

防止从 Oracle 表中加载所有行。唯一的方法是在 Oracle 数据库引擎中应用过滤器。我不认为这可以使用 SSIS 来实现,因为您在 SQL Server 表中有超过 160000 个 id,这些 id 无法有效加载并传递给 Oracle SQL 命令:

  • 使用查找和合并连接需要从 Oracle 数据库加载所有数据
  • 使用太多 ID (160K) 无法从 SQL Server 检索数据、构建逗号分隔字符串并将其传递给 Oracle SQL 命令。
  • 使用脚本任务时同样的问题。
  • 在 SQL Server 中创建链接服务器并连接两个表将从 Oracle 数据库加载所有数据。

要解决您的问题,您应该寻找一种方法来从 Oracle 引擎创建到 SQL Server 数据库的链接。

Oracle 异构服务

我在 Oracle 数据库方面没有太多经验。不过,经过一些小研究后,我在 Oracle 中发现了与 SQL Server 中的“链接服务器”等效的东西,称为“异构连接”

查询语法应如下所示:

select * 
from Oracle_table
where id in (select distinct id from SQL_SERVER_table@sqlserverdsn)

您可以参考以下分步指南,详细了解如何从 Oracle 连接到 SQL Server 表:

将数据从 SQL Server 导入 Oracle 中的临时表

另一种方法是使用数据流任务将 ID 从 SQL Server 导入到 Oracle 中的临时表。然后在您的 Oracle 查询中使用临时表。最好在临时表上创建索引。 (如果您没有写入 Oracle 数据库的权限,请尝试获得对单独临时数据库的权限。)

将数据从 SQL Server 导出到 Oracle 的示例:

最小化 Oracle 表的数据负载

如果以上解决方案都不能解决您的问题。您可以尝试尽量减少从 Oracle 数据库加载的数据。

例如,您可以尝试从 SQL Server 表中获取最小和最大 ID,将这两个值存储在两个变量中。然后,您可以在从 Oracle 表加载数据的 SQL 命令中使用这两个变量,如下所示:

SELECT * FROM Oracle_Table WHERE ID > @MinID and ID < @MaxID

这将删除您操作中的一堆无用数据。如果您的 ID 列是字符串,您可以使用其他度量来过滤数据,例如字符串长度、第一个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2011-09-05
    • 2021-05-08
    相关资源
    最近更新 更多