SSIS OLEDB SQL命令执行缓慢

SSIS OLEDB SQL命令执行缓慢,ssis,Ssis,我有一张有超过百万条记录的桌子 当我在SSMS中执行我的查询时,在任何时间点都需要大约1:24的时间,肯定不到2分钟,并返回大约600000条记录 SSIS需要几个多小时,事实上我只能导出一次 以下是示例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 =

我有一张有超过百万条记录的桌子

  • 当我在SSMS中执行我的查询时,在任何时间点都需要大约1:24的时间,肯定不到2分钟,并返回大约600000条记录
  • SSIS需要几个多小时,事实上我只能导出一次
  • 以下是示例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')
    
    注意:SELECTSQL查询中的所有列(以及where子句中提到的列)都存在索引

    在SSIS中

  • 我在控制流上有数据流任务
  • 带有SQL查询命令的OleDB源代码
  • OleDB目的地tbl

  • 什么可能导致SSI延迟?

    您的问题很可能与OLE DB目标及其接受行的速率有关。您可以通过在删除OLE DB目标的情况下测试包的副本来确认这一点


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

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

  • 这可能就是所谓的参数嗅探。这仅仅意味着,有时它会将一个糟糕(缓慢)的查询计划绑定到query+参数,并且由于缓存,这个糟糕的计划可能会被“卡住”,并不断地重新用于特定的应用程序或用途。检测这种情况的方法是使用SQL探查器捕获SSIS任务查询的查询计划,然后将其与快速执行SSMS版本的查询计划进行比较。如果查询计划明显不同,则可能存在参数嗅探问题

  • 但是,对于SSI,有一个更常见的问题(我的评论/问题和Mike Honey的回答中都提到了):因为SSI使用管道体系结构,所以您只需要链中一个缓慢的组件来暂停整个管道。组件速度慢的一个常见原因是没有为数据流任务使用最佳任务设置

  • 使用“快速加载”是一种可能性,但根据我的经验,另一种设置更常见于网络上的管道问题,即“DefaultBufferMaxRows”。默认值为10000,我总是发现对于网络连接来说,这个值太高了,在这些情况下应该在100到1000之间


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

    SSIS执行主机与源服务器和目标服务器是同一台机器,还是部分通过网络?目标服务器是通过网络还是在网络上运行,但执行sql需要很长时间(SSIS执行主机与源服务器是同一台机器).有什么建议吗??我不能在这里使用执行sql任务,因为源服务器和目标服务器/db不同。如何配置OLE db目标?表访问模式设置为什么?