SSIS将数据传输到Oracle DB的速度非常慢

时间:2017-05-10 00:44:45

标签: sql-server oracle ssis

我们正在从两个不同的来源将数据传输到Oracle数据库,而且速度极慢。

请参阅下面的注释和图片。有什么建议吗?

注意:

  1. 我们正在使用Microsoft OLE DB Provider for Oracle。
  2. 一个数据源是SQL Server,包含大约5M条记录。
  3. 第二个数据源是Oracle,包含大约700M条记录。
  4. 尝试传输SQL Server数据时,我们将其分解为 五,"数据流任务"在"控制流"。每个"数据流任务" 反过来使用" OLE DB源"内部使用" SQL命令" 有效地选择了1M的5M记录。当我们运行这个 包它运行第一个数据流任务大约3个小时和唯一 转移了大约50,000条记录,直到我们结束这个过程。
  5. 我们也有类似的Oracle数据经验。
  6. 由于某种原因,保存到Oracle目标的速度非常慢。
  7. 有趣的是,我们曾经将相同的700M记录从Oracle传输到 SQL Server(所以方向相反),它按预期工作 大约4.5到5个小时。
  8. 图片:

    Control Flow

    Data Flow

    OLE DB Source

    Data Conversion

    OLE DB Destination

3 个答案:

答案 0 :(得分:2)

在Oracle方面,您可以检查v $ session以查看花费的时间(如果AWR在Oracle实例上获得许可,则可以使用DBA_HIST_ACTIVE_SESS_HISTORY或v $ active_session_history)。

我每天都在研究Oracle性能问题(超过300个生产Oracle实例),所以我觉得有资格说我无法给你一个特定的问题答案,但我可以指出你正确的方向

使插入变慢的典型过程错误:

  1. 不使用数组插入

  2. 为每个插页连接数据库(听起来很奇怪?相信我 我已经看到DataStage和其他ETL工具以这种方式设置了)

  3. 应用服务器/客户端与Oracle实例不在同一局域网

  4. 正在插入的表上的索引(特别是有问题的 位映射索引);需要索引更新和表更新 声明

  5. 在Oracle实例上重做日志文件太小(开机了 重做日志文件切换)

  6. DB侧的log_buffer参数太小

  7. 没有足够的db编写器(请参阅db_writer_processes初始化 参数)

  8. 经常提交

答案 1 :(得分:1)

不是答案,只是一堆观察和问题......

数据管道中的任何一个组件都可能成为瓶颈。

首先需要在SSIS中以交互方式运行时观察行计数,看看是否有任何明显的堵塞 - 即您在数据转换转换之前是否有一个大的行数,而在数据转换之后有一个较低的行数?或者它是在Oracle目的地?或者只是花了很长时间才能走出SQL?检查SQL端的一种快速方法是将其转储到本地文件 - 这主要是测量SQL选择性能而不会阻止Oracle。

在SQL Server中运行源查询时,返回所有行需要多长时间?

您的数据转换转换可以在源查询中执行。每次转换都需要设置缓冲区,内存等,并且可能会减慢并阻止数据流。避免这些并在源查询中执行

Oracle驱动程序中存在的各种缓冲区和配置。已经由@RogerCornejo详细解决了。对于Oracle的读取性能,我发现改变FetchBufferSize会产生巨大的差异,但是你在这里做的是写,所以情况并非如此。

最后,两个数据库服务器和SSIS客户端工具在哪里?如果您在三个不同的服务器上运行它,那么您需要考虑网络吞吐量。

如果您按照建议使用链接服务器,请注意SSIS根本不进行任何处理,因此您可以将整个部分从等式中删除

如果您只是寻找传输数据的最快方式,您可能会发现转储到文件并批量插入是最快的

答案 2 :(得分:0)

谢谢大家的建议。对于那些可能在未来遇到类似问题的人,我发布了最终为我工作的内容。 答案是......转换提供商。 ODBC或Attunity提供程序要快得多,几乎是800倍。

请记住,我的目标是将数据从SQL Server数据库移动到Oracle数据库。我最初使用OLE DB提供程序来源和目标。如果要将数据从SQL Server移动到SQL Server ,此提供程序可以正常工作,因为它允许您使用目标上的“快速加载”选项,从而允许您使用批处理。

但是,OLE DB提供程序不允许使用Oracle DB作为目标的“快速加载”选项(无法使其工作并在别处读取它不起作用)。因为我无法使用“快速加载”选项,所以我无法批处理,而是逐行插入记录,这非常慢。

一位同事建议尝试使用ODBC,其他人建议尝试使用Microsoft的Attunity Connectors for Oracle。我不认为差别会那么大,因为根据我的经验,ODBC的性能与OLE DB相似(有时甚至更低)(没有尝试过Attunity)。但是......那时将数据从SQL Server数据库移动到或停留在Microsoft世界中。

将数据从SQL Server数据库移动到Oracle数据库时,存在巨大差异! ODBC和Attunity都显着地执行了OLE DB。

以下是我汇总的性能测试结果,它将5.4M记录从SQL Server数据库插入Oracle数据库。

在一台本地计算机上完成所有工作时。

  • OLE DB源和目标已插入每分钟12,000条记录,这将约。 7小时完成。
  • ODBC源和目标插入每分钟9百万条记录,只占大约。 30秒完成。

将数据从一台网络/远程计算机移动到另一台网络/远程计算机时。

  • OLE DB源和目标已插入每分钟115条记录,其中约。 32天完成。
  • 插入了ODBC源和目标每分钟1百万条记录,仅使用约。 5分钟完成。

差异很大!

现在为什么在本地工作时只用了30秒而远程需要花费5分钟是另一天的另一个问题,但是现在我有一些可行的东西(在网络上它应该更慢,但是它会慢得多)。

再次感谢大家!

额外说明:

  • 我的OLE DB结果与Oracle数据库的Microsoft或Oracle OLE DB提供程序类似。
  • Attunity比ODBC快一点。我没有在远程服务器或更大的数据集上进行测试,但在本地它确实比ODBC快了大约2到3秒。那些秒可以累加到大数据集上,请注意。