【发布时间】:2010-04-20 19:45:08
【问题描述】:
我正在针对 SQL 2008 运行一个相当大的 SSIS 包 - 我在我的开发环境(Win7-x64 + SQL-x64-Developer)和生产环境(Server 2008 x64 + SQL)中都得到了相同的结果标准 x64)。
症状是初始数据加载速度在每秒 50K 到 500K 记录之间尖叫,但几分钟后速度急剧下降,最终缓慢爬行,令人尴尬。数据库处于简单恢复模式,目标表为空,并且满足最小日志批量插入的所有先决条件。数据流是从 RAW 输入文件到模式匹配表的简单加载(即没有复杂的数据转换、没有排序、没有查找、没有 SCD 等)
这个问题具有以下特点和弹性:
- 无论目标表是什么,问题仍然存在。
- RAM 使用率很低 (45%) - 有大量空闲 RAM 可供 SSIS 缓冲区或 SQL Server 使用。
- Perfmon 显示缓冲区没有假脱机,磁盘响应时间正常,磁盘可用性很高。
- CPU 使用率低(徘徊在 sqlserver.exe 和 DtsDebugHost.exe 之间共享的 25% 左右)
- 磁盘活动主要在 TempDB.mdf 上,但 I/O 非常低 (
- OLE DB 目标和 SQL Server 目标都存在此问题。
总而言之,我希望磁盘、CPU 或 RAM 在程序包变慢之前耗尽,但它就像 SSIS 程序包正在午睡一样。 SQL Server 仍然响应其他查询,我找不到任何性能计数器或记录的事件表明问题的原因。
我将不胜感激地奖励任何合理的答案/建议。
【问题讨论】:
-
对以下任何人的一些反馈...我尝试了 Todd 的建议,即消除单个组件以隔离原因,但无济于事...似乎经过长时间运行的内存密集型操作,包“睡着了”——最近是在 RAW 文件阅读器上——确实需要很少的 CPU 或 RAM。当此数据流停止时,没有其他任务正在执行。
-
进一步反馈:在 SQL 目标上设置较小的提交大小肯定会提高整体性能,就像在数据流之前禁用所有非聚集索引一样。虽然系统仍然表现出内存泄漏的行为特征 - Visual Studio 变得无响应,并且 SQL Server + DtsDebugHost 使用的 RAM 在包停止后超过 6GB。
-
关于为什么我的程序包变慢的答案:mssqltips.com/tip.asp?tip=1840 底线:在非常大的传输中,需要禁用索引并且需要减小 MaxInsertCommitSize,否则 SQL Server 将破坏 TempDB 和事务日志。
标签: performance ssis