In diesem Whitepaper zum Thema “Optimierung von Abfragen in MS SQL Server DWH-Umgebungen” befassen sich Christian Wolf und Benjamin Weissman mit der Optimierung von MS SQL Server basierten Datawarehouses, insbesondere im Umfeld der evidanza-Standardcubes.
Sie können das Whitepaper hier downloaden
1 Ausgangssituation
In Datawarehouses stellt sich regelmäßig die Herausforderung, dass die Schlüsselelemente von Stammdaten aufgefüllt oder manipuliert werden müssen. Dies erfolgt, um beispielsweise leere Schlüssel zu vermeiden oder auch Schlüssel, welche sich aus mehreren Feldern zusammensetzen zu verbinden.
Hierzu werden häufig sogenannte Benutzerdefinierte Funktionen (UDF) genutzt.
Diese erlauben auch nachträglich einen flexiblen Eingriff in die Strukturen. Ist beispielsweise anfangs ein Aufbau von mandantenabhängigen Artikelnummern in Form von Mandant + _ + Artikel gewünscht welcher zu einem späteren Zeitpunkt „gedreht“, also in Artikel + _ + Mandant geändert werden soll, so erlaubt eine solche UDF dies durch eine einzige zentrale Änderung.
In den evidanza-Standardwarehouses wird dies beispielsweise über die Funktion dbo.SetDummy() gelöst.
Die Nutzung von benutzerdefinierten Funktionen hat jedoch einen entscheidenden Nachteil: Abfragen können nicht mehr parallel verarbeitet werden, insbesondere bei großen Abfragen wirkt sich dies massiv negativ auf die Performance aus.
2 Lösungsansatz
Der Lösungsansatz ist relativ einfach: Die nicht parallel lauffähigen Funktionen können in sogenannte Common Language Runtime (CLR) Objekte ausgelagert werden. Hierbei wird der T-SQL Code in Programmcode überführt, welcher im Anschluss wiederum dem SQL Server verfügbar gemacht wird. Die Nutzung der CLR-Objekte macht die Ausführung, sofern nicht weitere Code-Fragmente dem entgegen-stehen, parallel lauffähig und erhöht somit merklich die Performance. Durch den transparenten Austausch der bisherigen benutzerdefinierten Funktionen ist auch diese Anpassung an nur einer zentralen Stelle erforderlich und somit mit minimalem Aufwand zu bewerkstelligen.
Eine Alternative zum Einsatz von CLR Objekten wäre der entsprechende Umbau der Abfragen, so dass diese keine benutzerdefinierten Funktionen mehr nutzen – dies geht jedoch sehr zu Lasten der Flexibilität und bedeutet einen massiv erhöhten Test- und Entwicklungsaufwand, weswegen wir diesen Ansatz hier nicht weiter verfolgen.
Haben wir Sie neugierig gemacht? Alle weiteren Details finden Sie hier im Whitepaper