Performanceunterschied Abfrage im SSMS und als UDF (SQL 2008 SP1)

05/03/2010 - 10:02 von Gerald Aichholzer | Report spam
Hallo NG,

ich habe mir folgende Abfrage gebastelt:

declare @planid bigint = (select ...)

declare @basis table ( ... )
insert into @basis ( ... )
select ...
from udf_GetBasis(@planid)
;

with cteRekursiv as (
select ...
from @basis
where ...

union all

select ...
from cteRekursiv f
inner join @basis b on ...
)
select *
from cteRekursiv
option (maxrecursion 0)


Diese Abfrage wird im Management Studio in 8 Sekunden ausgeführt.
Wenn ich die Abfrage in eine benutzerdefinierte Funktion packe:

declare function udf_Calculate(@planid bigint)
returns @result table ( ... )
as begin
insert into @result ( ... )
return
end

dann dauert die Abfrage "ewig" (làuft momentan seit ca. 15 Minuten).

Wieso ist das so?
Was kann ich machen, um die Performance der Funktion zu verbessern?
Oder hilft es, wenn ich eine gespeicherte Prozedur für die Berechnung
erstelle (es wàre zwar praktisch, wenn das Ergebnis von einer Funktion
kommt, muss aber nicht unbedingt sein)?

Vielen Dank und schöne Grüße,
Gerald
 

Lesen sie die antworten

#1 Gerald Aichholzer
05/03/2010 - 10:18 | Warnen spam
Hallo NG,

ich mach mal die Ingrid:

Gerald Aichholzer wrote:
ich habe mir folgende Abfrage gebastelt:

declare @planid bigint = (select ...)

declare @basis table ( ... )
insert into @basis ( ... )
select ...
from udf_GetBasis(@planid)
;

with cteRekursiv as (
select ...
from @basis
where ...

union all

select ...
from cteRekursiv f
inner join @basis b on ...
)
select *
from cteRekursiv
option (maxrecursion 0)


Diese Abfrage wird im Management Studio in 8 Sekunden ausgeführt.
Wenn ich die Abfrage in eine benutzerdefinierte Funktion packe:

declare function udf_Calculate(@planid bigint)
returns @result table ( ... )
as begin
insert into @result ( ... )
return
end

dann dauert die Abfrage "ewig" (làuft momentan seit ca. 15 Minuten).



ich habe versehentlich im Management Studio die Version des Scripts
verwendet, die die Basisdaten in einer temporàren Tabelle hàlt. Wenn
ich das Script auf Tabellenvariablen umstelle, dann làuft es auch im
SSMS "ewig".

Kann ich die Verarbeitung auch mit Tabellenvariablen beschleunigen?

Die Basistabelle (@basis) hat ca. 80.000 Datensàtze mit Monat, Wert
und anderen Informationen. Die Rekursion ist nötig, da sich der Wert
aufgrund der anderen Informationen absolut und/oder relativ àndern
kann. Die folgenden Änderungen sind dann vom jeweils aktuellen Wert
abhàngig. Das Ergebnis sind die gleichen 80.000 Datensàtze, jedoch
mit "korrigiertem" Wert.


vielen Dank und schöne Grüße,
Gerald

Ähnliche fragen