Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quelles sont les différences entre les transformations Merge Join et Lookup dans SSIS ?

Capture d'écran #1 montre quelques points pour distinguer la transformation Merge Join transformation et Lookup transformation .

Concernant la recherche :

Si vous souhaitez rechercher des lignes correspondant à la source 2 en fonction de l'entrée de la source 1 et si vous savez qu'il n'y aura qu'une seule correspondance pour chaque ligne d'entrée, je vous suggère d'utiliser l'opération de recherche. Un exemple serait vous OrderDetails table et vous souhaitez trouver le Order Id correspondant et Customer Number , alors la recherche est une meilleure option.

Concernant la jointure par fusion :

Si vous souhaitez effectuer des jointures comme récupérer toutes les adresses (domicile, travail, autre) à partir de Address table pour un Client donné dans le Customer table, alors vous devez utiliser Merge Join car le client peut avoir 1 ou plusieurs adresses associées.

Un exemple pour comparer :

Voici un scénario pour illustrer les différences de performances entre Merge Join transformation et Lookup . Les données utilisées ici sont une jointure un à un, qui est le seul scénario commun entre eux à comparer.

  1. J'ai trois tables nommées dbo.ItemPriceInfo , dbo.ItemDiscountInfo et dbo.ItemAmount . Les scripts de création pour ces tables sont fournis dans la section des scripts SQL.

  2. Tableauxdbo.ItemPriceInfo et dbo.ItemDiscountInfo les deux ont 13 349 729 lignes. Les deux tables ont ItemNumber comme colonne commune. ItemPriceInfo contient des informations sur le prix et ItemDiscountInfo contient des informations sur les remises. Capture d'écran #2 affiche le nombre de lignes dans chacune de ces tables. Capture d'écran #3 affiche les 6 premières lignes pour donner une idée des données présentes dans les tableaux.

  3. J'ai créé deux packages SSIS pour comparer les performances des transformations Merge Join et Lookup. Les deux packages doivent prendre les informations des tables dbo.ItemPriceInfo et dbo.ItemDiscountInfo , calculez le montant total et enregistrez-le dans la table dbo.ItemAmount .

  4. Premier paquet utilisé Merge Join transformation transformation et à l'intérieur, il a utilisé INNER JOIN pour combiner les données. Captures d'écran #4 et #5 afficher l'exemple d'exécution du package et la durée d'exécution. Il a fallu 05 minute 14 secondes 719 millisecondes pour exécuter le package basé sur la transformation Merge Join.

  5. Deuxième package utilisé Lookup transformation avec cache complet (qui est le paramètre par défaut). captures d'écran #6 et #7 afficher l'exemple d'exécution du package et la durée d'exécution. Il a fallu 11 minute 03 secondes 610 millisecondes pour exécuter le package basé sur la transformation Recherche. Vous pouvez rencontrer le message d'avertissement Information :The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed. Voici un lien qui explique comment calculer la taille du cache de recherche. Au cours de l'exécution de ce package, même si la tâche de flux de données s'est terminée plus rapidement, le nettoyage du pipeline a pris beaucoup de temps.

  6. Cela n'est pas signifie que la transformation Lookup est mauvaise. C'est juste qu'il faut l'utiliser à bon escient. Je l'utilise assez souvent dans mes projets, mais encore une fois, je ne traite pas avec plus de 10 millions de lignes pour la recherche quotidienne. Habituellement, mes travaux traitent entre 2 et 3 millions de lignes et pour cela les performances sont vraiment bonnes. Jusqu'à 10 millions de lignes, les deux ont obtenu les mêmes performances. La plupart du temps, ce que j'ai remarqué, c'est que le goulot d'étranglement s'avère être le composant de destination plutôt que les transformations. Vous pouvez surmonter cela en ayant plusieurs destinations. Ici est un exemple qui montre la mise en œuvre de plusieurs destinations.

  7. Capture d'écran #8 affiche le nombre d'enregistrements dans les trois tables. Capture d'écran #9 affiche les 6 premiers enregistrements dans chacune des tables.

J'espère que ça aide.

Scripts 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

Capture d'écran 1 :

Capture d'écran 2 :

Capture d'écran 3 :

Capture d'écran 4 :

Capture d'écran #5 :

Capture d'écran 6 :

Capture d'écran n° 7 :

Capture d'écran 8 :

Capture d'écran #9 :