SSIS - ETL - 执行性能问题

Posted

技术标签:

【中文标题】SSIS - ETL - 执行性能问题【英文标题】:SSIS - ETL - Execution performance issue 【发布时间】:2018-02-02 11:36:32 【问题描述】:

我们有一个生产 SSIS 解决方案,用作 ETL 流程。它已经投入生产一年多了,并且运行良好。然而,从字面上看,一夜之间,性能像石头一样下降。 ETL 移动和处理的数据量没有显着差异。

ETL 过程是一系列非常简单的并行执行的单独包。它不会做任何特别复杂的事情。

没有任何东西部署到服务器上,并且在最后一次“良好”运行和第一次“糟糕”运行之间没有进行任何配置更改,但突然之间花费了平时的三倍。

我已经对日志进行了挖掘,我想我可以看到发生了什么,但我不知道为什么。我查询了其中一个 SSIS 包的 catalog.event_messages 视图,发现包内不同任务之间存在巨大延迟。我查看了许多其他包,并且重复了相同的模式 - 看起来它正在影响所有这些包。

当我将这些与前一天(最后一次“良好”运行)的条目进行比较时,没有延迟。这些包只是从头到尾压缩。

所以看起来问题出在各种包中的任务之间突然引入这些延迟。

这是一个例子。在最后一次“良好”运行时,这个包从开始到结束执行的时间不到 1 秒,但第二天晚上,移动相同数量的数据大约需要 2 分钟。

2018-01-14 22:23:33.9631482 +00:00  EXTRACT_XXXXXXXXXX:Information: The package is attempting to configure from the parent variable "ProcessLogID".
2018-01-14 22:23:33.9631482 +00:00  EXTRACT_XXXXXXXXXX:Information: The package is attempting to configure from the parent variable "LoadID".
2018-01-14 22:24:02.7208761 +00:00  EXTRACT_XXXXXXXXXX:Validation has started.
2018-01-14 22:24:02.7208761 +00:00  EXTRACT_XXXXXXXXXX:Validation is complete.
...
...

所以第二行和第三行之间有 29 秒的间隔

对于我们拥有的同一个包,再往下一点:

...
2018-01-14 22:24:02.8146315 +00:00  Truncate existing data:Start, 22:24:02.
2018-01-14 22:24:30.9061374 +00:00  Truncate existing data:Validation has started.
2018-01-14 22:24:30.9061374 +00:00  Truncate existing data:Validation is complete.
2018-01-14 22:24:46.6667393 +00:00  Truncate existing data:Finished, 22:24:46, Elapsed time: 00:00:43.844.
...
...

所以在开始这个任务和验证之间有 28 秒的间隔。

后来我们也有:

...
2018-01-14 22:24:57.9902520 +00:00  Data Flow Task:Information: The final commit for the data insertion in "OLE DB Destination" has started.
2018-01-14 22:25:11.9929728 +00:00  Data Flow Task:Information: The final commit for the data insertion  in "OLE DB Destination" has ended.
...

所以这里还有一个很大的差距。

这个包的前一晚的条目没有任何延迟(整个过程花了

有人知道是什么原因造成的吗?

在最后一次“好”和第一次“坏”运行之间没有新的部署/配置更改,因此没有任何变化(或至少没有明显的变化!)。

提前感谢您提供的任何帮助。

【问题讨论】:

在包执行期间外部应用程序是否有可能访问源/目标数据库?你可以运行包并重新创建问题并查找任何锁定/等待吗? 谢谢。有人告诉我,当时不应该在源数据库或目标数据库上运行任何其他东西。 服务器配置是否发生了变化:RAM / CPU 设置?您允许 SQL Server 使用多少可用内存? 【参考方案1】:

尝试使用此命令更新数据库的统计信息:

EXEC sp_updatestats;

【讨论】:

【参考方案2】:

看起来您的包裹在验证阶段需要一些时间。请使用“Delay Validation=True”测试您的包的任务并查看结果。

【讨论】:

感谢您的回复。这些包已经将“DelayValidation”设置为 true。行为的改变几乎在一夜之间发生,没有代码部署/配置更改,因此这些设置对于“好”和“坏”运行是相同的。

以上是关于SSIS - ETL - 执行性能问题的主要内容,如果未能解决你的问题,请参考以下文章

某大型银行电子渠道报表系统SSIS ETL优化报告

SSIS简介

对 ETL 的良好 SQL Server 集成服务 (SSIS) 示例/示例的建议?

如何提高在SSIS中向表中插入数据的性能

如何提高 ETL 性能?

试图通过SSIS教程。为SQL Server 2012创建一个简单的ETL包。