2013-02-25 81 views
0

我有超过百万条记录的表。SSIS OLEDB SQL命令执行缓慢

  1. 当我执行我的SSMS查询约需1:24不到2分钟,确保在任何时间点,并返回60万左右的记录。
  2. 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') 

注:索引做存在在选择SQL查询中的所有列(和where子句中提到的列)。

在SSIS中,

  1. 我有控制流数据流任务。
  2. OleDB Source with SQL query command。
  3. OleDB目的地tbl。

什么可能导致SSIS延迟?

+0

SSIS执行是否与源服务器和目标服务器在同一台计算机上运行,​​或者是通过网络进行的部分操作? – RBarryYoung 2013-02-25 22:55:46

+0

目标服务器正在执行或在网络上,但执行sql需要很长时间(SSIS执行主机与源相同的机器)。 – user1810575 2013-02-25 23:05:57

+0

有什么建议?我不能在这里使用Execute sql任务,因为源和目标服务器/ db是不同的。 – user1810575 2013-02-25 23:34:55

回答

1

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

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

+0

这样做。谢谢!! – user1810575 2013-02-26 15:47:38

1

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

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

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

使用“快速加载”的是一种可能性,但以我的经验,还有另外一个设置是更常见的流水线在网络上的一个问题,那就是“DefaultBufferMaxRows”。默认值为10,000,对于网络连接,我总是发现这种方式太高,在这种情况下,可能应该在100到1000之间。

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