首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSIS中的合并联接转换和查找转换有什么不同?

SSIS中的合并联接转换和查找转换有什么不同?
EN

Stack Overflow用户
提问于 2011-07-18 23:57:10
回答 7查看 82.6K关注 0票数 39

您好,我是SSIS包的新手,我正在编写一个包,同时阅读有关它们的内容。

我需要将DTS转换为SSIS包,并且需要对来自不同数据库的两个源执行连接,我想知道使用查找或合并连接哪个更好?

从表面上看,它们似乎非常相似。“合并联接”要求事先对数据进行排序,而“查找”不需要这样做。任何建议都会非常有帮助。谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-07-19 04:38:09

屏幕截图#1显示了区分Merge Join transformationLookup transformation的几个要点。

关于查找的

如果您希望根据源1的输入在源2中查找匹配的行,并且您知道每个输入行只有一个匹配,那么我建议使用Lookup操作。举个例子,如果您希望查找表中匹配的Order IdCustomer Number,那么OrderDetails就是更好的选择。

关于合并连接的

如果要执行连接,如从Address表中获取Customer表中给定客户的所有地址(家庭、工作、其他),则必须使用合并连接,因为该客户可以有一个或多个与其关联的地址。

一个要比较的例子:

下面是一个演示Merge JoinLookup之间性能差异的场景。这里使用的数据是一对一连接,这是它们之间唯一要比较的通用场景。

  1. 我有三个表,名为dbo.ItemPriceInfodbo.ItemDiscountInfodbo.ItemAmount。在SQL scripts section.
  2. Tablesdbo.ItemPriceInfodbo.ItemDiscountInfo下提供了这些表的创建脚本,它们都有13,349,729行。这两个表都将ItemNumber作为公共列。ItemPriceInfo有价格信息,ItemDiscountInfo有折扣信息。屏幕截图#2显示了每个表中的行数。屏幕截图#SSIS3显示了前6行,以提供有关表中数据的信息。
  3. I创建了两个SSIS包来比较合并连接和查找转换的性能。这两个包都必须从表dbo.ItemPriceInfodbo.ItemDiscountInfo中获取信息,计算总金额并将其保存到表dbo.ItemAmount.
  4. First包中,该包使用Merge Join转换,内部使用INNER JOIN组合数据。截图#4和#5显示了示例包的执行和执行持续时间。它花费了05分钟,14秒,719毫秒来执行基于合并连接转换的package.
  5. Second包,使用了带全缓存的Lookup转换(这是默认设置)。屏幕截图#6和#7显示了示例包的执行和执行持续时间。执行基于查找转换的包需要11分钟、03秒和610毫秒。您可能会遇到警告消息信息:The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed.这里是一个讨论如何计算查找缓存大小的。在此包执行期间,即使数据流任务完成得更快,管道清理也花费了很多时间。
  6. this 意味着查找转换不好。只是它必须被明智地使用。我在我的项目中经常使用它,但我也不是每天都要处理百万行的10+查询。通常,我的作业处理200万到300万行,因此性能真的很好。高达1,000万行,两者表现相当好。大多数时候,我注意到瓶颈是目标组件,而不是转换。您可以通过拥有多个目的地来克服这一问题。是一个例子,它展示了多个destinations.
  7. Screenshot #8的实现,显示了所有三个表中的记录计数。屏幕截图#9显示每个表中的前6条记录。

希望这能有所帮助。

SQL脚本:

代码语言:javascript
复制
CREATE TABLE [dbo].[ItemAmount](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](30) NOT NULL,
    [Price] [numeric](18, 2) NOT NULL,
    [Discount] [numeric](18, 2) NOT NULL,
    [CalculatedAmount] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemAmount] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ItemDiscountInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](30) NOT NULL,
    [Discount] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemDiscountInfo] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ItemPriceInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](30) NOT NULL,
    [Price] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemPriceInfo] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

截图#1:

截图#2:

截图#3:

截图#4:

截图#5:

截图#6:

截图#7:

截图#8:

截图#9:

票数 93
EN

Stack Overflow用户

发布于 2011-07-19 00:56:06

合并联接旨在产生与SQL中联接的工作方式类似的结果。Lookup组件的工作方式与SQL联接不同。这是一个结果不同的例子。

如果输入1(例如发票)和输入2(例如发票行项目)之间存在一对多关系,则希望这两个输入的组合结果包括单个发票的一行或多行。

使用合并联接,您将获得所需的输出。使用Lookup,其中input 2是查找源,无论input 2中存在多少行,输出都将是每张发票的一行。我不记得数据会来自input 2的哪一行,但我非常确定您至少会收到重复数据警告。

因此,每个组件在SSIS中都有自己的角色。

票数 9
EN

Stack Overflow用户

发布于 2011-08-17 22:47:34

我将提出第三种可供考虑的选择。您的OLE DBSource可以包含查询而不是表,并且您可以在那里进行联接。这并不是在所有情况下都是好的,但是当你可以使用它的时候,你就不必事先排序了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6735733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档