0

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

在此处输入图像描述

我想过使用两个 OLE DB 源和合并连接进行并行提取,但不建议使用它!除此之外还需要更多时间!请问有什么办法可以帮助我吗?

4

2 回答 2

3

使用 all编写T-sql查询总是比使用joins然后使用恕我直言要快。原因是 SSIS 是。它必须将来自不同表的所有数据放入其缓冲区中,然后使用合并连接过滤它,而合并连接是一个异步组件(半阻塞),因此它不能使用相同的输入缓冲区作为其输出.一个新的缓冲区被创建,如果从表中提取了大量的行,您可能会耗尽内存。OLEDB sourcedifferent sourceMerge Joinmemory Oriented architectureN

话虽如此,使用 OLEDB 源可以提高提取性能的方法很少

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

2.检查网络带宽。你不能拥有比你的带宽支持的更快的吞吐量。

3.所有源适配器都是异步的。SSIS 源的速度与查询运行的速度无关。它与检索数据的速度有关。

正如上面其他人所建议的那样,您应该向我们展示查询以及检索数据所花费的时间,否则这些只是一些可以加快提取速度的优化技术

于 2013-05-02T11:43:12.283 回答
1

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

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

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

如果您希望它运行得更好,则需要修复您的查询。它可能会导致您的聚合数据被具体化到临时表中或全部在一个大的 honkin 查询中。

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

于 2013-05-03T04:09:43.133 回答