嗨,我是SSIS包的新手,写了一个包并同时阅读它们.
我需要将DTS转换为SSIS包,我需要在不同数据库的两个源上执行连接,并且想知道什么是更好的apporach,使用查找或合并连接?
表面上看起来非常相似."合并连接"要求数据先进行排序,而"查找"则不需要这样.任何建议都会非常有帮助.谢谢.
小智 83
屏幕截图#1显示了几点Merge Join transformation和之间的区别Lookup transformation.
关于查找:
如果你想根据源1输入找到源2中匹配的行,如果你知道每个输入行只有一个匹配,那么我建议使用Lookup操作.一个例子是,你OrderDetails的表,你想找到匹配的Order Id和Customer Number,然后查找是一个更好的选择.
关于合并加入:
如果要执行连接,例如从Address表中为表中的给定Customer 提取所有地址(Home,Work,Other)Customer,则必须使用Merge Join,因为客户可以拥有一个或多个与之关联的地址.
比较的一个例子:
这是一个演示Merge Join和之间性能差异的场景Lookup.这里使用的数据是一对一连接,这是它们之间唯一需要比较的方案.
我有三个名为的表dbo.ItemPriceInfo,dbo.ItemDiscountInfo和dbo.ItemAmount.SQL脚本部分提供了为这些表创建脚本的功能.
表格dbo.ItemPriceInfo和dbo.ItemDiscountInfo两者都有13,349,729行.两个表都将ItemNumber作为公共列.ItemPriceInfo具有价格信息,ItemDiscountInfo具有折扣信息.屏幕截图#2显示了每个表中的行数.屏幕截图#3显示了前6行,以便了解表中存在的数据.
我创建了两个SSIS包来比较Merge Join和Lookup转换的性能.这两个包都必须从表中获取信息,dbo.ItemPriceInfo并dbo.ItemDiscountInfo计算总量并将其保存到表中dbo.ItemAmount.
第一个包使用Merge Join转换,内部使用INNER JOIN来组合数据.屏幕截图#4和#5显示了示例包执行和执行持续时间.过了05几分钟14秒719毫秒执行合并联接转换基于包.
第二个包使用Lookup完全缓存转换(这是默认设置).creenshots#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.这是一个链接,讨论如何计算查找缓存大小.在此程序包执行期间,即使数据流任务完成得更快,管道清理也需要花费大量时间.
这并不意味着Lookup转换很糟糕.它只是必须明智地使用它.我经常在我的项目中使用它,但是我每天都不会处理超过10万行的查询.通常,我的作业处理2到3百万行,为此表现非常好.多达1000万行,两者表现同样出色.大多数时候我注意到的是瓶颈原来是目标组件而不是转换.您可以通过拥有多个目的地来克服这一点 以下示例显示了多个目标的实现.
屏幕截图#8显示了所有三个表中的记录计数.屏幕截图#9显示了每个表中的前6个记录.
希望有所帮助.
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
Run Code Online (Sandbox Code Playgroud)
截图#1:

截图#2:

截图#3:

截图#4:

截图#5:

截图#6:

截图#7:

截图#8:

截图#9:

Merge Join旨在生成类似于JOIN在SQL中的工作方式的结果.Lookup组件不像SQL JOIN那样工作.这是一个结果不同的例子.
如果输入1(例如,发票)和输入2(例如,发票行项目)之间存在一对多关系,则您希望这两个输入的组合结果包含单个发票的一行或多行.
使用合并连接,您将获得所需的输出.使用Lookup,其中输入2是查找源,输出将是每个发票一行,无论输入2中存在多少行.我不记得输入2中哪一行数据会来,但我'我相信你至少会得到重复数据警告.
因此,每个组件在SSIS中都有自己的作用.
| 归档时间: |
|
| 查看次数: |
69778 次 |
| 最近记录: |