Sql server 如何使SSIS进程运行得更快?

Sql server 如何使SSIS进程运行得更快?,sql-server,performance,ssis,sql-server-2008-r2,etl,Sql Server,Performance,Ssis,Sql Server 2008 R2,Etl,编辑 此问题已在SO上关闭,并在ServerFault上重新发布 我在SSIS中有一个每日ETL流程,用于构建我的仓库,以便我们能够提供每日报告 我有两台服务器——一台用于SSI,另一台用于SQL Server数据库。SSIS服务器(SSIS-Server01)是一个8CPU、32GB RAM的机箱。SQL Server数据库(DB Server)是另一个8CPU、32GB RAM的机箱。两者都是VMWare虚拟机 在其过于简化的形式中,SSI从DB服务器上的一个表中读取1700万行(约9GB

编辑

此问题已在SO上关闭,并在ServerFault上重新发布

我在SSIS中有一个每日ETL流程,用于构建我的仓库,以便我们能够提供每日报告

我有两台服务器——一台用于SSI,另一台用于SQL Server数据库。SSIS服务器(SSIS-Server01)是一个8CPU、32GB RAM的机箱。SQL Server数据库(DB Server)是另一个8CPU、32GB RAM的机箱。两者都是VMWare虚拟机

在其过于简化的形式中,SSI从DB服务器上的一个表中读取1700万行(约9GB),将其解压到40800万行,进行一些查找和大量计算,然后将其聚合回大约800万行,每次写入同一DB服务器上的一个全新表中(然后将该表移动到分区中,以提供每日报告)

我有一个循环,一次处理18个月的数据—总共10年的数据。我根据对SSIS服务器上RAM使用情况的观察选择了18个月—在18个月时,它会消耗27GB的RAM。如果超过这个值,SSIS就会开始缓冲到磁盘,性能就会下降

我使用8条并行路径发送数据,以最大限度地提高资源利用率。在开始聚合工作之前,我会进行联合

下面是来自SSIS服务器的任务管理器图

下面是另一个显示8个独立CPU的图表

从这些图片中可以看到,随着越来越多的行被读取和处理,内存使用率慢慢增加到27G左右,但是CPU使用率保持在40%左右

第二个图表显示,我们只使用了8个CPU中的4个(有时是5个)

我试图让进程运行得更快(它只使用了可用CPU的40%)


我如何让这个过程更高效地运行(最少的时间,最多的资源)?

您以前是否尝试过将18个月的处理进一步分成2个或3个以上的批?当然,除非您的分区方案需要将所有18个月都放在该分区中——但接下来,看看您是如何以及为什么使用该方案对数据进行分区的,这将是一件很奇怪的事情。而且,打破分区方案仍然可以如果在重新创建索引/约束时进行了验证,则批处理

根据我的经验,我曾经不得不创建一个处理5000万到6000万条记录的作业,尽管源文件来自数据文件,目标文件位于服务器中的一个表中,但事实证明,将它们分批处理要比一次处理所有记录快得多

您是否担心性能急剧下降,因为这是一个高度事务性的数据库?如果是,您是否碰巧有任何数据冗余供您使用

[编辑#01]

Re:评论#01:如果我很困惑的话,很抱歉;我的意思是,在处理记录的计划日期,最好让ssis包的计划作业以一定的间隔运行(因此测试处理1个月的时间,并取平均值并为其提供时间缓冲),一次处理一两个月(如果可能)然后在顶部设置一个额外的任务来计算/确定要处理的月份

举个例子: <仅假设两个月内完成不到一小时>

[预定运行]:01:00

[ssis任务01]获取当前时间的小时值。如果小时=1,则设置monthtoprocessstart=1和monthtoprocessend=2

[ssis任务02等]:处理月数在范围内的数据(monthtoprocessstart和end,处理年份)


如果这更让人困惑,请告诉我,这样我就可以删除编辑。谢谢。

在一天结束时,所有处理都受四个因素之一的约束

  • 记忆
  • 中央处理器
  • 圆盘
  • 网络
第一步是确定限制因素是什么,然后确定您是否可以影响它(获取更多或减少使用)

组件选择 当您执行超过18个月的操作时,服务器内存会耗尽的原因与处理时间过长有关。这些是异步组件。从源组件输入的每一行都有N字节的内存分配给它。同一个数据桶访问所有转换,应用它们的操作并清空它们在目的地。该内存桶被反复使用

当异步组件进入竞技场时,管道将被分割。传输该行数据的存储桶现在必须清空到新的存储桶中才能完成管道。从执行时间和内存的角度来看,在执行树之间复制数据是一项昂贵的操作(可能会加倍)。这也减少了引擎在等待异步操作完成时并行某些执行机会的机会。从转换的性质来看,操作速度会进一步减慢。聚合是一个完全阻塞的组件,因此所有数据都必须到达并处理转换前的ed将向下游转换释放一行

如果可能的话,您可以将数据透视和/或聚合推送到服务器上吗?这将减少数据流中花费的时间和消耗的资源

您可以尝试增加引擎可以选择的并行操作的数量

如果您确实想知道在数据流中的时间花在哪里,请记录onpipelinerowsent以执行。然后您可以使用它将其拆分(在用sysssislog替换sysdtslog90之后)

网络传输 根据您的图表,这两个框上的CPU或内存似乎都没有被占用。我相信您已经指出源服务器和目标服务器位于一个框上,但SSIS包在另一个框上托管和处理。您是