我正在研究一个带有合并加入的SSIS包。
我从两个差异数据库加载,从一个源转换数据并让它流入合并加入任务。
合并加入任务后,我将带有条件拆分的数据拆分为新的,已删除的和现有的记录。
分割后i向下流向插入任务和两个OLE DB命令,它们更新并删除过时并更新已更改的记录。
当Merge Join具有内部联接选项时,只要需要从两个DB加载所有数据,它就会阻塞。
当Merge Join具有完全外连接或左外连接选项时,它不会阻塞,直到从两个DB加载所有数据。
我需要在合并连接任务上使用完全外连接选项,以便在之后将数据拆分为新的和已删除的记录。 如果我使用内连接,我可以只处理现有和更新的数据。
当合并连接没有阻塞时,我在事务中遇到错误,因为当负载仍在处理并且它尝试插入或更新记录时,事务失败。
我的问题是,如果有人可以解释我为什么会这样,合并连接不会阻止外连接,如果有人已经遇到这样的问题以及他是如何解决的?
感谢。
答案 0 :(得分:6)
避免事务阻塞错误的最简单方法是使用输出数据的临时表而不是条件分割。你在这里得到了两全其美:
另外,你是不正确的,内连接和外连接都只是部分“阻塞”即异步,但是当你有一个外连接(特别是当你有一个完整的外连接)时,更多的行被传递给输出缓冲区更快,因为标准限制较少。
想象一下,你有两堆101张卡片,每张卡片上印有各种Breaking Bad绘图孔,按照增加的不确定性和“匹配”卡片的发件箱排序。因为它们是脆弱的小卡片,当你对它们进行分类时,你将它们全部装订在一起并试图移除钉书钉会导致它们无法在地板上散落,就像许多破碎的甲骨文梦一样。
我们还要说,每当你“匹配”10张牌时(或者当你没有剩余的牌进行处理时),就会有一个绿色的小侏儒进来并带走这些牌以便在其他地方进行进一步处理。现在让我们添加一个转折:堆中只有一个匹配,这是最后一张牌(他为什么首先离开Gray Matter?)。
在您处理最后两张牌之前,有多少小绿侏儒会来看你?
更重要的是你的问题,在一个内部连接中,第一个小绿侏儒尽职尽责地等到你完成了一堆之前,然后在其他地方进行了一次低位比赛。有了完整的外部连接,第一个小绿色侏儒在第5次比较之后来了......哦不!事实证明,进一步处理的一部分是他需要改变你堆中的一些牌。 (如果你看起来足够坚硬,总会找到更多的情节洞......)但主食!你告诉他不,有一场混战,指控很紧张,现在你在San Quentin做了3比5,并且有一个人提醒你一点太多的Skinny Pete。
但如果相反你告诉那些小绿侏儒,“把新牌放在那里,我们将在一下之后获得所有这些改变,”一切都变得更加顺畅。
所以使用临时表。没有更多的阻止,更快的更新,问题解决了。好吧,除了那些破碎的阴谋洞。他们会永远持续下去。哦,好吧!