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'')
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
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?
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:
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