Ich würde argumentieren, dass dies mit ziemlicher Sicherheit Parameter-Sniffing war.
Es wird häufig angegeben, dass SET OPTIONS
sich dies auf die Leistung auswirken kann, es ist jedoch noch keine einzige maßgebliche Quelle für diese Behauptung vorhanden, mit Ausnahme des Falls, dass Sie indizierte Ansichten / persistierte berechnete Spalten verwenden.
In diesem Fall (für SQL2005 + und sofern sich Ihre Datenbank nicht im SQL2000-Kompatibilitätsmodus befindet ). Wenn Sie beides haben ARITHABORT
und ANSI_WARNINGS
OFF
dann feststellen, dass der Index nicht verwendet wird, wird möglicherweise eher ein Scan als der gewünschte Suchvorgang ausgeführt (und ein gewisser Overhead, da das dauerhafte Berechnungsergebnis nicht verwendet werden kann). ADO.NET scheint standardmäßig ANSI_WARNINGS ON
einen kurzen Test zu haben, den ich gerade durchgeführt habe.
Die Behauptung in Bens Antwort, dass "die Art und Weise, wie der Server numerische Berechnungen durchführt", einem Ergebnis Minuten hinzufügen kann, das sonst weniger als eine Sekunde dauern würde, scheint mir einfach nicht glaubwürdig. Ich denke, was dazu neigt, ist, dass bei der Untersuchung eines Performance-Performance-Problems der Profiler verwendet wird, um die störende Abfrage zu identifizieren. Dies wird in Management Studio eingefügt und ausgeführt und liefert sofort Ergebnisse. Der einzige offensichtliche Unterschied zwischen den Anschlüssen ist die ARITH_ABORT
Option.
Ein schneller Test in einem Management Studio-Fenster zeigt, dass, wenn SET ARITHABORT OFF
aktiviert und die Abfrage ausgeführt wird, das Leistungsproblem erneut auftritt und der Fall anscheinend geschlossen ist. In der Tat scheint dies die im Gregg Stark- Link verwendete Fehlerbehebungsmethode zu sein .
Dies ignoriert jedoch die Tatsache, dass Sie mit dieser Option den exakt gleichen fehlerhaften Plan aus dem Cache erhalten können .
Diese Planwiederverwendung kann auch dann auftreten, wenn Sie als ein anderer Benutzer angemeldet sind, als von der Anwendungsverbindung verwendet wird.
Ich habe dies getestet, indem ich eine Testabfrage zuerst von einer Webanwendung aus SET ARITHABORT OFF
und dann von Management Studio mit ausgeführt habe. Dabei konnte ich feststellen, dass die Anzahl der Verwendungszwecke von der folgenden Abfrage abweicht.
SELECT usecounts, cacheobjtype, objtype, text ,query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Damit diese Freigabe von Plänen tatsächlich erfolgt, müssen alle Plan-Cache-Schlüssel gleich sein. Neben arithabort
sich die ausführenden Benutzer benötigen die gleiche Standardschema einige andere Beispiele sind (wenn die Abfrage auf implizite Namensauflösung beruht) und die Verbindungen müssen den gleichen language
Satz.
Eine ausführlichere Liste der Plan-Cache-Schlüssel finden Sie hier