我正在开发一个带有 Merge Join 的 SSIS 包。
我从两个不同的数据库加载,从一个源转换数据并让它流入合并连接任务。
在合并连接任务之后,我将有条件拆分的数据拆分为新的、已删除的和现有的记录。
在拆分之后,我流向了一个插入任务和两个 OLE DB 命令,它们更新和删除过时的并更新更改的记录。
当 Merge Join 有选项 inner join 时,只要它需要从两个 DB 加载所有数据,它就会阻塞。
当 Merge Join 具有选项完全外连接或左外连接时,它不会阻塞,直到从两个数据库加载所有数据。
我需要合并连接任务上的完整外部连接选项,以便之后将数据拆分为新记录和删除记录。
如果我使用内部连接,我可以只处理现有和更新的数据。
当合并连接没有阻塞时,我在事务中收到错误,因为当负载仍在处理中并且它尝试插入或更新记录时,事务失败。
我的问题是,如果有人可以解释我为什么会这样,合并连接不会阻止外部连接,如果有人已经遇到过这样的问题以及他是如何解决的?
谢谢。
最佳答案
避免事务阻塞错误的最简单方法是为输出数据使用临时表,而不是条件拆分。您可以在这里两全其美:
另外,你错了,内连接和外连接都只是部分“阻塞”,即异步,但是当你有一个外连接时(特别是当你有一个完整的外连接时)更多的行被传递到输出缓冲区很快,因为标准限制较少。
想象一下,你有两堆 101 张卡片,每张卡片上都印有各种《绝命毒师》的情节孔,按照增加的怀疑程度排序,还有一个用于“匹配”卡片的发件箱。因为它们是脆弱的小卡片,所以当你对它们进行分类时,你将它们全部钉在一起,试图移除钉书钉会使它们像许多 splinter 的冰毒主销梦一样无用地散落在地板上。
还假设每次您“匹配” 10 张牌时(或者当您没有剩余的牌要处理时),一个绿色的小侏儒会进来并将这些牌取出以在其他地方进一步处理。现在让我们添加一个转折点:牌堆中只有一个匹配,而且是最后一张牌(为什么他一开始就离开了灰质?)。
在你处理最后两张牌之前的那一刻,有多少绿色小侏儒会来看你?
对你的问题更重要的是,在内部连接中,第一个绿色小侏儒会尽职尽责地等到你完成了堆,然后再将他的低匹配项带到其他地方。在完全外连接的情况下,第一个绿色小侏儒出现在第 5 次比较之后……哦,不!事实证明,进一步处理的一部分是他需要更换你牌堆中的一些牌。 (如果你足够努力的话,总会有更多的情节漏洞......)但是订书钉!你告诉他不,有一场混战,指控被提出,现在你在 San Quentin 和一个让你有点太像 Skinny Pete 的人做 3 比 5。
但是如果你告诉绿色小侏儒,“把新牌放在那里,稍后我们会一举搞定所有这些变化”,一切都会顺利得多。
所以使用临时表。不再阻塞,更新更快,问题解决。好吧,除了那些绝命毒师的情节漏洞。他们将永远持续下去。那好吧!
关于sql-server - 带有选项完全外部联接的 SSIS 合并联接任务未阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311562/