Aufgabe: Der Kunde exportiert täglich 90.000 Datensätze von on-premise  in eine Datenbank für eine Webanwendung. Die Laufzeit des Exportes auf Prod beträgt 2,5 h und auf unserer Entwicklungsumgebung über 4 h.

Als aussichtsreicher, erster Kandidat für eine Optimierung erwies sich ein Statement, welches 47 Minuten auf Dev lief.

Problemanalyse: Das Statement bestand aus einer Update – Query, die für vier Felder, dieselbe Skalarwertfunktion aufrief:

Update tbl

Set value1 = calcString(tbl.value1Input, 1,0)

, value2 = calcString(tbl.value2Input,2,1)

, value 3= calcString(tbl.value3Input, 1,0)

, value4 = calcString(tbl.value4Input, 2,1)

From tbl

Die Skalarwertfunktion wiederum enthielt einen Logikbaum in Form von If-Statements auf Basis der Eingabeparameter und jeweils das Select-Statement für diese Parameter-Konstruktion.

Außerdem wurden rekursive Stringoperationen angewandt:

SELECT

  @Result = IsNULL(@Result+’*‘,“)

+ ISNULL(CONVERT(VARCHAR(11),textPart),“)

  FROM tbl

   GROUP BY groupCriteria;

Damit wurde das Datenbank-Managementsystem zu einer satzweisen Verarbeitung der Daten gezwungen und man hätte diese Implementierung identisch auf einem Text-File implementiert.

Lösung:

Die prozedurale Programmstruktur wurde aufgebrochen und die Logik in ein SQL-Statement überführt.

Die rekursiven Stringoperationen wurden durch die neuen T-SQL Stringfunktionen string_agg() ersetzt.

Ergebnis:

Die Laufzeit dieses Schrittes konnte damit auf unter 1 Sekunde gesenkt werden. 🙂