Vor einiger Zeit hatte ich eine Abfrage, die ich ziemlich oft für einen meiner Benutzer ausführte. Sie wurde immer noch weiterentwickelt und optimiert, aber schließlich stabilisierte sie sich und lief recht schnell, so dass wir daraus eine gespeicherte Prozedur erstellten.
So weit, so normal.
Die gespeicherte Prozedur war jedoch sehr langsam. Kein wesentlicher Unterschied zwischen der Abfrage und der Prozedur, aber die Geschwindigkeitsänderung war massiv.
(Hintergrund: Wir arbeiten mit SQL Server 2005.)
Ein freundlicher lokaler DBA (der nicht mehr hier arbeitet) warf einen Blick auf die gespeicherte Prozedur und sagte: "Parameter-Spoofing!" ( Editar: obwohl es anscheinend auch als "Parameter Sniffing" bekannt ist, was die geringe Anzahl von Google-Treffern erklären könnte, als ich versuchte, danach zu suchen).
Wir haben einen Teil der gespeicherten Prozedur in eine zweite abstrahiert, den Aufruf dieser neuen inneren Prozedur in die bereits vorhandene äußere Prozedur eingeschlossen, die äußere Prozedur aufgerufen und siehe da, sie war genauso schnell wie die ursprüngliche Abfrage.
Also, was ist los? Kann jemand Parameter-Spoofing erklären?
Bonuspunkte für
- Hervorhebung, wie man sie vermeiden kann
- Vorschläge zur Erkennung möglicher Ursachen
- alternative Strategien, z. B. Statistiken, Indizes, Schlüssel, zur Entschärfung der Situation zu diskutieren