Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was sind die Unterschiede zwischen Merge Join- und Lookup-Transformationen in SSIS?

Screenshot Nr. 1 zeigt einige Punkte zur Unterscheidung zwischen Merge Join transformation und Lookup transformation .

Zur Suche:

Wenn Sie Zeilen finden möchten, die in Quelle 2 basierend auf der Eingabe von Quelle 1 übereinstimmen, und wenn Sie wissen, dass es nur eine Übereinstimmung für jede Eingabezeile gibt, würde ich vorschlagen, die Lookup-Operation zu verwenden. Ein Beispiel wären Sie OrderDetails Tabelle und Sie möchten die passende Order Id finden und Customer Number , dann ist Lookup die bessere Option.

In Bezug auf Merge Join:

Wenn Sie Verknüpfungen wie das Abrufen aller Adressen (Privat, Arbeit, Sonstige) von Address durchführen möchten Tabelle für einen bestimmten Kunden im Customer Tabelle, dann müssen Sie sich für Merge Join entscheiden, da dem Kunden eine oder mehrere Adressen zugeordnet werden können.

Ein Vergleichsbeispiel:

Hier ist ein Szenario, um die Leistungsunterschiede zwischen Merge Join zu demonstrieren und Lookup . Bei den hier verwendeten Daten handelt es sich um eine Eins-zu-eins-Verknüpfung, die das einzige gemeinsame Szenario zum Vergleich ist.

  1. Ich habe drei Tabellen namens dbo.ItemPriceInfo , dbo.ItemDiscountInfo und dbo.ItemAmount . Erstellungsskripts für diese Tabellen werden im Abschnitt SQL-Skripts bereitgestellt.

  2. Tabellendbo.ItemPriceInfo und dbo.ItemDiscountInfo beide haben 13.349.729 Zeilen. Beide Tabellen haben die ItemNumber als gemeinsame Spalte. ItemPriceInfo hat Preisinformationen und ItemDiscountInfo hat Rabattinformationen. Screenshot Nr. 2 zeigt die Zeilenanzahl in jeder dieser Tabellen. Screenshot Nr. 3 zeigt die obersten 6 Zeilen, um eine Vorstellung von den in den Tabellen vorhandenen Daten zu geben.

  3. Ich habe zwei SSIS-Pakete erstellt, um die Leistung von Merge Join- und Lookup-Transformationen zu vergleichen. Beide Pakete müssen die Informationen aus den Tabellen dbo.ItemPriceInfo entnehmen und dbo.ItemDiscountInfo , berechnen Sie den Gesamtbetrag und speichern Sie ihn in der Tabelle dbo.ItemAmount .

  4. Das erste Paket verwendete Merge Join Transformation und darin wurde INNER JOIN verwendet, um die Daten zu kombinieren. Screenshots Nr. 4 und #5 zeigen die Beispielpaketausführung und die Ausführungsdauer. Es dauerte 05 Minuten 14 Sekunden 719 Millisekunden, um das auf der Merge Join-Umwandlung basierende Paket auszuführen.

  5. Das zweite Paket verwendete Lookup Transformation mit Full Cache (das ist die Standardeinstellung). Screenshots #6 und #7 zeigen die Beispielpaketausführung und die Ausführungsdauer. Es dauerte 11 Minuten 03 Sekunden 610 Millisekunden, um das auf der Lookup-Umwandlung basierende Paket auszuführen. Möglicherweise wird die Warnmeldung Information angezeigt:The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed. Hier ist ein Link das spricht darüber, wie die Lookup-Cache-Größe berechnet wird. Während der Ausführung dieses Pakets nahm die Pipeline-Bereinigung viel Zeit in Anspruch, obwohl die Datenflussaufgabe schneller abgeschlossen wurde.

  6. Dies nicht meine Lookup-Transformation ist schlecht. Es ist nur, dass es mit Bedacht eingesetzt werden muss. Ich verwende das ziemlich oft in meinen Projekten, aber auch hier habe ich nicht jeden Tag mit mehr als 10 Millionen Zeilen für die Suche zu tun. Normalerweise verarbeiten meine Jobs zwischen 2 und 3 Millionen Zeilen und dafür ist die Leistung wirklich gut. Bis zu 10 Millionen Reihen haben beide gleich gut abgeschnitten. Was mir meistens aufgefallen ist, ist, dass sich herausstellt, dass der Flaschenhals eher die Zielkomponente als die Transformationen sind. Sie können dies überwinden, indem Sie mehrere Ziele haben. Hier ist ein Beispiel, das die Implementierung mehrerer Ziele zeigt.

  7. Screenshot Nr. 8 zeigt die Datensatzanzahl in allen drei Tabellen. Screenshot Nr. 9 zeigt die Top 6 Datensätze in jeder der Tabellen.

Hoffe das hilft.

SQL-Skripts:

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

Screenshot 1:

Screenshot Nr. 2:

Screenshot 3:

Screenshot #4:

Screenshot Nr. 5:

Screenshot #6:

Screenshot #7:

Screenshot #8:

Screenshot Nr. 9: