sql-server - 带有选项完全外部联接的 SSIS 合并联接任务未阻塞

标签 sql-server ssis

我正在开发一个带有 Merge Join 的 SSIS 包。

我从两个不同的数据库加载,从一个源转换数据并让它流入合并连接任务。

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

在拆分之后,我流向了一个插入任务和两个 OLE DB 命令,它们更新和删除过时的并更新更改的记录。

当 Merge Join 有选项 inner join 时,只要它需要从两个 DB 加载所有数据,它就会阻塞。

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

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

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

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

谢谢。

最佳答案

避免事务阻塞错误的最简单方法是为输出数据使用临时表,而不是条件拆分。您可以在这里两全其美:

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

  • 另外,你错了,内连接和外连接都只是部分“阻塞”,即异步,但是当你有一个外连接时(特别是当你有一个完整的外连接时)更多的行被传递到输出缓冲区很快,因为标准限制较少。

    想象一下,你有两堆 101 张卡片,每张卡片上都印有各种《绝命毒师》的情节孔,按照增加的怀疑程度排序,还有一个用于“匹配”卡片的发件箱。因为它们是脆弱的小卡片,所以当你对它们进行分类时,你将它们全部钉在一起,试图移除钉书钉会使它们像许多 splinter 的冰毒主销梦一样无用地散落在地板上。

    还假设每次您“匹配” 10 张牌时(或者当您没有剩余的牌要处理时),一个绿色的小侏儒会进来并将这些牌取出以在其他地方进一步处理。现在让我们添加一个转折点:牌堆中只有一个匹配,而且是最后一张牌(为什么他一开始就离开了灰质?)。

    在你处理最后两张牌之前的那一刻,有多少绿色小侏儒会来看你?
  • 内连接 - 0 .还没有比赛!
  • 左外连接 - 10 . A 堆中的所有其他牌都继续(100),所以你已经处理了 10 组 10 张牌。
  • 完全外连接 - 20 . A堆和B堆的所有其他牌(200)继续。那是20组10张卡片。

  • 对你的问题更重要的是,在内部连接中,第一个绿色小侏儒会尽职尽责地等到你完成了堆,然后再将他的低匹配项带到其他地方。在完全外连接的情况下,第一个绿色小侏儒出现在第 5 次比较之后……哦,不!事实证明,进一步处理的一部分是他需要更换你牌堆中的一些牌。 (如果你足够努力的话,总会有更多的情节漏洞......)但是订书钉!你告诉他不,有一场混战,指控被提出,现在你在 San Quentin 和一个让你有点太像 Skinny Pete 的人做 3 比 5。

    但是如果你告诉绿色小侏儒,“把新牌放在那里,稍后我们会一举搞定所有这些变化”,一切都会顺利得多。

    所以使用临时表。不再阻塞,更新更快,问题解决。好吧,除了那些绝命毒师的情节漏洞。他们将永远持续下去。那好吧!

    关于sql-server - 带有选项完全外部联接的 SSIS 合并联接任务未阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311562/

    相关文章:

    c# - Microsoft Visual Studio - 无法在 SSIS 包中打开脚本任务

    php - 如何使用xampp将sql server与php连接起来?

    sql-server - sp_who2 中的状态 "Suspended"和高 DiskIO 意味着什么?

    sql-server - 使用 SSIS 从一个表复制到另一个表时忽略具有空字段的记录

    ssis - 从 SSIS 脚本任务/脚本组件返回输出参数或变量

    c# - 在 .Net 5 应用程序中运行 SSIS

    c# - SSIS 包 - 以编程方式配置格式版本

    sql-server - SSAS DB 在 Management Studio 中不可见,但可以在 Excel 中看到

    sql-server - 将字符串拆分为行的最有效方法

    sql-server - 以 x 作为参数声明 VARCHAR(x)?