Laden...

Table-Valued User-Defined Fu ist langsam, wenn sie mit Integer-Wert anstatt Variabel aufgerufen wird

Erstellt von Christoph K. vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.324 Views
Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 7 Jahren
Table-Valued User-Defined Fu ist langsam, wenn sie mit Integer-Wert anstatt Variabel aufgerufen wird

verwendetes Datenbanksystem: MSSQL

Ich hab folgende beiden Aufrufe eine Table-Valued User-Defined Functions gegeneinander gebenchmarkt.

Der erste Aufruf brauch ca. 2 Sekunden, während der zweite Aufruf ca. 3 Minuten (!) braucht. Wie kann so etwas sein?


declare @projectId int = 1537;

Select * from MonitoringGsc_KeywordDevelopment_GetDevelopmentData(@projectId, '2016-08-16 00:00:00', '2016-08-31 00:00:00', 0, 20, N'')

Select * from MonitoringGsc_KeywordDevelopment_GetDevelopmentData(1537, '2016-08-16 00:00:00', '2016-08-31 00:00:00', 0, 20, N'')


3.825 Beiträge seit 2006
vor 7 Jahren

Hallo Christoph,

wenn Du mit Parametern arbeitest wird das SQL Statement nicht jedes Mal neu übersetzt.

Auch kann der SQL Server auf seinen Cache zurückgreifen.

Das der Unterschied aber so groß ist hätte ich nicht gedacht.

Was passiert wenn Du die Reihenfolge umkehrst ?

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 7 Jahren

Wenn ich die Reihenfolge umkehre passiert gar nix.

Mir ist gerade noch aufgefallen, dass wenn ich den Parameter in der Schreibweise änder. Z.B. @projectId2, es ebenfalls ca. 3 Minuten dauert.

Er benutzt dann auch einen anderen Ausführungplan, der wesentlich schlechter ist. Wie kann ich den SQL-Server jedoch dazu bewegen, den besseren Ausführungsplan zu benutzen?

Mir scheint so, als hätte der SQL-Server noch einen Plan im Cache, der wesentlich besser ist, als die Pläne, die er neu erstellt. Aber wie soll ich ihn dazu bringen, diesen Plan wieder zu verwenden/zu generieren?

P
1.090 Beiträge seit 2011
vor 7 Jahren

Schau mal hier:

stackexchange:Re-run a specific actual query plan

Ich würde die Aber davon abraten, das irgendwo Produktive einzuätzen.
Und wenn du es doch verwenden möchtest, dann erst mal in die Materie einarbeiten.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

3.825 Beiträge seit 2006
vor 7 Jahren

Arbeite in C# auf jeden Fall mit Parametern, das kann der SQL Server auch wesentlich besser optimieren.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3