SSIS OLEDB SQL命令执行很慢

时间:2013-02-25 22:48:23

标签: ssis

我有超过百万条记录的表格。

  1. 当我在SSMS中执行我的查询时,在任何时间点确实需要大约1:24不到2分钟,并且返回大约600,000条记录。
  2. SSIS需要花费超过几个小时的时间才能将其导出一次。
  3. 以下是示例sql:

    SELECT distinct 
    A.Col1, A.Col2, A.Col3, A.Col4, A.Col5, A.Col6, A.Col7, B.Col3
    FROM tblA  A
    inner join tblB B on A.Col1 = B.col1 and 
    A.Col2 = 'AB' AND A.Col3 Not In ('A','B','C') AND 
    A.Col3 In ('FPC','FPE','PRN','SUB','RVW','FPO','FEV','PRM')
    

    注意:select sql查询中的所有列(以及where子句中提到的列)都存在索引。

    在SSIS中,

    1. 我在控制流上有数据流任务。
    2. 带有SQL查询命令的OleDB源。
    3. OleDB Destination tbl。
    4. 可能导致SSIS延迟的原因是什么?

2 个答案:

答案 0 :(得分:1)

您的问题很可能是您的OLE DB目标及其可以接受行的速率。您可以通过测试包的副本并删除OLE DB目的地来确认这一点。

假设是这种情况,最常见的原因是在OLE DB目标传递给SQL Server时没有使用“快速加载”选项。

答案 1 :(得分:1)

根据我的经验,这可能是以下两件事之一:

  1. 这可能是所谓的参数嗅探。这仅仅意味着有时它会将错误(慢)查询计划绑定到查询+参数,并且由于缓存,这个错误的计划可能会“卡住”并不断重复用于特定应用程序或使用。检测此问题的方法是使用SQL事件探查器捕获SSIS任务查询的查询计划,然后将其与快速执行的SSMS版本的查询计划进行比较。如果查询计划明显不同,那么您可能会遇到参数嗅探问题。

  2. 然而,对于SSIS,有一个更常见的问题(我的评论/问题和Mike Honey的回答提到):因为SSIS使用管道架构,所以你需要的只是链中的一个缓慢的组件来停止整个管道。导致组件速度缓慢的一个常见原因是没有使用数据流任务的最佳任务设置。

  3. 使用“快速加载”是一种可能性,但根据我的经验,还有另一种设置通常是网络流水线操作的问题,即“DefaultBufferMaxRows”。这个默认值是10,000,我总是发现网络连接太高了,对于这些情况应该在100到1000之间。

    这是控制流中目标DFT(数据流任务)的属性,因此要更改它,只需在控制流视图中选择该任务的图标。您应该在属性窗格中看到DefaultBufferMaxRows(在“Misc”下面)。您可能还希望按比例降低“DefaultBufferSize”。