SSIS合并加入任务与选项完全外部加入不阻止

ok3*_*0b1 2 sql-server ssis

我正在研究一个带有合并加入的SSIS包.

我从两个差异DB加载,从一个源转换数据,让它流入合并加入任务.

在合并连接任务之后,我将带有条件拆分的数据拆分为新的,已删除的和现有的记录.

在Split i之后向下流向插入任务和两个OLE DB命令,它们更新并删除过时并更新已更改的记录.

当Merge Join具有内部联接选项时,只要需要从两个DB加载所有数据,它就会阻塞.

当Merge Join具有选项全外连接或左外连接时,它不会阻塞,直到从两个DB加载所有数据.

我需要在合并连接任务上使用完全外连接选项,以便在之后将数据拆分为新的和已删除的记录.如果我使用内部联接,我可以只处理现有和更新的数据.

当合并连接未阻塞时,我在事务中收到错误,因为当加载仍在处理并且它尝试插入或更新记录时,事务失败.

我的问题是,如果有人能解释我为什么会这样,那么合并连接不会阻止外连接,如果有人已经遇到这样的问题以及他是如何解决的?

谢谢.

Kyl*_*ale 6

避免事务阻塞错误的最简单方法是使用输出数据的临时表而不是条件分割.你在这里得到了两全其美:

  • 最大同步数据通过合并连接流入临时表
  • 避免那些讨厌的逐个OLE DB命令,而是用一个很好的批处理UPDATE JOIN/DELETE JOIN语句替换它们将您的临时表连接回源.

此外,你是不正确的,内连接和外连接只是部分"阻塞"即异步,但是当你有一个外连接(特别是当你有一个完整的外连接)时,更多的行传递给输出缓冲区更多很快,因为标准限制较少.

想象一下,你有两堆101张卡片,每张卡片上印有各种Breaking Bad绘图孔,按照增加的不确定性和"匹配"卡片的发件箱排序.因为它们是脆弱的小卡片,当你对它们进行分类时,你将它们整理在一起并试图去除钉书钉会导致它们在地板上无用地分散,就像许多破碎的甲骨文梦想一样.

我们还要说的是,每当你"匹配"10张牌时(或当你没有剩余的牌进行处理时),就会有一个绿色的小侏儒进来,然后将这些牌带出去在其他地方进行进一步处理.现在让我们添加一个转折:堆中只有一个匹配,这是最后一张牌(他为什么首先离开Gray Matter?).

在你处理最后两张牌之前,有多少小绿侏儒会来看你?

  • 内部加入 - 0.还没有比赛!
  • 左外连接 - 10.堆A中的所有其他卡都继续(100),因此您已经处理了10组10张卡.
  • 完全外联 - 20.堆A和堆B(200)的所有其他卡都继续运行.这是20套10张牌.

更重要的是你的问题,在一个内部联接中,第一个小绿侏儒尽职尽责地等到你完成了一堆之前,然后在其他地方进行一次低位比赛.有了完整的外部连接,第一个小绿色侏儒在第5次比较之后来了......哦不!事实证明,进一步处理的一部分是他需要改变你堆中的一些牌.(如果你看起来足够坚硬,总会找到更多的情节洞......)但主食!你告诉他不,有一场混战,指控很紧张,现在你在San Quentin做了3比5,并且有一个让你想起Skinny Pete太多的人.

但是,如果相反你告诉那些小绿侏儒,"把新牌放在那里,我们将在以后一举得到所有这些变化,"一切都变得更顺畅.

所以使用临时表.没有更多的阻止,更快的更新,问题解决了.好吧,除了那些破碎的阴谋洞.他们会永远持续下去.那好吧!