Ich versuche, ein Problem mit SQL Server 2000 zu verstehen. Wir sind eine Website mit moderaten Transaktionen und haben einen gespeicherten Prozess, sp_GetCurrentTransactions
der eine Kunden- ID und zwei Daten akzeptiert.
Jetzt kann diese Abfrage je nach Datum und Kunde einen Wert zwischen null und 1000 Zeilen zurückgeben.
Das Problem: Was wir erlebt haben, ist, dass wir plötzlich eine Reihe von Fehlern (normalerweise Execution Timeout Expired
oder ähnlich) für einen bestimmten Client erhalten, während sie versuchen, diesen gespeicherten Prozess auszuführen. Wir untersuchen die Abfrage, führen sie in SSMS aus und stellen fest, dass sie 30 Sekunden dauert. Also kompilieren wir den gespeicherten Prozess neu und -bang- läuft jetzt in 300ms.
Ich habe mit unserem DBA darüber gesprochen. Er hat mir gesagt, dass die Datenbank einen Abfrageplan erstellt hat, als wir den gespeicherten Prozess erstellt haben. Er sagte, es sei ein guter Plan für diesen Parametersatz, aber wenn Sie einen bestimmten Parametersatz darauf anwenden, wird der Plan nicht der beste Plan für diese Daten sein, und Sie werden sehen, dass er langsam abläuft.
Die Optionen, die mir angeboten werden, sind das Verschieben der Problemabfrage von einem gespeicherten Prozess in dynamisches SQL, dessen Ausführungsplan bei jedem Durchlauf erstellt wird.
Dies fühlt sich wie ein Schritt zurück zu mir an und ich fühle, dass es einen Weg geben muss, dies zu umgehen. Gibt es eine andere Möglichkeit, mit diesem Problem umzugehen?
Alle Antworten sind willkommen.