使用OLE DB更快地提取数据

时间:2013-05-02 10:25:05

标签: ssis oledb extract

大家好,我正在尝试使用SSIS(OLE DB SOURCE)从很多连接表和视图中提取大量记录,但这需要很长时间!问题是由于查询,因为当我在sql server上解析它需要超过一小时!她是我的ssis包装设计

enter image description here

我想到了使用两个OLE DB源和合并连接的并行提取,但不建议使用它!除了需要更多时间!有什么办法可以帮我吗?

2 个答案:

答案 0 :(得分:3)

使用T-sql中的所有joins撰写OLEDB source查询总是比使用different source然后使用Merge Join恕我直言更快。原因是SSIS是memory Oriented architecture。它必须将来自N个不同表的所有数据放入其缓冲区中,然后使用Merge连接过滤它,并且更多的合并连接是一个asynchronous组件(因此,它不能使用相同的输入缓冲区来输出。如果从表中提取了大量行,则会创建一个新的缓冲区并且可能会耗尽内存。

已经说过使用OLEDB源提高提取性能的方法很少

1.调整SQL查询。避免使用Select *

2.检查网络带宽。您的吞吐量不会高于带宽支持。

3.所有源适配器都是异步的。The speed of an SSIS Source is not about how fast your query runs。它是关于检索数据的速度。

正如其他人在上面所建议的,您应该向我们展示查询以及退出数据所花费的时间,否则这些只是很少的优化技术可以提取更快

答案 1 :(得分:1)

感谢您发布数据流的屏幕截图。我怀疑你遇到的缓慢是否真的是OLE DB Source组件的错误。

相反,您有3个异步组件导致数据流的2个完整块和部分阻塞的组件(AGG,SRT,MRJ)。第一个聚合必须等待所有500k行到达才能完成聚合,然后将其传递给排序。

这些转换也会导致内存碎片化。通常,内存缓冲区充满数据并访问数据流中的每个组件。任何更改都直接发生在该地址空间,如果引擎可以确定第2步正在修改字段X而第3步正在修改Y,则引擎可以并行化操作。async components将导致数据从一个空间复制到另一个空间。这是双减速。第一种是将数据从地址空间0x01复制到0xFA等物理行为。第二是它减少了dtexec进程的可用内存量。 SSIS不再可以播放所有N个内存。相反,你将把你的内存分开,在每次异步完成后,内存分区就在那里,直到数据流完成。

如果您希望此次运行更好,则需要修复查询。这可能会导致您的聚合数据被实现到临时表中,或者在一个大的honkin'查询中实现。

打开一个新问题,深入了解数据结构,索引,数据量,查询本身,最好是查询计划 - 估计或实际。如果你需要帮助来识别这些东西,这里有很多有用的人可以帮助你完成整个过程。