【发布时间】: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