it-swarm.com.de

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

Hallo, ich bin neu in SSIS-Paketen und schreibe ein Paket und lese gleichzeitig darüber.

Ich musste ein DTS in ein SSIS-Paket konvertieren und einen Join für zwei Quellen aus verschiedenen Datenbanken ausführen.

An der Oberfläche scheinen sie sich sehr ähnlich zu sein. Für den Zusammenführungs-Join müssen die Daten vorab sortiert werden, für das Nachschlagen ist dies nicht erforderlich. Jeder Rat wäre sehr hilfreich. Vielen Dank.

34
saj

Screenshot # 1 zeigt einige Punkte, um zwischen Merge Join transformation Und Lookup transformation Zu unterscheiden.

In Bezug auf Lookup:

Wenn Sie in Quelle 2 übereinstimmende Zeilen basierend auf der Eingabe von Quelle 1 suchen möchten und wissen, dass für jede Eingabezeile nur eine Übereinstimmung vorhanden ist, empfehle ich die Verwendung der Suchoperation. Ein Beispiel wäre you OrderDetails table und Sie möchten den passenden Order Id Und Customer Number Finden, dann ist Lookup eine bessere Option.

In Bezug auf Zusammenführungsverknüpfung:

Wenn Sie Verknüpfungen wie das Abrufen aller Adressen (Privat, Arbeit, Andere) aus der Tabelle Address für einen bestimmten Kunden in der Tabelle Customer ausführen möchten, müssen Sie die Option Zusammenführen wählen, da der Kunde können 1 oder mehr Adressen zugeordnet sein.

Ein zu vergleichendes Beispiel:

In diesem Szenario werden die Leistungsunterschiede zwischen Merge Join Und Lookup veranschaulicht. Bei den hier verwendeten Daten handelt es sich um eine Eins-zu-Eins-Verknüpfung. Dies ist das einzige Szenario, das von beiden verglichen wird.

  1. Ich habe drei Tabellen mit den Namen dbo.ItemPriceInfo, dbo.ItemDiscountInfo Und dbo.ItemAmount. Erstellungsskripte für diese Tabellen finden Sie im Abschnitt SQL-Skripte.

  2. Die Tabellen dbo.ItemPriceInfo Und dbo.ItemDiscountInfo Haben jeweils 13.349.729 Zeilen. Beide Tabellen haben die ItemNumber als gemeinsame Spalte. ItemPriceInfo enthält Preisinformationen und ItemDiscountInfo enthält Rabattinformationen. Screenshot # 2 zeigt die Zeilenanzahl in jeder dieser Tabellen. Screenshot # 3 zeigt die oberen 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 Und dbo.ItemDiscountInfo Entnehmen, den Gesamtbetrag berechnen und in der Tabelle dbo.ItemAmount Speichern.

  4. Das erste Paket verwendete die Merge Join - Transformation und darin INNER JOIN, um die Daten zu kombinieren. Screenshots # 4 und # 5 zeigen die Ausführung des Beispielpakets und die Ausführung Dauer. Es dauerte 05 Minuten 14 Sekunden 719 Millisekunden, um das umwandlungsbasierte Merge-Join-Paket auszuführen.

  5. Das zweite Paket verwendet die Lookup -Transformation mit vollem Cache (dies ist die Standardeinstellung). Die Screenshots # 6 und # 7 zeigen die Ausführung des Beispielpakets und die Ausführung Dauer. 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 , der beschreibt, wie Lookup berechnet wird Cache-Größe. Während dieser Paketausführung hat die Pipeline-Bereinigung viel Zeit in Anspruch genommen, obwohl die Datenflusstask schneller ausgeführt wurde.

  6. Dies bedeutet nicht , dass die Lookup-Transformation schlecht ist. Es ist nur so, dass es mit Bedacht eingesetzt werden muss. Ich verwende das ziemlich oft in meinen Projekten, aber auch hier beschäftige ich mich nicht mit mehr als 10 Millionen Zeilen, um jeden Tag danach zu suchen. Normalerweise verarbeiten meine Jobs zwischen 2 und 3 Millionen Zeilen und dafür ist die Leistung wirklich gut. Bis zu 10 Millionen Zeilen schnitten gleich gut ab. Die meiste Zeit ist mir aufgefallen, dass der Engpass eher die Zielkomponente als die Transformationen ist. Sie können das überwinden, indem Sie mehrere Ziele haben. Hier ist ein Beispiel, das die Implementierung mehrerer Ziele zeigt.

  7. Screenshot # 8 zeigt die Anzahl der Datensätze in allen drei Tabellen. Screenshot # 9 zeigt die Top-6-Datensätze in jeder der Tabellen.

