Sql server SSIS包满表加载缓慢

Sql server SSIS包满表加载缓慢,sql-server,performance,ssis,parallel-processing,etl,Sql Server,Performance,Ssis,Parallel Processing,Etl,我们有一个SSIS包,开发团队显然将其称为“慢”。因为他们没有一个使用SSIS ETL的人,所以作为DBA,我尝试深入研究它。以下是我找到的信息: SQL Server于2014年升级至2017年,因此它具有两个版本的SSI 他们将大小为200 GB的SQL Server表加载到SSI中,然后使用命令行压缩功能将数据压缩到平面文件中 数据流任务简单地点击一个select*from视图——该视图只包含没有其他连接的表 在进行故障排除时,我发现在SQL Server上几乎没有任何负载,这可能是因为s

我们有一个SSIS包,开发团队显然将其称为“慢”。因为他们没有一个使用SSIS ETL的人,所以作为DBA,我尝试深入研究它。以下是我找到的信息: SQL Server于2014年升级至2017年,因此它具有两个版本的SSI

  • 他们将大小为200 GB的SQL Server表加载到SSI中,然后使用命令行压缩功能将数据压缩到平面文件中
  • 数据流任务简单地点击一个
    select*from视图
    ——该视图只包含没有其他连接的表
  • 在进行故障排除时,我发现在SQL Server上几乎没有任何负载,这可能是因为select命令在单线程中运行,并且没有使用SQL Server核心
  • 当我运行相同的select*命令时(仅5秒钟,因为它是200 GB表),甚至我的命令也是单线程的
  • 该包有一个SQL作业显示的配置文件(这是包的运行方式),其中包含一些连接设置
  • 在BIDS中打开包时,defaultBufferMaxRows仅显示为10000(可能是默认值)(因为配置文件或任何变量都没有客户值,我猜这也是包所使用的)
  • SQL和SSI都在同一台服务器上。SQL已被分配最大内存,为SSI和操作系统留出约100 GB的空间

    请分享我如何强制SQL Server使用多个线程运行此select命令的想法,以便整个表更快地进入SSIS缓冲池

    编辑:我知道bcp可以比任何进程更快地读取数据并将其保存到平面文件,但此时对SSIS包的更改必须保持最小,并探索可以合并到SSIS包中的选项

    Edit2:在我的SQL Server上,并行性工作得非常好,因为我验证了许多其他查询。所讨论的表是200 GB。这只是SSIS的一部分,它并没有像应该的那样猛烈地打击我的DB

    Edit3:我取得了一些进展,将缓冲区值调整为100 MB,最大行数调整为100000行,现在包似乎做得更好了。当我直接使用dtexec实用程序在服务器上运行这个包时,它每秒生成40-50 MB的良好负载,但通过SQL作业,它从未生成超过10 MB的lod。所以我想弄清楚这种行为

    Edit4:我发现,当我直接从登录到服务器并调用dtexec实用程序运行包时,它运行良好,因为它在数据库上生成了良好的负载,导致数据I\O在30-50 MB\s之间保持稳定。 SQL作业中的相同内容不会超过10 MB\s的I\O

    我甚至尝试使用代理运行包并选择cmdline操作,但没有任何更改。这里的探员真的很烂,有没有关于这里可能有什么问题的指示

    最后尝试: 我终于被我的观察结果难住了: 1) 当通过调用dtexc实用程序从windows节点的命令提示符运行时,相同的包运行速度提高了3倍 2) 当SQL代理(在windows和SQL Server上具有系统管理员权限)调用时,完全相同的包的运行速度比上述速度慢3倍


    在这两种情况下,我都试图查看它们调用的DTEXEC的版本,并且它们都调用相同的版本。因此,我无法理解为什么会这么慢。

    表上的任何索引都可能会减慢加载速度。如果有任何索引,请尝试在加载之前删除它们,然后在加载之后重新创建它们。这还将更新索引统计信息,这将因大容量插入而扭曲。

    您是否看到SQL server也在使用其他内核进行其他查询?如果没有,可能有人使用了以下设置:

    在“服务器配置设置”下检查这些选项:

    • 最大平行度
    • 并行性的成本阈值(服务器配置设置)
    • 处理器是否与CPU密切相关
    另外,MaxDOP查询提示也可能导致这种情况,但您说过视图中没有任何奇特的东西

    另外,您似乎有足够的错误内存,为什么不将defaultBufferMaxRows增加到一个非常大的数字,这样SQLServer就不会在等待缓冲区变空时变慢。请记住,它们使用的是同一个磁盘,它们必须等待对方使用该磁盘,这将导致两者都需要额外的等待时间。SQL server最好使用它,将其放入缓冲区,然后SSIS开始处理并将其写入磁盘

    • DefaultBufferSize:默认值为10MB,最大可能为2^31-1字节
    • DefaultBufferMaxRows:默认值为10000
    • 您可以设置AutoAdjustBufferSize,以便根据DefaultBufferMaxRows自动计算DefaultBufferSize
    请参阅此处的其他性能故障排除方法

    编辑1:可以签出的其他一些属性。以上链接也对这些进行了解释

    • :这定义了一个包可以使用多少线程

    • :数据流引擎可以使用多少线程

    • 还可以尝试在SQL代理使用的同一个代理用户下运行
      dtsexec
      ,以查看此帐户与您的帐户是否得到不同的结果。您可以使用
      runas/user:。。。cmd
      打开该用户下的命令窗口,然后执行
      dtexec

    • 尝试将SQL代理中使用的代理用户更改为新的代理用户,看看是否有帮助。或者尝试在需要访问的目录中授予提升权限

    • 尝试将包保存在文件系统中,并直接从SQL代理通过
      dtexec
      执行,而不是使用
      catalog。开始执行

    • 不是您的情况,而是针对其他读者:如果您有“执行包任务”,请确保要执行的子包通过ExecuteOutOfProcess属性设置为在进程内运行。这只是减少了系统的开销
      into dbo.Destination
      SELECT *
      from openrowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};
      DefaultDir=D:\YourCsv.csv;Extensions=csv;','select * from YourCsv.csv') File;