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.
-
Ich habe drei Tabellen namens
dbo.ItemPriceInfo
,dbo.ItemDiscountInfo
unddbo.ItemAmount
. Erstellungsskripts für diese Tabellen werden im Abschnitt SQL-Skripts bereitgestellt. -
Tabellen
dbo.ItemPriceInfo
unddbo.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. -
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 unddbo.ItemDiscountInfo
, berechnen Sie den Gesamtbetrag und speichern Sie ihn in der Tabelledbo.ItemAmount
. -
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 dauerte05
Minuten14
Sekunden719
Millisekunden, um das auf der Merge Join-Umwandlung basierende Paket auszuführen. -
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 dauerte11
Minuten03
Sekunden610
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. -
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.
-
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: