Heute noch einmal, ich habe ein großes Problem mit, wie es scheint, Parameter Sniffing in SQL Server 2005.Irgendwann in Ihrer Karriere mit SQL Server springt Parameter Sniffing einfach heraus und greift an?
Ich habe eine Abfrage einige Ergebnisse mit bekannten gute Ergebnisse zu vergleichen. Ich fügte den Ergebnissen und den bekannten guten Ergebnissen eine Spalte hinzu, so dass ich jeden Monat neue Monatsergebnisse auf beiden Seiten laden und nur den aktuellen Monat vergleichen kann. Die neue Spalte steht zuerst im Clustered-Index, sodass neue Monate zum Ende hinzugefügt werden.
füge ich ein Kriterium meiner WHERE
Klausel - dieser Code generiert wird, so ist es eine literale Konstante:
WHERE DATA_DT_ID = 20081231
- Welche ist überflüssig, weil alle DATA_DT_ID 20.081.231 sind gerade jetzt.
Leistung geht in den Topf. Von 7 Sekunden, um etwa 1,5 m Zeilen bis 2 Stunden zu vergleichen und nichts abzuschließen. Ausführen des generierten SQL direkt in SSMS - keine SPs.
Ich habe SQL Server seit 12 Jahren verwendet und ich hatte noch nie so viele Probleme mit Parameter-Sniffing wie ich auf diesem Produktionsserver seit Oktober hatte (Build Build 9.00.3068.00). Und in jedem Fall ist es nicht, weil es das erste Mal mit einem anderen Parameter ausgeführt wurde oder die Tabelle geändert wurde. Dies ist eine neue Tabelle und sie wird nur mit diesem Parameter oder keiner WHERE
Klausel ausgeführt.
Und nein, ich habe keinen DBA-Zugang, und sie haben mir nicht genug Rechte gegeben, um die Ausführungspläne zu sehen.
Es ist zu dem Punkt, wo ich nicht sicher bin, werde ich in der Lage, mit SQL Server-Benutzer mit nur ein paar Jahren Erfahrung mit diesem System umzugehen.
UPDATE Es stellt sich heraus, dass, obwohl Statistiken behaupten, auf dem neuesten Stand zu sein, das Ausführen von UPDATE STATISTICS WITH FULLSCAN das Problem behebt.
FINAL UPDATE Auch bei der SP neu zu erstellen, unter Verwendung von WITH RECOMPILE und UPDATE STATISTICS, es stellte sich heraus, die Abfrage neu geschrieben werden musste, in einer anderen Art und Weise JOIN mit NULL-Check ein NICHT IN anstelle eines LEFT zu verwenden.
Gibt es hier eine Frage? Klingt wie ein Mecker, Ihre One Where-Klausel verwendet keine Parameter – JoshBerke
Ja, die Frage ist, warum ich nach all den Jahren immer wieder auf diese Probleme stoße - ich denke, die Antwort ist, dass auf diesem Server Statistiken nicht verwaltet werden Genauso wie meine eigenen Server normalerweise oder wie meine Entwicklungs- und Testserver sind. –
Es ist auch mein Verständnis, dass es im Grunde das gleiche Problem ist.Konstanten werden parametrisiert und Ausführungspläne basierend auf den erwarteten Zeilenschätzungen erstellt. –