DISTINCT – Eindeutig ohne Sortieren

Vor einigen Wochen habe ich einen Artikel über die Komponente NSort von Ordinal Technology Corp geschrieben. Wie das so ist, gerade noch in dem Artikel behauptet das ich noch nicht an die Grenzen des "Sortieren Tasks" gestoßen bin, muss ich das ganze auch wieder revidieren. In einem Projekt sind aus 1,1 Mio. Datensätzen die eindeutigen doppelten Zeilen zu verwerfen, also ein DISTINCT, und hier muss ich sagen hat der "Sortieren Task" dann doch versagt.

Grundsätzlich bieten die Integration Services 2 Möglichkeiten mit denen eindeutige doppelte Datensätze verworfen werden können, den "Sortieren Task" und den "Aggregat Task". Bei dem "Sortieren Task" handelt es sich um einen Blocking Task, also einen Task der erst alle eingehenden Daten lesen und verarbeiten muss, bevor er einen Output erstellt kann. Beim reduzieren der doppelten Datensätze ist das relativ ungeschickt, da eine Komponente den Input auch direkt weiter geben, sich die Schlüssel-Spalten merken und weitere Datensätze mit doppelten Schlüsseln daraufhin verwerfen könnte. So benötigt die Reduzierung der 1,1 Mio. Daten auf einem aktuellen Server 27 Minuten und 14 Sekunden. Ganz schön langsam.

Sortieren   Sortieren2

 

 

Die zweite Komponente mit der sich die Reduzierung erreichen lässt, ist der "Aggregat Task". Der Task ist ebenso wie der "Sortieren Task" ein Blocking Task. Dadurch das für das Reduzieren die Daten aber nicht sortiert werden, sondern lediglich eine Gruppierung der Schlüsselspalten stattfindet, ist die Komponente um Längen nicht so Speicher hungrig und mit einer Verarbeitungsgeschwindigkeit von 17 Sekunden auch fast um den Faktor 100 schneller als der "Sortieren Task".

 

Aggregat

Wer also mehrfach vorkommende Input Daten auf eindeutige Datensätze reduzieren möchte ohne die Daten extra zu sortieren, der sollte dies besser über den "Aggregat Task" erledigen.

Ein weitere Möglichkeit die noch existiert, ist der Einsatz einer Komponente von Alberto Ferrari und Marco Russo. Auf der Seite sqlbi.eu, die die beiden betreiben, finden sich eine Reihe verschiedener Komponenten, teilweise sogar mit Sourcen. Ein dieser Komponenten ist der "Distinct Task", der genau das macht, wonach er klingt. Der Task wurde als synchrone Transformation (Row Transformation) realisiert, die eingehenden Daten werden also direkt verarbeitet und an die Ausgabe weitergeleitet ohne das alle vorhandenen Zeilen im Datenfluss vorerst gelesen werden müssen. Die Komponente hat einen relativ Konstanten Speicherverbrauch und stellt, wenn auch nicht mit einem sehr großen Abstand, mit 15 Sekunden immerhin den schnellste Weg dar, doppelte Datensätze zu eliminieren.

SqlBi

DISTINCT2 DISTINCT 

 

Wer sich für das Performance Tuning interessiert und mehr über synchrone/asynchrone Tasks, Buffer Usage, Buffer Sizing usw. interessiert, der sollte sich einmal den Artikel Integration Services: Performance Tuning Techniques von Elizabeth Vitt durchlesen.