Hallo Zusammen,
ich teste derzeit eine neue Applikation im Testsystem auf Performance und mir ist im SQL Profiler eine Abfrage aufgefallen, die mir ist ein bisschen Schwierigkeiten macht.
Genaugesagt ist es eine gespeicherte Prozedur, die einige Parameter aufnimmt und selbst dann eigene SQL Funktionen aufruft.
Ich versuche das mal vereinfacht darzustellen und konzentriere mich auf das
SQL Statement was von der gespeicherten Prozedur aufgerufen wird.
Dieses sieht etwa so aus:
im SELECT Statement werden also 5 SQL Funktionen aufgerufen, die irgendwas zurückgeben.
Mein Problem ist jetzt das ich im SQL Profiler sehe, dass hierbei ohne Reads verursacht werden und dieses SQL Statement oben sehr sehr oft aufgerufen wird, nämlich genau so viel mal wie es Zeilen gibt die durch die WHERE Klausel eingeschlossen werden MAL die Anzahl der Funktionen im SQL Statement enthalten, sind also 5.
Beispiel:
Die WHERE Klausel
WHERE (TAB1.WERT1 = @Param1) AND (TAB1.WERT2 = @Param2) AND (TAB1.WERT3 = @Param3)
liefert 1000 Zeilen, im SELECT sind 5 Funktionen = 5x 1000 Zeilen.
Nehme ich beispielsweise eine SQL Funktion raus, verringert sich das ganze sofort auf 4x 1000 Zeilen usw...
Eigentlich sollte das Statement aber nur so oft aufgerufen wird, wieviele einmalige (DISTINCT) Kategorieren es gibt.
Ich nehme mal an durch die SQL Funktionen funzt das DISTINCT nicht mehr?
Gibt es irgendwie eine Möglichkeit die SQL Funktionen auch nur so oft ausführen zu lassen, wieviele einmalige Kategorieren es gibt?
Von den 1000 Zeilen die die durch die WHERE Klausel erfasst werden, sind max. 10 unterschiedliche Kategorien vorhanden.
Ich bin nicht der Programmierer, aber mich würde es sehr interessieren, ob es vielleicht eine Möglichkeit, dies performanter zu gestalten.
Ich hoffe ich konnte das halbwegs verständlich zur späten Stunde erläutern.
Danke und Gruß
Pierre
ich teste derzeit eine neue Applikation im Testsystem auf Performance und mir ist im SQL Profiler eine Abfrage aufgefallen, die mir ist ein bisschen Schwierigkeiten macht.
Genaugesagt ist es eine gespeicherte Prozedur, die einige Parameter aufnimmt und selbst dann eigene SQL Funktionen aufruft.
Ich versuche das mal vereinfacht darzustellen und konzentriere mich auf das
SQL Statement was von der gespeicherten Prozedur aufgerufen wird.
Dieses sieht etwa so aus:
Code:
SELECT DISTINCT TAB1.KATEGORIE, dbo.xyz_FN_Funktion1(TAB1.WERT1, TAB1.WERT2, TAB1.WERT3, TAB1.WERT4) AS AA, dbo.xyz_FN_Funktion2(@Param1,@Param2) as BB, @Param1 as Param1, dbo.xyz_FN_Funktion3(@Param1,@Param2) as CC, dbo.xyz_FN_Funktion4(@Param1,@Param2) as DD, dbo.xyz_FN_Funktion5(@Param1,@Param2) as DD, TAB2.WERT3 FROM TAB1 INNER JOIN TAB2 ON TAB1.CODE = TAB2.CODE WHERE (TAB1.WERT1 = @Param1) AND (TAB1.WERT2 = @Param2) AND (TAB1.WERT3 = @Param3) ORDER BY TAB1.KATEGORIE
Mein Problem ist jetzt das ich im SQL Profiler sehe, dass hierbei ohne Reads verursacht werden und dieses SQL Statement oben sehr sehr oft aufgerufen wird, nämlich genau so viel mal wie es Zeilen gibt die durch die WHERE Klausel eingeschlossen werden MAL die Anzahl der Funktionen im SQL Statement enthalten, sind also 5.
Beispiel:
Die WHERE Klausel
WHERE (TAB1.WERT1 = @Param1) AND (TAB1.WERT2 = @Param2) AND (TAB1.WERT3 = @Param3)
liefert 1000 Zeilen, im SELECT sind 5 Funktionen = 5x 1000 Zeilen.
Nehme ich beispielsweise eine SQL Funktion raus, verringert sich das ganze sofort auf 4x 1000 Zeilen usw...
Eigentlich sollte das Statement aber nur so oft aufgerufen wird, wieviele einmalige (DISTINCT) Kategorieren es gibt.
Ich nehme mal an durch die SQL Funktionen funzt das DISTINCT nicht mehr?
Gibt es irgendwie eine Möglichkeit die SQL Funktionen auch nur so oft ausführen zu lassen, wieviele einmalige Kategorieren es gibt?
Von den 1000 Zeilen die die durch die WHERE Klausel erfasst werden, sind max. 10 unterschiedliche Kategorien vorhanden.
Ich bin nicht der Programmierer, aber mich würde es sehr interessieren, ob es vielleicht eine Möglichkeit, dies performanter zu gestalten.
Ich hoffe ich konnte das halbwegs verständlich zur späten Stunde erläutern.
Danke und Gruß
Pierre
Comment