Ich hoffe, das hilft.

SQL-Skripte:

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:

1

Screenshot 2:

2

Screenshot 3:

3

Screenshot 4:

4

Screenshot Nr. 5:

5

Screenshot Nr. 6:

6

Screenshot Nr. 7:

7

Screenshot Nr. 8:

8

Screenshot 9:

9

81
user756519

Eine Zusammenführungsverknüpfung soll zu Ergebnissen führen, die der Funktionsweise von JOINs in SQL ähneln. Die Lookup-Komponente funktioniert nicht wie ein SQL-JOIN. Hier ist ein Beispiel, bei dem sich die Ergebnisse unterscheiden würden.

Wenn Sie eine Eins-zu-Viele-Beziehung zwischen Eingabe 1 (z. B. Rechnungen) und Eingabe 2 (z. B. Rechnungsposten) haben, möchten Sie, dass die Ergebnisse der Kombination dieser beiden Eingaben eine oder mehrere Zeilen für eine einzelne Rechnung enthalten .

Mit einem Merge Join erhalten Sie die gewünschte Ausgabe. Bei einer Suche, bei der Eingabe 2 die Nachschlagequelle ist, ist die Ausgabe eine Zeile pro Rechnung, unabhängig davon, wie viele Zeilen in Eingabe 2 vorhanden sind. Ich kann mich nicht erinnern, welche Zeile von Eingabe 2 die Daten stammen würden, aber ich ' Ich bin mir ziemlich sicher, dass Sie zumindest eine Warnung zu doppelten Daten erhalten.

Daher hat jede Komponente ihre eigene Rolle in SSIS.

9
bobs

Ich werde eine dritte Alternative vorschlagen. Ihre OLE DBSource könnte eine Abfrage anstelle einer Tabelle enthalten, und Sie könnten dort den Join ausführen. Dies ist nicht in allen Situationen sinnvoll, aber wenn Sie sie verwenden können, müssen Sie nicht vorher sortieren .

4
HLGEM

es gibt 2 unterschiede:

  1. Sortierung:

    • für einen Merge-Join müssen beide Eingaben auf dieselbe Weise sortiert werden
    • für die Suche muss keine der Eingaben sortiert werden.
  2. Datenbankabfrage laden:

    • ein Merge-Join bezieht sich nicht auf die Datenbank, sondern nur auf die beiden Eingabe-Flows (obwohl die Referenzdaten in der Regel die Form 'select * from table order by join critera' haben).
    • lookup gibt eine Abfrage für jeden Wert aus (eindeutig, wenn zwischengespeichert), für den ein Beitritt angefordert wird. Dies wird schnell teurer als die obige Auswahl.

Dies führt zu Folgendem: Wenn keine sortierte Liste erstellt werden muss und Sie mehr als 1% der Zeilen erstellen möchten (bei der Auswahl einer einzelnen Zeile wird das 100-fache der Kosten derselben Zeile für das Streaming ausgewählt) (Sie möchten nicht sortieren Eine 10-Millionen-Zeilentabelle im Speicher ..) Dann ist Merge-Join der richtige Weg.

Wenn Sie nur eine geringe Anzahl von Übereinstimmungen erwarten (eindeutige Werte wurden bei aktiviertem Caching nachgeschlagen), ist die Suche besser.

Für mich liegt der Kompromiss zwischen 10.000 und 100.000 Zeilen, die nachgeschlagen werden müssen.

