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. 🙂