Aktualisieren einer großen replizierten Dimension (SQL Server PDW)

8

Wir verwenden eine SQL Server PDW-Appliance für unser Data Warehouse. Eine der Tabellen in unserem Lager ist eine replizierte Tabelle mit etwa 20 Millionen Zeilen. Im Rahmen unseres ETL-Prozesses müssen alte Datensätze aus dieser Dimension ablaufen. Wir sehen jedoch, dass das Aktualisieren einer Handvoll Datensätze (<100) mehr als 1 Stunde dauert. Das möchte ich verbessern, wenn ich kann.

Eine Option, über die ich nachgedacht habe, war natürlich, diese Dimension von Repliziert in Verteilt zu ändern. Meine Tests haben gezeigt, dass das Problem dadurch behoben wird, dass der ETL-Prozess lange dauert (von 1,5 Stunden auf 30 Sekunden), aber alle Verknüpfungen mit der verteilten Version dieser Dimension betroffen sind, da die Verknüpfungen fast nie auf derselben Verteilung basieren Säule. Wenn ich mir den Ausführungsplan einiger dieser Abfragen ansehe, sehe ich normalerweise entweder eine ShuffleMove- oder eine BroadcastMove- Operation.

Meine Frage an den PDW-Guru lautet also:

Gibt es noch etwas, das getan werden kann, um die Leistung beim Aktualisieren von Datensätzen in der replizierten Version dieser Dimension zu verbessern ?

Auch hier scheint der Wechsel zu einer verteilten Tabelle nicht die beste Lösung zu sein, da er Hunderte von bereits geschriebenen SQL-Abfragen und Berichten betrifft, die von anderen Personen entwickelt wurden.

Ikarus
quelle
1
Ich habe hier nicht viele PDW-Fragen gesehen. Wenn Sie keine Antwort erhalten, versuchen Sie es auch in den MSDN SQL Server-Foren. Es gibt auch schnelle Antworten. Viel Glück.
Ali Razeghi

Antworten:

5

Ein paar Fragen. 20 Millionen Zeilen sind nicht unbedingt so groß.

Welchen Prozess verwenden Sie gerade, um Ihre Aktualisierungen und Löschungen durchzuführen?

Ist die Dimension ein CLUSTERED COLUMNSTORE INDEX, CLUSTERED INDEX oder HEAP?

Wollen Sie damit sagen, dass beim Aktualisieren und Löschen dieser Tabelle eine Bewegung auftritt, oder haben Sie nur eine Bewegung gesehen, als Sie die Tabelle von repliziert auf verteilt geändert haben?

Wenn es das letztere ist, ist das nicht überraschend. Es ist unwahrscheinlich, dass Sie mit Join und Aggregation kompatibel sind. Wenn Sie etwas tun, um die Bewegung durch Ihr Aktualisieren / Löschen auszulösen, könnten wir uns das ansehen - obwohl ein konkretes Beispiel hilfreich wäre.

Im Allgemeinen würde ich zunächst versuchen, die ETL einfach zu halten.

Verwenden Sie CTAS für die Dimension, indem Sie nur die Zeilen auswählen, die Sie behalten möchten, neue Zeilen zusammenfassen und CASE verwenden, um Änderungen zu übernehmen (Konvertieren des UPDATE in eine Transformation innerhalb des CTAS). Nach Abschluss können Sie mit zwei Befehlen RENAME OBJECT von der aktuellen Tabelle zur neuen Tabelle wechseln. Dies bietet Ihnen den zusätzlichen Vorteil, dass Sie einen historischen Blick auf Ihren Tisch haben, den Sie nach Belieben ablegen können.

JRJ
quelle
1

Das Replizieren hindert Sie nicht daran, die Partitionierung zu verwenden. Partitionieren Sie Ihren Tisch.

Für die Zeilen, die Sie löschen oder aktualisieren müssen, CTAS die gesamte Partition in eine neue Tabelle, wobei LEFT JOIN und COALESCE verwendet werden, um die entsprechenden (dh neuen) Werte für Aktualisierungen aus den geänderten Zeilen zu erhalten, während die gewünschten Zeilen beibehalten und die Zeilen ausgeschlossen werden diejenigen, die du nicht tust.

Schließlich wechselt die Partition die neue Tabelle mit Ihrer alten Partition.

Und fertig :)

Nach meiner Erfahrung mag PDW keine Updates und Löschungen. CTAS- und Partitionsschalter funktionieren gut.

Mark Stacey
quelle
1

UPDATE-Anweisungen in PDW sind wie CTAS nur teilweise parallel und nicht vollständig parallel.

Dies könnte jedoch auf die Indizierung zurückzuführen sein. Was ist der tatsächliche Code, den Sie ausführen? Haben Sie Indizes eingerichtet, um die Datensätze zu finden, die Sie ablaufen lassen? Sie müssen noch einige der Standardoptimierungstechniken zum Anwenden von nicht gruppierten Indizes auf Rowstore-Tabellen anwenden. Die Tatsache, dass PDW keine Primärschlüssel unterstützt, scheint oft zu bedeuten, dass die Leute vergessen, ihren natürlichen Schlüssel zu indizieren. Finden Sie sich also nicht in diesem Boot wieder ...

Rob Farley
quelle