SSIS包在服务器上运行缓慢但在开发机器上运行良好

时间:2017-02-03 18:04:41

标签: sql-server postgresql ssis odbc sql-agent-job

我有一个SSIS包,可以将数据从SQL服务器移动到Postgres 9.5数据库。我使用最新的Postgres ODBC驱动程序连接到postgres服务器。大部分操作是插入,更新和upsert。当我在Visual Studio 2012中从我的开发机器(Win 10 64位)运行此程序包时,它非常快速。它可以在大约40秒内传输大约80k行。

当我将它部署到服务器(SQL Server 2012实例)并使用SQL管理工作室运行它时,执行速度非常慢。传输少于10行需要大约20秒,并且需要永远处理完整的数据集。如果完成,我永远不会放弃,因为它只需要太长时间。

我的开发机器和服务器都安装了完全相同的postgres驱动程序和相同配置的ODBC源。

编辑:我还应该注意,我已经将其他软件包部署到该服务器上运行得很好,尽管这些软件包不会触摸postgres或使用ODBC进行任何操作。

1 个答案:

答案 0 :(得分:0)

如果其他条件相同:

  • 相同的驱动程序
  • 相同的配置 - ODBC(即ssl,同一个框勾选),包参数
  • 相同的表 - 其中包含相同数量的数据和索引
  • 相同位(64x)

我会关注资源差异。即

  • 是IO相同的。假设这是写入相同的数据库(和文件),那么这应该不是问题。
  • 内存 - 是开发实例上受限制的ram吗?如果数据流有大缓冲区,这可能会减慢速度。
  • CPU - 开发服务器比开发机器更受限制
  • 网络 - 是位于具有不同QoS的不同子网中的开发服务器。我猜这不是问题,因为其他包不受影响。除非在连接到Postgres时有些奇怪。

另一种解决问题的方法是运行不同版本的软件包,剥离部分数据流。即删除odbc / ado.net目的地并运行包。如果它快速完成,你知道问题就在那里。如果它仍然很慢,继续向上游继续,直到你发现组件变慢。

最后,我会考虑使用psql而不是odbc。 psql是一个postgres实用程序,如SQL的bcp,它允许您批量复制数据到postgres。 odbc驱动程序只允许逐行插入,这往往是缓慢的。将数据写入制表符分隔文件,然后使用psql将数据批量复制到postgres实际上要快得多(80k行可能需要5s全部告诉)。