【发布时间】:2021-02-26 23:21:18
【问题描述】:
在数据流任务中假设我有源、几个转换和目标。
假设有 100 万条记录要按源读取。假设它已达到第 10000 行。读取的行 (10000) 是否会传递给下一个转换,或者后续任务是否会等待前一个任务完全处理这些行?所以只有在读取完所有 100 万个时才运行转换。
【问题讨论】:
标签: ssis
在数据流任务中假设我有源、几个转换和目标。
假设有 100 万条记录要按源读取。假设它已达到第 10000 行。读取的行 (10000) 是否会传递给下一个转换,或者后续任务是否会等待前一个任务完全处理这些行?所以只有在读取完所有 100 万个时才运行转换。
【问题讨论】:
标签: ssis
视情况而定!
快速定义:
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 的机器所花费的时间多长,都会付出代价。
但是,如果您在一家共同基金公司工作,并且有一个交易表记录了您所有股票的价格,那么也许 不要 尝试将这些数据拉回来进行查找转换,当然是假设性的。也许您只需要获得最新的结算价格,所以不要偷懒,不要拉出比您需要的更多的数据和/或让机器崩溃。
【讨论】: