为什么添加另一个 LOOKUP 转换会显着降低 SSIS 的性能
Why adding another LOOKUP transformation slows down performance significantly SSIS
我有一个简单的 SSIS 包,可以在源和目标之间将数据从一个服务器传输到另一个服务器。
如果是新记录 - 它会插入,否则它会检查 HashByteValue
列,如果它不同则更新记录。
Table 包含大约 150 万行,并更新大约 50 列。
当我开始调试包时,大约 2 分钟没有任何反应,我什至看不到绿色的复选标记。之后我可以看到数据开始流动,但有时它会停止,然后再次流动,然后再次停止,依此类推。
整个包是这样的:
但是如果我只做 INSERT
部分(没有更新)那么它就可以完美地工作,1 分钟和目标 table 中的所有 150 万条记录。
那么为什么向更新记录的包添加另一个 LOOKUP
转换会显着降低性能。
跟记忆有关系吗?我在 lookups
.
中都使用了 FULL CACHE
选项
提高性能的方法是什么?
原因是否在自动增长文件大小:
我认为您的问题不在于查找。 OLE DB 命令在 SSIS 上真的很慢,我不认为它适用于大量更新行。查看 MSDN 中的这个答案:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4f1a62e2-50c7-4d22-9ce9-a9b3d12fd7ce/improve-data-load-perfomance-in-oledb-command?forum=sqlintegrationservices
要验证错误不是查找造成的,请尝试禁用 "OLE DB Command" 并重新运行该过程,看看需要多长时间。
根据我的个人经验,当您必须根据特定条件进行更新或插入时,最好创建一个存储过程来完成整个 "dataflow"。为此,您需要一个 Staging table 和一个 Destination table(您将在其中加载转换后的数据)。
希望对您有所帮助。
除了将 AutoGrowth 大小更改为 100MB 之外,您的数据库日志文件为 29GB。这意味着您很可能没有进行事务日志备份。
如果您不是,则只需每晚或定期进行完整备份。将数据库的恢复模式从完整更改为简单。
数据库属性 > 选项 > 恢复模型
然后使用以下方法将您的日志文件缩小到 100MB:
DBCC SHRINKFILE(Catalytic_Log, 100)
我有一个简单的 SSIS 包,可以在源和目标之间将数据从一个服务器传输到另一个服务器。
如果是新记录 - 它会插入,否则它会检查 HashByteValue
列,如果它不同则更新记录。
Table 包含大约 150 万行,并更新大约 50 列。
当我开始调试包时,大约 2 分钟没有任何反应,我什至看不到绿色的复选标记。之后我可以看到数据开始流动,但有时它会停止,然后再次流动,然后再次停止,依此类推。
整个包是这样的:
但是如果我只做 INSERT
部分(没有更新)那么它就可以完美地工作,1 分钟和目标 table 中的所有 150 万条记录。
那么为什么向更新记录的包添加另一个 LOOKUP
转换会显着降低性能。
跟记忆有关系吗?我在 lookups
.
FULL CACHE
选项
提高性能的方法是什么?
原因是否在自动增长文件大小:
我认为您的问题不在于查找。 OLE DB 命令在 SSIS 上真的很慢,我不认为它适用于大量更新行。查看 MSDN 中的这个答案:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4f1a62e2-50c7-4d22-9ce9-a9b3d12fd7ce/improve-data-load-perfomance-in-oledb-command?forum=sqlintegrationservices
要验证错误不是查找造成的,请尝试禁用 "OLE DB Command" 并重新运行该过程,看看需要多长时间。
根据我的个人经验,当您必须根据特定条件进行更新或插入时,最好创建一个存储过程来完成整个 "dataflow"。为此,您需要一个 Staging table 和一个 Destination table(您将在其中加载转换后的数据)。
希望对您有所帮助。
除了将 AutoGrowth 大小更改为 100MB 之外,您的数据库日志文件为 29GB。这意味着您很可能没有进行事务日志备份。
如果您不是,则只需每晚或定期进行完整备份。将数据库的恢复模式从完整更改为简单。
数据库属性 > 选项 > 恢复模型
然后使用以下方法将您的日志文件缩小到 100MB:
DBCC SHRINKFILE(Catalytic_Log, 100)