Heim >Datenbank >MySQL-Tutorial >Warum treten bei meiner gespeicherten Prozedur auch mit einem NULL-Parameter Leistungsprobleme auf, und wie kann ich das beheben?

Warum treten bei meiner gespeicherten Prozedur auch mit einem NULL-Parameter Leistungsprobleme auf, und wie kann ich das beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-21 15:18:11328Durchsuche

Why Does My Stored Procedure Suffer Performance Issues Even with a NULL Parameter, and How Can I Fix It?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn