【问题标题】:Is the flow of data inside the data flow tasks synchronous?数据流任务内部的数据流是否同步?
【发布时间】:2021-02-26 23:21:18
【问题描述】:

在数据流任务中假设我有源、几个转换和目标。

假设有 100 万条记录要按源读取。假设它已达到第 10000 行。读取的行 (10000) 是否会传递给下一个转换,或者后续任务是否会等待前一个任务完全处理这些行?所以只有在读取完所有 100 万个时才运行转换。

【问题讨论】:

    标签: ssis


    【解决方案1】:

    视情况而定!

    快速定义:

    • 同步:一排输入,一排输出。输入血统 id 与输出血统 id 相同
    • 异步:N 行输入,M 行输出。
    • 异步、完全阻塞:所有数据必须在新数据离开之前到达
    • 异步,部分阻塞:必须有足够的数据到达,新数据才能离开

    全部同步

    OLE DB Source -> Derived Column -> OLE DB Destination
    

    所有同步组件。 1M 源行,10k 行从源流到列再到目标。泡沫-冲洗-重复

    异步,完全阻塞

    OLE DB Source -> 
                     Aggregate -> OLE DB Destination
    

    Aggregate 是一个异步、完全阻塞的组件。 1M 源行,10k 行从源流到聚合(假设我们得到按销售 ID 分组的最大销售额)。它计算它所拥有的 10k 的最大数量,但它不能在下游释放它们,因为 10k+1 行可能有一个更大的值,所以它保存并存储这些值,直到它从源接收到缓冲区结束信号。

    只有这样,聚合组件才能将结果发布给下游的数据消费者。

    我显示聚合与源不“一致”,因为在数据流的这一点上,之前的数据和之后的数据之间存在裂痕。如果它是 Source -> Derived column -> Aggregate,则 Derived 组件将在与 Source 相同的内存地址(yay 指针)上工作。异步组件将数据在内存中复制到单独的内存空间中。因此,不能为您的数据流分配 1GB,它必须在前半部分花费 0.5GB,在后半部分花费 0.5。

    如果您将异步组件中的列重命名为“上游”,您可以知道数据沿袭中的“中断”在哪里,因为在您修改源之间的所有异步组件之前,该列将无法用于最终目标到目的地。

    异步,部分阻塞

    OLE Source DB 1 -->
                        Merge Join -> OLE DB Destination
    OLE Source DB 2 -->
    

    合并连接是一个异步的、部分阻塞的组件。您通常可以告诉部分阻塞的组件,因为它们需要排序输入。对于聚合,我们必须拥有 所有 数据,然后才能说 this 是最大值。使用合并连接,因为我们知道两个流都是按键排序的,所以一旦匹配键不匹配,我们就可以释放。假设我在 INNER JOIN 配置中进行了合并。如果我有来自 db1 提要的值为 A,B,C 和来自 db2 的 A,C 的行。当A 匹配A 时,我们会将行释放到目的地。用尽As,去下一个。源 1 提供 B,源 2 提供 C。它们不匹配,因此B 被丢弃并检索下一个 Source 1。 C 匹配,因此继续。

    这取决于(再​​次)

    OLE DB Source -> Script Component -> OLE DB Destination
    OLE DB Source -> 
                     Script Component -> OLE DB Destination
    

    脚本组件按照您定义的方式运行。默认是同步的,但你可以让它异步。

    Jorg 有一个很好的表格,可以将组件标记到各个存储桶中:https://jorgklein.com/2008/02/28/ssis-non-blocking-semi-blocking-and-fully-blocking-components/comment-page-2/

    评论问“查找转换怎么样?”

    正如引用的文章所示,查找位于同步列中。但是,如果要查找性能瓶颈(我通常首先查找异步组件),我们经常会指出,默认查找会在 PreExecute 阶段缓存表中的所有数据。如果您的参考表有 10、100、1000000 行,谁在乎。无论运行 SELECT * FROM MyTable 并将其从数据库源流式传输到运行 SSIS 的机器所花费的时间多长,都会付出代价。

    但是,如果您在一家共同基金公司工作,并且有一个交易表记录了您所有股票的价格,那么也许 不要 尝试将这些数据拉回来进行查找转换,当然是假设性的。也许您只需要获得最新的结算价格,所以不要偷懒,不要拉出比您需要的更多的数据和/或让机器崩溃。

    【讨论】:

    • 请问查找转换怎么样?
    • @variable 它取决于您为查找转换选择的缓存选项。 simplebiinsights.com/…
    • 我不同意@SandraGuilepZouaouiZandeh 你的结论。查找任务始终是同步的。一排进一排(无论是匹配、不匹配还是错误路径)。在查找之前从数据流中添加/删除的新列将在数据流中传播,而无需对查找进行调整。缓存选项(完整、部分、无)与同步性无关。缓存会影响匹配规则(.NET 与数据库默认值)、匹配数据的可变性和性能,但最终,它仍然是一个同步数据流组件 - 正如您链接的文章所指出的那样。
    • @billinkc 我对在链接中找到的表格感到困惑
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多