嗨,我是SSIS包的新手,正在编写一个包并同时阅读它们。
我需要将DTS转换为SSIS包,并且需要对来自不同数据库的两个源执行联接,并且想知道使用查找或合并联接的更好方法是什么?
从表面上看,它们看起来非常相似。 “合并联接”要求事先对数据进行排序,而“查找”则不需要。任何建议都将非常有帮助。谢谢。
最佳答案
屏幕快照# 1 显示了一些区别Merge Join transformation
和Lookup transformation
的点。
关于查找:
如果要基于源1的输入在源2中查找匹配的行,并且如果知道每个输入行都只有一个匹配,则建议使用Lookup操作。一个示例是OrderDetails
表,您想找到匹配的Order Id
和Customer Number
,那么Lookup是一个更好的选择。
关于合并联接:
如果要执行联接,例如从Address
表中的给定客户的Customer
表中获取所有地址(家庭,工作,其他),则必须使用合并联接,因为该客户可以具有一个或多个与之关联的地址。
要比较的示例:
这是演示Merge Join
和Lookup
之间的性能差异的方案。此处使用的数据是一对一的联接,这是它们之间要比较的唯一通用方案。
dbo.ItemPriceInfo
,dbo.ItemDiscountInfo
和dbo.ItemAmount
。 SQL脚本部分提供了为这些表创建脚本的信息。 dbo.ItemPriceInfo
和dbo.ItemDiscountInfo
都具有13,349,729行。两个表都将ItemNumber作为公用列。 ItemPriceInfo具有价格信息,而ItemDiscountInfo具有折扣信息。屏幕快照# 2 显示每个表中的行数。屏幕快照# 3 显示前6行,以了解表中的数据。 dbo.ItemPriceInfo
和dbo.ItemDiscountInfo
中获取信息,计算总量并将其保存到表dbo.ItemAmount
中。 Merge Join
转换,在内部使用INNER JOIN合并数据。屏幕截图# 4 和# 5 显示示例包执行和执行持续时间。 05
分钟 14
秒 719
毫秒花费了执行基于合并联接转换的程序包。 Lookup
转换与完整高速缓存一起使用(这是默认设置)。 creenshots# 6 和# 7 显示示例包执行和执行持续时间。 11
分钟 03
秒 610
毫秒花费了执行基于Lookup转换的程序包。您可能会遇到警告消息信息:The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed.
这是一个link,它讨论如何计算查找缓存大小。在此程序包执行期间,即使数据流任务完成得更快,但管道清理也花费了大量时间。 希望能有所帮助。
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:
关于sql-server - SSIS中的合并联接和查找转换之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6735733/