Umgehung von Parameter-Sniffing


8

Ich habe in der Vergangenheit zwei Methoden verwendet, um Probleme mit dem Parameter-Sniffing zu umgehen:

1) Verwenden Sie WITH RECOMPILE
2) Weisen Sie den lokalen Variablen Parameterwerte neu zu und verwenden Sie diese anstelle der Parameter

Soweit ich weiß, ist das Endergebnis von beiden dasselbe - ein neuer Ausführungsplan, der für die aktuelle Abfrage / Parameter optimiert ist, wird erstellt und verwendet.

Wenn dies zutrifft, gibt es Unterschiede zwischen diesen beiden Methoden oder sind sie im Wesentlichen gleich? Ist einer dem anderen vorzuziehen?

Antworten:


3

Wenn Sie typische Werte antizipieren können, führen Sie Ihre gespeicherte Prozedur mit solchen Werten aus, wenn Sie sie (neu) erstellen. Basierend auf diesen Werten wird ein Ausführungsplan erstellt und für die zukünftige Verwendung gespeichert. Die meisten meiner gespeicherten Prozedurdateien .sqlenden mit einem EXECBefehl mit angemessenen Werten, genau zu diesem Zweck (um grundlegende Fehler im Code zu identifizieren).

Dies hilft natürlich nicht, wenn Ihre gespeicherte Prozedur sehr lange läuft und Sie sie während der Produktionsstunden nicht angemessen ausführen können. Beachten Sie, dass es nicht ausreicht, den Job zu starten , sondern erfolgreich abgeschlossen werden muss, damit ein Plan gespeichert werden kann.


4
  1. WITH RECOMPILE

Das ist ein bisschen ein Vorschlaghammer. Es kompiliert jede Anweisung im Modul neu. Die Verwendung OPTION (RECOMPILE)der parameterempfindlichen Anweisungen ist eine gezieltere Lösung.

  1. Weisen Sie lokalen Variablen Parameterwerte zu und verwenden Sie diese anstelle der Parameter

Dies hat den gleichen Effekt wie OPTIMIZE FOR UNKNOWNein Plan, der auf Durchschnittswerten basiert. Der Plan wird nicht bei jeder Ausführung neu kompiliert.

Weitere Informationen finden Sie in meinem Artikel Parameter Sniffing, Embedding und den RECOMPILE-Optionen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.