嗨,我是SSIS包的新手,正在编写一个包并同时阅读它们。

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

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

最佳答案

屏幕快照# 1 显示了一些区别Merge Join transformationLookup transformation的点。

关于查找:

如果要基于源1的输入在源2中查找匹配的行,并且如果知道每个输入行都只有一个匹配,则建议使用Lookup操作。一个示例是OrderDetails表,您想找到匹配的Order IdCustomer Number,那么Lookup是一个更好的选择。

关于合并联接:

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

要比较的示例:

这是演示Merge JoinLookup之间的性能差异的方案。此处使用的数据是一对一的联接,这是它们之间要比较的唯一通用方案。

  • 我有三个表,分别称为dbo.ItemPriceInfodbo.ItemDiscountInfodbo.ItemAmount。 SQL脚本部分提供了为这些表创建脚本的信息。
  • dbo.ItemPriceInfodbo.ItemDiscountInfo都具有13,349,729行。两个表都将ItemNumber作为公用列。 ItemPriceInfo具有价格信息,而ItemDiscountInfo具有折扣信息。屏幕快照# 2 显示每个表中的行数。屏幕快照# 3 显示前6行,以了解表中的数据。
  • 我创建了两个SSIS包来比较合并联接和查找转换的性能。这两个软件包都必须从表dbo.ItemPriceInfodbo.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,它讨论如何计算查找缓存大小。在此程序包执行期间,即使数据流任务完成得更快,但管道清理也花费了大量时间。
  • 并不表示查找转换错误。只是必须明智地使用它。我在项目中经常使用它,但我每天也不会处理10+百万行的查询。通常,我的工作处理2到300万行,因此性能非常好。多达1000万行,两者的表现均相当出色。大多数时候,我注意到的瓶颈是目标组件,而不是转换。您可以通过拥有多个目的地来克服这一问题。 Here是显示多个目标的实现的示例。
  • 屏幕快照# 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
    

    截图#1:

    截屏2:

    截图#3:

    截屏4:

    截图#5:

    截图#6:

    截图#7:

    截屏#8:

    截屏#9:

    关于sql-server - SSIS中的合并联接和查找转换之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6735733/

    10-12 12:36
    查看更多