修改
此问题已在SO上关闭并重新发布在ServerFault上
我在SSIS中有每日ETL过程来构建我的仓库,以便我们可以提供日常报告。
我有两台服务器 - 一台用于SSIS,另一台用于SQL Server数据库。 SSIS服务器(SSIS-Server01)是一个8CPU,32GB RAM盒。 SQL Server数据库(DB-Server)是另一个8CPU,32GB RAM盒。两者都是VMWare虚拟机。
在过于简化的形式中,SSIS从DB-Server上的单个表中读取1700万行(约9GB),将它们移动到408M行,执行一些查找和大量计算,然后将其聚合回每次在同一个DB-Server上写入一个全新表的大约8M行(然后该表将被移动到一个分区中以提供日常报告)。
我有一个循环,一次处理18个月的数据 - 总计10年的数据。根据我对SSIS-Server上的RAM使用情况的观察,我选择了18个月 - 在18个月时它消耗了27GB的RAM。高于此值,SSIS开始缓冲到磁盘并且性能急剧下降。
我正在使用Microsoft's Balanced Data Distributor向下发送8条并行路径的数据,以最大限度地利用资源。在开始我的聚合工作之前,我做了一个工会。
以下是SSIS服务器的任务管理器图表
alt text http://img155.imageshack.us/img155/8453/resources01.jpg
这是显示8个独立CPU的另一个图表
alt text http://img219.imageshack.us/img219/2013/resources02.jpg
从这些图像中可以看出,随着越来越多的行被读取和处理,内存使用量逐渐增加到大约27G。但是,CPU使用率保持在40%左右。
第二张图表显示我们只使用了8个中的4个(有时是5个)。
我正在努力让流程运行得更快(它只使用40%的可用CPU)。
如何更有效地运行此流程(最少时间,大多数资源)?
答案 0 :(得分:2)
您之前是否曾尝试将18个月的加工时间进一步分为2批或3批次?当然,除非您的分区方案需要在该分区中共同使用所有18个月 - 但是,看看如何以及为何使用该方案对数据进行分区将是一件奇怪的事情。如果在重新创建索引/约束时有适当的验证,那么仍然可以分成批次。
根据我的经验,我曾经不得不创建一个可以处理5到6千万条记录的作业,虽然源是来自数据文件,目的地是服务器中的表,但是将它们分成批次证明是一个比一次全力以赴更快的方法。
您是否担心这是一个高度交易的数据库?如果是这样,您是否碰巧有适当的数据冗余?
[编辑#01]
回复:评论#01:对不起,如果我很困惑;我的意思是,在处理记录的预定日期,最好为您的ssis包运行一定时间间隔运行(所以测试1个月处理多长时间并取平均值并给它一个缓冲时间)一次处理一个月或两个(如果可能),然后在顶部设置一个额外的任务来计算/确定要处理的月份。
<只假设两个月需要不到一个小时才能完成>
[预定运行]:01:00
[ssis task 01]获取当前时间的小时值。如果hour = 1,则设置monthtoprocessstart = 1和monthtoprocessend = 2
[ssis task 02等]:处理月份在范围内的数据(monthtoprocessstart和您正在处理的年份结束)
如果这更令人困惑,请告诉我,以便我可以删除编辑..谢谢..
答案 1 :(得分:2)
在一天结束时,所有处理都受四个因素之一
的约束第一步是确定限制因素是什么,然后确定您是否可以影响它(获得更多或减少使用量)
当您执行超过18个月时服务器内存耗尽的原因与它处理这么长时间的原因有关。 Pivot and Aggregate transformations是异步组件。从源组件进入的每一行都有N个字节的内存分配给它。同一桶数据访问所有转换,应用其操作并在目的地清空。该内存桶一遍又一遍地重复使用。
当异步组件进入竞技场时,管道将被拆分。现在必须将传输该行数据的存储桶清空到新存储桶中以完成管道。在执行树之间复制数据在执行时间和内存方面是一项昂贵的操作(可能会使其加倍)。这也减少了引擎在等待异步操作完成时并行执行某些执行机会的机会。从转换的性质来看,进一步减慢到操作。 Aggregate是一个完全阻塞的组件,因此所有数据必须到达并在转换之前处理,才能将单行释放到下游转换。
如果可能,您可以将数据透视和/或聚合推送到服务器上吗?这应该减少在数据流中花费的时间以及消耗的资源。
您可以尝试增加引擎可以选择的并行操作量。 Jamie's article,SQL CAT's article
如果您真的想知道在数据流中花费的时间,请记录OnPipelineRowsSent以执行。然后你可以使用这个query将它拆开(在用sysssislog替换sysdtslog90之后)
根据您的图表,任何一个框都不会显示CPU或内存。我相信您已经指出源服务器和目标服务器在一个盒子上,但SSIS包在另一个盒子上托管和处理。您需要支付一笔不小的费用才能通过网络传输数据并再次返回。是否可以在源服务器上处理数据?你需要为这个盒子分配更多的资源,而且我的手指是一个很强大的VM,这不是问题。
如果这不是一个选项,请尝试将连接管理器的Packet Size属性设置为32767,并与网络操作员讨论jumbo帧是否适合您。这两个提示都在Tune your Network部分中。
我吮吸磁盘计数器但你应该能够看到等待类型是否与磁盘有关。