【问题标题】:Extract data with an OLE DB faster使用 OLE DB 更快地提取数据
【发布时间】:2013-05-02 10:25:05
【问题描述】:

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

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

【问题讨论】:

  • 您需要更清楚地描述您的问题。 500000 个数据(我假设您的意思是记录)通常是一个非常小的数字。几张桌子?尝试用某种表结构和数据提出一个有代表性的问题陈述。然后这个网站上的人将能够以更具体的方式帮助你,否则每一个建议都只是在黑暗中开枪。
  • 目前的表格无法回答您的问题。除了Anoop所说的,还要贴出执行计划。 SSIS 无法以比源系统提供数据的速度更快的速度移动数据。

标签: ssis oledb extract


【解决方案1】:

使用OLEDB source 中的所有joins 编写T-sql 查询总是比使用different source 然后使用Merge Join 恕我直言。原因是 SSIS 是 memory Oriented architecture 。它必须将来自 N 不同表的所有数据带入其缓冲区,然后使用 Merge join 过滤它,而 Merge Join 是一个 asynchronous 组件(半阻塞),因此它不能对其输出使用相同的输入缓冲区。创建一个新缓冲区,如果从表中提取大量行,您可能会耗尽内存。

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

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

2.检查网络带宽。您的吞吐量不能超过您的带宽支持的速度。

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

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

【讨论】:

  • 是的,只选择需要的数据!问题是由于查询需要1个多小时,因为有很多条件和列
  • 因此,您需要向我们展示您的query 以及其他信息,例如execution planssis package design。如果您只是说您的查询需要时间来执行,我们将无法为您提供帮助
  • 我将 ssis 包设计添加到我的问题中,但查询需要 5 页!
  • 前段时间,我的一个客户遇到了这样一种情况,即查询时间很长,过去处理数据大约需要 50 分钟。经过一番努力,我能够将其缩短到 4-5 分钟。如果您使用任何类型的聚合(总和、最小值、最大值等),请查看是否可以有一个单独的表来存储它们并将它们连接到主查询。你用的cte太多了吗?也许将它们放在具有适当索引的临时表中。您可以将这些临时文件的一部分作为单独的任务并行执行,然后通过查询这些表将它们粘合在一起吗?
  • 正如 Praveen 所说:我强烈建议您只在源代码中编写一个 SQL 查询,而不是尝试在 SSIS 中构建一个 SQL 查询。它可能会快很多。但如果您需要帮助,则需要发布更多信息。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 非常感谢,它很有帮助!实际上,异步组件用于消除重复行我找到了另一种使用 Lookup 和 sql 查询 blog.homsys.com/trucs-astuces/la-gestion-des-doublons-avec-ssis 的方法,但它不起作用,因为我需要从使用 OLE DB SRC 而不是从我的数据库中提取的数据中进行选择!有什么可以帮助我的吗?
  • @unknown 您从asynchronous components are used to eliminate duplicate rows 那里得到这些信息的?如果您将其发布为引用您的要求以及您尝试过什么的新问题会更好
  • 我的意思是组件(MLT、AGG、SRT、MRJ)用于消除它们!它确实有效
  • @praveen 她是我的新问题的链接stackoverflow.com/questions/16357336/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多