Wer schneller ist, hängt davon ab

  • die Gesamtzahl der zu verarbeitenden Zeilen. (Wenn die Tabelle speicherresident ist, ist eine Art von Daten zum Zusammenführen billig.)
  • die Anzahl der erwarteten doppelten Suchvorgänge. (hoher zeilenweiser Overhead der Suche)
  • wenn Sie sortierte Daten auswählen können (beachten Sie, dass die Sortierung von Text durch die Sortierung von Code beeinflusst wird. Achten Sie also darauf, dass SQL-Anweisungen auch als sortiert betrachtet werden.)
  • wie viel Prozent der gesamten Tabelle werden Sie nachschlagen. (Für das Zusammenführen muss jede Zeile ausgewählt werden. Die Suche ist besser, wenn Sie nur einige Zeilen auf einer Seite haben.)
  • die Breite einer Zeile (Zeilen pro Seite können die Kosten für einzelne Suchvorgänge im Vergleich zu einem Scan stark beeinflussen) (schmale Zeilen -> mehr Vorliebe für Zusammenführung)
  • die Reihenfolge der Daten auf der Festplatte (einfach zu erzeugende sortierte Ausgabe, bevorzugen Zusammenführen, wenn Sie die Suchvorgänge in physischer Festplattenreihenfolge organisieren können, sind die Suchvorgänge aufgrund geringerer Cachefehler weniger kostspielig)
  • netzwerklatenz zwischen dem SSIS-Server und dem Ziel (größere Latenz -> Zusammenführung vorziehen)
  • wie viel Programmieraufwand Sie aufwenden möchten (Zusammenführen ist etwas komplexer zu schreiben)
  • die Zusammenstellung der Eingabedaten - Die SSIS-Zusammenführung hat seltsame Ideen zum Sortieren von Textzeichenfolgen, die nicht alphanumerische Zeichen enthalten, aber nicht nvarchar sind. (Das geht zum Sortieren, und es ist schwierig, SQL dazu zu bringen, eine Sortierung auszugeben, die ssis gerne zusammenführt.)
2
Andrew Hill

Die Suche ähnelt der Linksverknüpfung in der Zusammenführungsverknüpfungskomponente. Merge kann auch andere Arten von Joins ausführen. Wenn dies jedoch gewünscht wird, liegt der Unterschied hauptsächlich in Leistung und Bequemlichkeit.

Ihre Leistungsmerkmale können je nach der relativen Menge der zu suchenden Daten (Eingabe in die Suchkomponente) und der Menge der referenzierten Daten (Suchcache oder Größe der Suchdatenquelle) sehr unterschiedlich sein.

Z.B. Wenn Sie nur 10 Zeilen suchen müssen, der Datensatz, auf den verwiesen wird, jedoch 10 Millionen Zeilen enthält, ist die Suche im Teil-Cache- oder No-Cache-Modus schneller, da nur 10 anstatt 10 Millionen Datensätze abgerufen werden. Wenn Sie 10 Millionen Zeilen nachschlagen müssen und der Datensatz, auf den verwiesen wird, 10 Zeilen umfasst, ist die vollständig zwischengespeicherte Suche wahrscheinlich schneller (es sei denn, diese 10 Millionen Zeilen sind ohnehin bereits sortiert und Sie können Merge Join ausprobieren). Wenn beide Datensätze groß sind (insbesondere wenn mehr als der verfügbare Arbeitsspeicher vorhanden ist) oder der größere sortiert ist, ist Zusammenführen möglicherweise die bessere Wahl.

2
Michael Entin

Ich weiß, dass dies eine alte Frage ist, aber ein kritischer Punkt, der meines Erachtens von den gegebenen Antworten nicht abgedeckt wurde, ist, dass durch den Zusammenführungs-Join zwei Datenflüsse zusammengeführt werden und Daten aus einer beliebigen Quelle kombiniert werden können. Während bei der Suche eine Datenquelle in einer OLE DB gespeichert werden muss.

1
Dave Sexton

Mit Merge Join können Sie anhand eines oder mehrerer Kriterien mehreren Spalten beitreten, wohingegen bei Lookups nur ein oder mehrere Werte basierend auf übereinstimmenden Spalteninformationen abgerufen werden. Die Lookup-Abfrage wird für jede Spalte ausgeführt Wert in Ihrer Datenquelle (obwohl SSIS die Datenquelle zwischenspeichert, wenn dies möglich ist).

Es hängt wirklich davon ab, was Ihre beiden Datenquellen enthalten und wie Ihre endgültige Quelle nach der Zusammenführung aussehen soll. Können Sie weitere Details zu den Schemata in Ihrem Paket DTS angeben?

Eine weitere zu berücksichtigende Sache ist die Leistung. Bei falscher Verwendung kann jeder langsamer als der andere sein. Dies hängt jedoch auch von der Datenmenge und Ihren Datenquellenschemata ab.

1
Cᴏʀʏ