J'ai donc déterminé que le comportement erratique de mon SQL Server est dû au paramètre par défaut du fournisseur de données .Net SqlClient SET ARITHABORT OFF
. Cela dit, j'ai lu divers articles qui débattent de la meilleure façon de mettre en œuvre cela. Pour moi, je veux juste un moyen facile parce que SQL Server souffre et que le réglage de ma requête n'a pas complètement transcendé dans l'application (et évidemment, l'ajout SET
d'un dans un sp ne fonctionne pas).
Dans le brillant article d' Erland Sommarskog sur le sujet, il suggère essentiellement d'adopter une approche sûre en modifiant l'application à émettre SET ARITHABORT ON
pour la connexion. Cependant, dans cette réponse d'une question dba.stackexchange , Solomon Rutzky propose à la fois une approche à l'échelle de l'instance et à l'échelle de la base de données.
Quelles sont les ramifications qui me manquent ici avec la définition de cette instance à l'échelle? Comme je le vois ... puisque SSMS a cet ensemble ON
par défaut, je ne vois aucun mal à définir ce ON
serveur pour toutes les connexions. À la fin de la journée, j'ai juste besoin de ce serveur SQL pour fonctionner avant tout.
la source
ARITHABORT OFF
, alors très bien. Gardez-le éteint pour toutes les connexions entrantes. (Bonne chance pour contrôler ça). Mais lorsqu'une connexion arrive avec elle définie sur ON, SQL génère un nouveau plan de requête et cela peut affecter les performances. Ma prise, définissez-la sur ON comme option utilisateur par défaut au niveau de l'instance et ajustez les requêtes en conséquence.Réponses:
Il y a des défauts qui existent simplement parce que personne ne sait vraiment quel serait l'effet de les changer. Par exemple, le classement au niveau de l'instance par défaut lors de l'installation sur un système qui utilise "US English" comme langue du système d'exploitation
SQL_Latin1_General_CP1_CI_AS
. Cela n'a aucun sens puisque lesSQL_*
classements sont pour la compatibilité pré-SQL Server 2000. À partir de SQL Server 2000, vous pouvez réellement choisir un classement Windows, et la valeur par défaut pour les systèmes en anglais américain aurait donc dû être remplacée parLatin1_General_CI_AS
. MAIS, je suppose que personne chez Microsoft ne sait vraiment quel sera l'impact sur tous les différents sous-systèmes potentiels et procédures stockées, etc.Donc, je ne suis au courant d'aucun impact négatif spécifique de sa définition sur ON comme valeur par défaut de la base de données ou même à l'échelle de l'instance. En même temps, je ne l'ai pas testé. Mais même si je l'avais testé, je n'utiliserais peut-être pas les mêmes chemins de code que votre application, c'est donc quelque chose que vous devez vraiment tester dans votre environnement. Réglez-le sur
ON
au niveau de l'instance dans vos environnements Dev et QA et voyez comment cela fonctionne pendant un mois ou deux. Activez-le ensuite dans Staging / UAT. Si tout se passe bien pendant plusieurs semaines, passez ce changement de configuration à Production. La clé est de donner autant de temps que possible pour tester différents chemins de code qui ne sont pas touchés quotidiennement. Certains sont frappés chaque semaine ou mois ou annuellement. Certains chemins de code ne sont atteints que par le support, ou par un rapport ad hoc ou un processus de maintenance que quelqu'un a créé il y a des années et ne vous en a jamais parlé et n'est utilisé qu'à des intervalles aléatoires (non, cela ne se produit jamais ;-).J'ai donc fait des tests sur une instance qui a toujours le paramètre par défaut "options utilisateur" car je ne l'ai jamais changé.
Notez s'il vous plaît:
@@OPTIONS
/'user options'
est une valeur masquée par bitARITHABORT ON
INSTALLER
J'ai testé à la fois SQLCMD (qui utilise ODBC) et LINQPad (qui utilise .NET SqlClient):
(le
^
est le caractère de continuation de la ligne DOS; le.
sur la dernière ligne est juste pour forcer la ligne supplémentaire pour faciliter le copier-coller)Dans LINQPad:
TEST 1: Avant
SQLCMD renvoie:
LINQPad renvoie:
MODIFIER L'OPTION DE CONNEXION PAR DÉFAUT:
Le T-SQL suivant permet
ARITHABORT
sans supprimer d'autres options qui pourraient être définies et sans rien changer s'ilARITHABORT
est déjà défini dans la valeur masquée par bit.TEST 2: Après
SQLCMD renvoie:
LINQPad renvoie:
Conclusion
Étant donné que:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, donc ils acceptent le paramètre par défautJe suggère de modifier les options de connexion par défaut à l'échelle de l'instance (comme indiqué ci-dessus). Ce serait moins gênant que la mise à jour de l'application. Je ne mettrais à jour l'application que si vous rencontrez un problème avec la modification du paramètre à l'échelle de l'instance.
PS J'ai fait un test simple avec changer
tempdb
et ne pas changer le paramètre à l'échelle de l'instance et cela ne semble pas fonctionner.la source
SET ARITHABORT OFF
n'est pas le cas . Alors pourquoi s'inquiéter de sa présence? la seule instance où nous avons vu où la valeur par défaut est remplacée est SSMS la définissant surON
(ce qui est une bonne chose). Quoi qu'il en soit, j'ai mis à jour ma réponse avec des tests et ce que je considère comme la recommandation la plus logique (selon les informations existantes).ARITHABORT OFF
si vous en trouvez des incidences réelles. Jusqu'à présent, il n'y en a probablement pas. 3) Étant donné que cela affecte les plans de requête, il se peut que les tables n'aient jamais eu suffisamment de données pour que SQL Server ait certains choix à considérer, où il y a maintenant plus de choix et certains sont mauvais. Ou peut-être qu'il existe d'autres facteurs transitoires, tels que des statistiques obsolètes, etc. Pas tout à fait sûr.