Stwierdziłem więc, że nieprawidłowe działanie mojego SQL Server wynika z domyślnego ustawienia .Net SqlClient Data Provider na SET ARITHABORT OFF
. Powiedziawszy to, czytałem różne artykuły, które debatują o najlepszym sposobie realizacji tego. Dla mnie chcę po prostu łatwego sposobu, ponieważ cierpi SQL Server, a moje dostrajanie zapytań nie zostało w pełni przekroczone w całej aplikacji (i oczywiście dodanie SET
IN SP NIE DZIAŁA).
W genialnym artykule Erlanda Sommarskoga na ten temat zasadniczo sugeruje bezpieczne podejście, zmieniając aplikację tak, aby wydawała SET ARITHABORT ON
połączenie. Jednak w tej odpowiedzi na pytanie dba.stackexchange Solomon Rutzky oferuje zarówno podejście do całej instancji, jak i do bazy danych.
Jakich konsekwencji brakuje mi tutaj przy ustawianiu tego całego wystąpienia? Jak widzę ... ponieważ SSMS ma ten zestaw ON
domyślnie, nie widzę żadnej szkody w ustawieniu tego ON
serwera dla wszystkich połączeń. Na koniec potrzebuję tylko tego SQL Servera, aby działał ponad wszystko.
źródło
ARITHABORT OFF
, to dobrze. Nie wyłączaj wszystkich połączeń przychodzących. (Powodzenia w kontrolowaniu tego). Ale gdy pojawia się połączenie z ustawionym na WŁĄCZONE, SQL generuje nowy plan zapytań, co może mieć wpływ na wydajność. Moje podejście, ustaw je jako domyślną opcję użytkownika na poziomie instancji i odpowiednio dostosuj zapytania.Odpowiedzi:
Istnieją pewne domyślne ustawienia, ponieważ nikt tak naprawdę nie wie, jaki byłby skutek ich zmiany. Na przykład domyślne sortowanie na poziomie instancji podczas instalacji w systemie, który używa języka „US English” jako języka systemu operacyjnego
SQL_Latin1_General_CP1_CI_AS
. Nie ma to sensu, ponieważSQL_*
zestawienia dotyczą zgodności z wersją wcześniejszą niż SQL Server 2000. Począwszy od SQL Server 2000 można właściwie wybrać sortowanie w systemie Windows, dlatego domyślne ustawienie dla systemów w języku angielskim w USA powinno zostać zmienione naLatin1_General_CI_AS
. ALE, myślę, że nikt w Microsoft naprawdę nie wie, jaki będzie wpływ na wszystkie potencjalne podsystemy i procedury przechowywane w systemie itp.Tak więc nie jestem świadomy żadnego konkretnego negatywnego wpływu ustawienia go na ON jako domyślną bazę danych lub nawet na całą instancję. Jednocześnie go nie testowałem. Ale nawet gdybym go przetestował, nadal mogę nie używać tych samych ścieżek kodu co Twoja aplikacja, więc jest to coś, co naprawdę musisz przetestować w swoim środowisku. Ustaw na
ON
na poziomie instancji w środowiskach deweloperów i kontroli jakości i zobacz, jak to działa przez miesiąc lub dwa. Następnie włącz to w Staging / UAT. Jeśli wszystko pójdzie dobrze przez kilka tygodni, przenieś tę zmianę konfiguracji do Produkcji. Kluczem jest poświęcenie jak największej ilości czasu na przetestowanie różnych ścieżek kodu, które nie są trafiane codziennie. Niektóre trafiają co tydzień lub miesiące lub co roku. Niektóre ścieżki kodu są dotknięte jedynie wsparciem lub raportem ad hoc lub procesem konserwacji, o którym ktoś utworzył lata temu i o którym nigdy nie mówił, i przyzwyczaja się tylko w przypadkowych odstępach czasu (nie, to się nigdy nie zdarza ;-).Przeprowadziłem więc testy na instancji, która wciąż ma domyślne ustawienie „opcji użytkownika”, ponieważ nigdy go nie zmieniłem.
Proszę zanotować:
@@OPTIONS
/'user options'
jest wartością maski bitowejARITHABORT ON
USTAWIAĆ
Testowałem zarówno z SQLCMD (który używa ODBC), jak i LINQPad (który używa .NET SqlClient):
(
^
jest to znak kontynuacji linii DOS; w.
ostatnim wierszu jest tylko wymuszenie dodatkowej linii, aby ułatwić kopiowanie i wklejanie)W LINQPad:
TEST 1: Przedtem
SQLCMD zwraca:
LINQPad zwraca:
ZMIEŃ DOMYŚLNĄ OPCJĘ POŁĄCZENIA:
Poniższy T-SQL włącza
ARITHABORT
bez usuwania innych opcji, które mogą być ustawione, i bez zmiany czegokolwiek, jeśliARITHABORT
jest już ustawiony w wartości maski bitowej.TEST 2: Po
SQLCMD zwraca:
LINQPad zwraca:
Wniosek
Jeśli się uwzględni:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, dlatego akceptują ustawienie domyślneSugerowałbym zmianę domyślnych opcji połączenia dla całej instancji (jak pokazano powyżej). Byłoby to mniej nachalne niż aktualizowanie aplikacji. Zaktualizowałbym aplikację tylko wtedy , gdy znajdziesz problem ze zmianą ustawień dla całej instancji.
PS Zrobiłem prosty test, zmieniając
tempdb
i nie zmieniając ustawienia dla całej instancji i nie działało.źródło
SET ARITHABORT OFF
to nie występuje. Więc po co się martwić, że będzie obecny? jedynym przypadkiem, w którym widzieliśmy miejsce, w którym wartość domyślna jest zastępowana, jest ustawienie SSMS naON
(co jest dobrą rzeczą). Tak czy inaczej zaktualizowałem swoją odpowiedź testowaniem i tym, co uważam za najbardziej logiczną rekomendację (na podstawie istniejących informacji).ARITHABORT OFF
jeśli znajdziesz jakieś rzeczywiste przypadki. Do tej pory prawdopodobnie nie ma żadnych. 3) Ponieważ wpływa to na plany zapytań, być może tabele nigdy nie miały wystarczającej ilości danych, aby SQL Server miał pewne opcje do rozważenia, w których teraz jest więcej możliwości, a niektóre są złe. A może istnieją inne czynniki przejściowe, takie jak nieaktualne statystyki itp. Nie do końca pewne.