您好,我是SSIS包的新手,我正在编写一个包,同时阅读有关它们的内容。
我需要将DTS转换为SSIS包,并且需要对来自不同数据库的两个源执行连接,我想知道使用查找或合并连接哪个更好?
从表面上看,它们似乎非常相似。“合并联接”要求事先对数据进行排序,而“查找”不需要这样做。任何建议都会非常有帮助。谢谢。
发布于 2011-07-19 04:38:09
屏幕截图#1显示了区分Merge Join transformation和Lookup transformation的几个要点。
关于查找的:
如果您希望根据源1的输入在源2中查找匹配的行,并且您知道每个输入行只有一个匹配,那么我建议使用Lookup操作。举个例子,如果您希望查找表中匹配的Order Id和Customer Number,那么OrderDetails就是更好的选择。
关于合并连接的:
如果要执行连接,如从Address表中获取Customer表中给定客户的所有地址(家庭、工作、其他),则必须使用合并连接,因为该客户可以有一个或多个与其关联的地址。
一个要比较的例子:
下面是一个演示Merge Join和Lookup之间性能差异的场景。这里使用的数据是一对一连接,这是它们之间唯一要比较的通用场景。
dbo.ItemPriceInfo,dbo.ItemDiscountInfo和dbo.ItemAmount。在SQL scripts section.dbo.ItemPriceInfo和dbo.ItemDiscountInfo下提供了这些表的创建脚本,它们都有13,349,729行。这两个表都将ItemNumber作为公共列。ItemPriceInfo有价格信息,ItemDiscountInfo有折扣信息。屏幕截图#2显示了每个表中的行数。屏幕截图#SSIS3显示了前6行,以提供有关表中数据的信息。dbo.ItemPriceInfo和dbo.ItemDiscountInfo中获取信息,计算总金额并将其保存到表dbo.ItemAmount.Merge Join转换,内部使用INNER JOIN组合数据。截图#4和#5显示了示例包的执行和执行持续时间。它花费了05分钟,14秒,719毫秒来执行基于合并连接转换的package.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.这里是一个讨论如何计算查找缓存大小的。在此包执行期间,即使数据流任务完成得更快,管道清理也花费了很多时间。希望这能有所帮助。
SQL脚本:
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:

发布于 2011-07-19 00:56:06
合并联接旨在产生与SQL中联接的工作方式类似的结果。Lookup组件的工作方式与SQL联接不同。这是一个结果不同的例子。
如果输入1(例如发票)和输入2(例如发票行项目)之间存在一对多关系,则希望这两个输入的组合结果包括单个发票的一行或多行。
使用合并联接,您将获得所需的输出。使用Lookup,其中input 2是查找源,无论input 2中存在多少行,输出都将是每张发票的一行。我不记得数据会来自input 2的哪一行,但我非常确定您至少会收到重复数据警告。
因此,每个组件在SSIS中都有自己的角色。
发布于 2011-08-17 22:47:34
我将提出第三种可供考虑的选择。您的OLE DBSource可以包含查询而不是表,并且您可以在那里进行联接。这并不是在所有情况下都是好的,但是当你可以使用它的时候,你就不必事先排序了。
https://stackoverflow.com/questions/6735733
复制相似问题