Portanto, determinei que o comportamento irregular do meu SQL Server se deve à configuração padrão de .Net SqlClient Data Provider SET ARITHABORT OFF
. Com isso dito, li vários artigos que debatem a melhor maneira de implementar isso. Para mim, eu só quero uma maneira fácil, porque o SQL Server está sofrendo e meu ajuste de consulta não transcendeu completamente no aplicativo (e, obviamente, adicionar o SET
sp não funciona).
No brilhante artigo de Erland Sommarskog sobre o assunto, ele basicamente sugere uma abordagem segura, alterando o aplicativo para emitir SET ARITHABORT ON
a conexão. No entanto, nesta resposta de uma pergunta do dba.stackexchange , Solomon Rutzky oferece uma abordagem para toda a instância e para o banco de dados.
Que ramificações estou faltando aqui ao definir essa instância para todo? A meu ver ... como o SSMS tem esse conjunto ON
por padrão, não vejo mal em configurar esse ON
servidor para todas as conexões. No final do dia, eu só preciso desse SQL Server para executar acima de tudo.
fonte
ARITHABORT OFF
, então tudo bem. Mantenha-o desligado para todas as conexões de entrada. (Boa sorte em controlar isso). Porém, quando uma conexão entra em ON, o SQL gera um novo plano de consulta e isso pode afetar o desempenho. Minha opinião, ative-a como a opção de usuário padrão no nível da instância e ajuste as consultas adequadamente.Respostas:
Existem alguns padrões simplesmente porque ninguém sabe realmente qual seria o efeito de alterá-los. Por exemplo, o agrupamento padrão no nível da instância ao instalar em um sistema que usa "inglês dos EUA" como o idioma do sistema operacional
SQL_Latin1_General_CP1_CI_AS
. Isso não faz sentido, pois osSQL_*
agrupamentos são para compatibilidade anterior ao SQL Server 2000. A partir do SQL Server 2000, era possível escolher um agrupamento do Windows e, portanto, o padrão para sistemas em inglês dos EUA deveria ter sido alterado paraLatin1_General_CI_AS
. MAS, acho que ninguém na Microsoft sabe realmente qual será o impacto para todos os vários subsistemas potenciais e procedimentos armazenados do sistema etc.Portanto, não conheço nenhum impacto negativo específico de configurá-lo como LIGADO como um padrão de banco de dados ou mesmo para toda a instância. Ao mesmo tempo, eu não testei. Mas, mesmo que eu o tenha testado, talvez ainda não use os mesmos caminhos de código que seu aplicativo, portanto, isso é algo que você realmente precisa testar em seu ambiente. Defina como
ON
no nível da instância em seus ambientes Dev e QA e veja como isso funciona por um mês ou dois. Em seguida, ative-o no armazenamento temporário / UAT. Se tudo continuar funcionando por várias semanas, role essa alteração de configuração para Produção. A chave é conceder o máximo de tempo possível para testar vários caminhos de código que não são atingidos diariamente. Alguns são atingidos semanalmente ou meses ou anualmente. Alguns caminhos de código são atingidos apenas pelo suporte ou por algum relatório ad hoc ou processo de manutenção que alguém criou anos atrás e nunca lhe contou e só é usado em intervalos aleatórios (nah, isso nunca acontece ;-).Portanto, fiz alguns testes em uma instância que ainda possui a configuração "opções do usuário" padrão, pois nunca a alterei.
Observe:
@@OPTIONS
/'user options'
é um valor mascaradoARITHABORT ON
CONFIGURAÇÃO
Testei com o SQLCMD (que usa ODBC) e o LINQPad (que usa o .NET SqlClient):
(o
^
é o caractere de continuação de linha do DOS; o.
da última linha é apenas para forçar a linha extra para facilitar a copiar e colar)No LINQPad:
TESTE 1: Antes
SQLCMD retorna:
O LINQPad retorna:
MUDAR A OPÇÃO DE CONEXÃO PADRÃO:
O T-SQL a seguir é ativado
ARITHABORT
sem remover nenhuma outra opção que possa ser definida e sem alterar nada, seARITHABORT
já estiver definido no valor de máscara de bit.TESTE 2: Depois
SQLCMD retorna:
O LINQPad retorna:
Conclusão
Dado que:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, portanto eles aceitam a configuração padrãoEu sugeriria alterar as opções de conexão padrão para toda a instância (como mostrado acima). Isso seria menos invasivo do que atualizar o aplicativo. Eu atualizaria o aplicativo apenas se você encontrar um problema ao alterar a configuração de toda a instância.
PS: Fiz um teste simples alterando
tempdb
e não alterando a configuração de toda a instância e ela não pareceu funcionar.fonte
SET ARITHABORT OFF
está presente. Então, por que se preocupar com a presença? a única instância que vimos em que o padrão é substituído é o SSMS configurando-o para (o que é uma coisa boa). De qualquer maneira, atualizei minha resposta com testes e o que considero a recomendação mais lógica (por informações existentes).ON
ARITHABORT OFF
se encontrar alguma incidência real dela. Até agora, provavelmente não há. 3) Como isso afeta os planos de consulta, pode ser que as tabelas nunca tenham dados suficientes para fazer com que o SQL Server tenha certas opções a serem consideradas, onde agora há mais opções e algumas são ruins. Ou talvez haja outros fatores transitórios, como estatísticas desatualizadas, etc. Não há muita certeza.