Problem: eine bestimmte DB-Abfrage (stored procedure mit einem INSERT und joins auf diverse Tabellen) dauert morgens wesentlich länger als tagsüber (40 statt 10 Minuten). Ich habe schon folgende DInge getestet/festgestellt/ausprobiert während den (langsamen) Morgenstunden:
-
die Verlangsamung ist gleichverteilt über 1,5 Stunden für mehrere 1000 Abfragen.
-
es laufen keine anderen DB-Abfragen (Test mit Applikation, Profiler, sp_who2)
-
es laufen keine anderen Prozesse auf dem Server als der SQL Server selbst (die nennenswerte CPU Zeit ziehen) - sonst wäre die Verlangsam auch etwas gleichverteilt auf alle Abfragen in dieser Zeit.
-
es laufen keine Optimierungsaufträge/KOmmandos (rebuild index, update statistics, recompile object) zwischen dem langsamen Morgen und dem schnelleren Tag.
-
EIn Teil der Läufe habe ich auch mal Morgens deaktiviert und erst Mittags laufen lassen => trotzdem MIttags schneller => caching sollte keine Rolle spielen.
-
Caching sollte keine Rolle spielen, da bei mehreren hundert/tausend Aufrufen der gleichen Prozedur nach kurzer Zeit die optimale Performance erzielt werden.
-
Bei den hundert/tausend Aufrufen sind die Ergebnisdatenmengen bunt gemischt - auch MIttags. Es gibt keine Zusammenhänge zwischen den Datenmengen under Verlangsamung.
-
EIn detailiertes tracen mit SQL Profiler hat gezeigt, dass morgens wesentlich höhere Werte in der Spalte „Lesevorgänge“ (340.000 statt 3.100!; CPU: 2031 statt 32 für einen bestimmten Job) angezeigt werden. Nur: der Aufruf der stored procedure ist exakt der gleiche (d.h. gleiche Parameter) und die Quell- und Zieldatenmengen sind die gleichen wie bei der Mittagsabfrage.
=> leider komme ich nun nicht mehr weiter, wodurch diese hohe Zahl der Lesevorgänge verursacht wird.
Hat jemand noch eine Idee?