【问题标题】:How does OLE DB Source storage records in memory? (SSIS)OLE DB Source 如何在内存中存储记录? (SSIS)
【发布时间】:2017-07-04 17:47:49
【问题描述】:

我的 Sql Server 集成服务包中有一个 OLE DB 源。然后,我还有一个连接到 Source 的 Script 组件。

OLE DB 源从获取 500.000 条记录的 SQL 查询中访问数据。我想知道当程序包开始运行时,应用程序是否开始将所有记录存储在内存中(500.000),或者 cicle 中的程序包存储记录是否像 5.000 条记录......

它是如何工作的?我可以配置这个吗?

【问题讨论】:

  • 不,它不会缓冲内存中的所有行,而是缓冲一些较小的量。是的,您可以配置多少,但您不应该,至少在不了解您的数据流和您可以转动的其他旋钮的情况下不应该这样做。请参阅performance tuning whitepaper
  • 好吧,在 Jeroen Mostert 回答我之前,我不知道 Default Buffer Max Size 和 Default Buffer Size... 有不同的问题

标签: c# .net ssis


【解决方案1】:

如果您有异步/阻塞组件(排序/聚合),您的包可能会尝试将所有 500.000 行缓冲到内存中,因为在每一行都从来源并已到达该组件。只有这样,SSIS 才能确定 X 列的最大值或所有行都已按键 Y 排序。

如果您的机器内存不足,那么您将记录一个缓冲区溢出到磁盘的事件(近似名称)。这意味着您的高性能内存 ETL 引擎现在已经开始将数据写入磁盘。此时性能将受到很大影响,因为所有数据都写入磁盘以便您可以通过该阻塞组件,您猜怎么着?既然必须发生的任何计算都已经发生,那么必须从磁盘读回写入的数据。而且,如果您碰巧在数据流中对我的数据进行排序,然后是聚合数据,那么您只会为双倍糟糕的性能付出代价。

也就是说,如果您只使用同步组件,则数据流中内置了一些机制来检测背压。因此,您的目标目的地无法跟上源流,它将向该组件发出信号以发送更少的记录,直到它赶上为止。非常聪明的东西,但作为开发人员,除了不添加 asynchronous components 之外,没有什么能真正影响到你,除非解决方案需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多