Schlechte Leistung gespeicherter Prozeduren aufgrund von Parameter-Sniffing
Sie stoßen auf Leistungsprobleme mit einer gespeicherten Prozedur, bei der ein Eingabeparameter (@MyDate) kann NULL oder ein Datum sein. Wenn die Prozedur zum ersten Mal mit @MyDate als NULL kompiliert wird, weisen nachfolgende Ausführungen unabhängig vom tatsächlichen Parameterwert eine schlechte Leistung auf.
Parameter-Sniffing-Verhalten
SQL Server führt „parameter Sniffing“, um Ausführungspläne basierend auf den Parameterwerten während der Kompilierung zu optimieren. Diese Werte werden im Prozedurcache erfasst und zur Schätzung zukünftiger Ausführungen verwendet.
In diesem Fall verursacht das Parameter-Sniffing das Problem, da es einen suboptimalen Ausführungsplan für alle Parameterwerte generiert, wenn @MyDate anfänglich NULL ist. Auch wenn @MyDate zur Ausführungszeit explizit auf NULL gesetzt wird, bleibt der zwischengespeicherte Plan bestehen.
Parameter-Sniffing deaktivieren
Sie sind auf das klassische Symptom des „Parameter-Sniffing“ gestoßen „schlecht geworden“, wobei der für die anfänglichen Parameterwerte erstellte Plan auch dann verwendet wird, wenn diese nicht repräsentativ für die tatsächlichen Ausführungen sind. Um das Parameter-Sniffing zu deaktivieren, haben Sie den Parameter mit @MyDate_Copy gefälscht.
Ursache und Lösung
Das Problem ist auf einen SQL Server 2005-Fehler zurückzuführen, bei dem das Parameter-Sniffing zu Fehlfunktionen führen kann. In SQL Server 2008 können Sie dieses Problem entschärfen, indem Sie die Option OPTIMIZE FOR UNKNOWN verwenden, die den Optimierer dazu zwingt, bei der Plankompilierung alle möglichen Werte für den Parameter zu berücksichtigen.
Zusätzliche Erkenntnisse
Das obige ist der detaillierte Inhalt vonWie kann ich eine schlechte Leistung gespeicherter Prozeduren beheben, die durch Parameter-Sniffing in SQL Server verursacht wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!