Daher habe ich festgestellt, dass das fehlerhafte Verhalten meines SQL Servers auf die Standardeinstellung von .Net SqlClient Data Provider von zurückzuführen ist SET ARITHABORT OFF
. Vor diesem Hintergrund habe ich verschiedene Artikel gelesen, in denen der beste Weg zur Umsetzung diskutiert wird. Für mich möchte ich nur einen einfachen Weg, weil SQL Server leidet und meine Abfrageoptimierung nicht vollständig über die App SET
hinausgeht (und das Hinzufügen in einem SP funktioniert natürlich NICHT).
In Erland Sommarskogs brillantem Artikel über das Thema schlägt er grundsätzlich vor, den sicheren Ansatz zu wählen , indem die zu ändernde App SET ARITHABORT ON
für die Verbindung geändert wird . In dieser Antwort auf eine Frage zu dba.stackexchange bietet Solomon Rutzky jedoch sowohl einen instanzweiten als auch einen datenbankweiten Ansatz.
Welche Konsequenzen fehlen mir hier beim Einstellen dieser Instanz? Aus meiner Sicht ... da SSMS dies ON
standardmäßig festgelegt hat, kann es nicht schaden, diese Serverweite ON
für alle Verbindungen festzulegen . Letztendlich brauche ich nur diesen SQL Server, um über alles zu arbeiten.
quelle
ARITHABORT OFF
, dann gut. Halten Sie es für alle eingehenden Verbindungen ausgeschaltet. (Viel Glück beim Kontrollieren). Wenn jedoch eine Verbindung mit der Einstellung ON eingeht, generiert SQL einen neuen Abfrageplan. Dies kann sich auf die Leistung auswirken. Mein Take, setzen Sie es als Standardbenutzeroption auf Instanzebene auf ON und optimieren Sie Abfragen entsprechend.Antworten:
Es gibt einige Standardeinstellungen, nur weil niemand wirklich weiß, wie sich eine Änderung auswirken würde. Beispiel: Die Standardkollation auf Instanzebene bei der Installation auf einem System, das "US-Englisch" als Betriebssystemsprache verwendet
SQL_Latin1_General_CP1_CI_AS
. Dies ist nicht sinnvoll, da dieSQL_*
Sortierungen aus Gründen der Kompatibilität vor SQL Server 2000 dienen. Ab SQL Server 2000 Sie könnten eine Windows - Sortierung tatsächlich wählen und so den Standard für US - Englisch Systeme sollten geändert wurdenLatin1_General_CI_AS
. ABER ich denke, niemand bei Microsoft weiß wirklich, welche Auswirkungen dies auf die verschiedenen potenziellen Subsysteme und gespeicherten Systemprozeduren usw. haben wird.Daher sind mir keine spezifischen negativen Auswirkungen der Einstellung auf ON als Datenbankstandard oder sogar instanzweit bekannt. Gleichzeitig habe ich es nicht getestet. Aber selbst wenn ich es getestet hätte, würde ich möglicherweise nicht dieselben Codepfade wie Ihre Anwendung verwenden. Dies ist also etwas, das Sie wirklich in Ihrer Umgebung testen müssen. Stellen Sie es auf
ON
auf Instanzebene in Ihren Entwicklungs- und QS-Umgebungen und sehen Sie, wie das für ein oder zwei Monate funktioniert. Aktivieren Sie es dann in Staging / UAT. Wenn mehrere Wochen lang alles gut läuft, ändern Sie diese Konfigurationsänderung in Produktion. Der Schlüssel besteht darin, so viel Zeit wie möglich für das Testen verschiedener Codepfade zu geben, die nicht täglich aufgerufen werden. Einige werden wöchentlich oder monatelang oder jährlich getroffen. Einige Codepfade werden nur vom Support oder von einem Ad-hoc-Bericht oder Wartungsprozess getroffen, den jemand vor Jahren erstellt hat und der Ihnen nie davon erzählt hat und der nur in zufälligen Abständen verwendet wird (nein, das passiert nie ;-).Daher habe ich einige Tests an einer Instanz durchgeführt, die immer noch die Standardeinstellung "Benutzeroptionen" hat, da ich sie nie geändert habe.
Bitte beachten Sie:
@@OPTIONS
/'user options'
ist ein bitmaskender WertARITHABORT ON
INSTALLIEREN
Ich habe sowohl mit SQLCMD (das ODBC verwendet) als auch mit LINQPad (das .NET SqlClient verwendet) getestet:
(Dies
^
ist das DOS-Zeilenfortsetzungszeichen. Das.
in der letzten Zeile dient nur dazu, die zusätzliche Zeile zu erzwingen, um das Kopieren und Einfügen zu vereinfachen.)In LINQPad:
TEST 1: Vorher
SQLCMD gibt zurück:
LINQPad gibt Folgendes zurück:
STANDARDVERBINDUNGSOPTION ÄNDERN:
Das folgende T-SQL wird aktiviert,
ARITHABORT
ohne dass andere Optionen entfernt werden, die möglicherweise festgelegt wurden, und ohne dass etwasARITHABORT
geändert wird , wenn dies bereits im bitmaskenen Wert festgelegt ist.TEST 2: Nachher
SQLCMD gibt zurück:
LINQPad gibt Folgendes zurück:
Fazit
Vorausgesetzt, dass:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, daher akzeptieren sie die StandardeinstellungIch würde vorschlagen, die instanzweiten Standardverbindungsoptionen zu ändern (wie oben gezeigt). Dies wäre weniger aufdringlich als das Aktualisieren der Anwendung. Ich würde die App nur aktualisieren, wenn Sie ein Problem beim Ändern der instanzweiten Einstellung finden.
PS Ich habe einen einfachen Test durchgeführt, bei dem die instanzweite Einstellung geändert
tempdb
und nicht geändert wurde, und es schien nicht zu funktionieren.quelle
SET ARITHABORT OFF
ist nicht vorhanden. Warum also Sorgen machen, dass es vorhanden ist? Die einzige Instanz, bei der wir gesehen haben, dass der Standardwert überschrieben wird, ist die SSMS-EinstellungON
(was gut ist). In beiden Fällen habe ich meine Antwort mit Tests und der meiner Meinung nach logischsten Empfehlung (gemäß den vorhandenen Informationen) aktualisiert.ARITHABORT OFF
wenn Sie tatsächliche Vorkommnisse finden. Bisher gibt es wahrscheinlich keine. 3) Da dies Abfragepläne betrifft, könnte es sein, dass die Tabellen nie über genügend Daten verfügten, um SQL Server zu veranlassen, bestimmte Auswahlmöglichkeiten zu berücksichtigen, wobei jetzt mehr Auswahlmöglichkeiten vorhanden sind und einige schlecht sind. Oder vielleicht gibt es andere vorübergehende Faktoren, wie veraltete Statistiken usw. Nicht ganz sicher.