Parameter-Sniffing und Leistung des Ausführungsplans für gespeicherte Prozeduren
Bei einer gespeicherten Prozedur treten Leistungsprobleme auf, wenn sie mit @MyDate als NULL ausgeführt wird, obwohl die Der generierte Ausführungsplan ist nicht optimal. Dieses Problem besteht weiterhin, unabhängig davon, ob @MyDate tatsächlich NULL ist oder durch eine IF-Anweisung auf den aktuellen Zeitstempel gesetzt wird.
Der problematische Ausführungsplan wird vermutlich durch Parameter-Sniffing verursacht, auf dessen Grundlage SQL Server die gespeicherte Prozedur kompiliert die zum Zeitpunkt der Kompilierung bereitgestellten Parameterwerte. In diesem Fall tritt das Problem jedoch auch dann auf, wenn der Parameter NULL ist, was im Widerspruch zu typischen Parameter-Sniffing-Szenarien steht.
Das Deaktivieren des Parameter-Sniffings durch Spoofing des Parameters (@MyDate_Copy) behebt das Problem. Dies deutet darauf hin, dass der Server einen falschen Ausführungsplan verwendet, der auf einem willkürlichen NULL-Wert basiert.
Einblick in das Phänomen
Laut der akzeptierten Antwort Parameter-Sniffing in SQL Es ist bekannt, dass Server 2005 Probleme aufweist, die zu schlechten Ausführungsplänen führen können. Es wird spekuliert, dass der Server einen ineffektiven Plan basierend auf nicht repräsentativen Parameterwerten generiert, selbst wenn der Parameter NULL ist. Darüber hinaus wurden Probleme mit LEFT JOINs und NULLs beobachtet, die durch deren Ersetzung durch NOT IN oder NOT EXISTS behoben wurden.
Lösung
Für SQL Server 2008 gilt das Die Option FÜR UNBEKANNTES OPTIMIEREN kann verwendet werden, um das Problem zu beheben.
Das obige ist der detaillierte Inhalt vonWarum treten bei meiner gespeicherten Prozedur auch mit einem NULL-Parameter Leistungsprobleme auf, und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!