Riscos de mudar para ARITHABORT ON

12

Estou trabalhando com um fornecedor com o acordo de que eles fornecem o aplicativo principal e posso criar minhas próprias extensões desde que não modifique o aplicativo principal. Ele é integrado ao ColdFusion, conectando-se a um banco de dados do SQL Server 2005.

Alguns dos relatórios que eu construí dependem das visualizações usando funções calculadas a partir das tabelas principais, e os relatórios estão ficando muito lentos à medida que as tabelas aumentam. Para acelerar os relatórios, desejo usar visualizações indexadas . Mas, depois de criar uma exibição indexada em meu ambiente de teste, o aplicativo principal não pôde mais ser inserido nas tabelas principais (ele retornou uma mensagem de erro que ARITHABORTé necessária ao ONusar as exibições indexadas).

Portanto, parece que, para usar visualizações indexadas, preciso ter o aplicativo principal SET ARITHABORT ONsempre que inserir / atualizar as tabelas principais. Eu executei isso no meu ambiente de teste:

ALTER DATABASE MyDatabase SET ARITHABORT ON;

e parece funcionar bem. Mas meu fornecedor diz que, como o aplicativo tem milhares de consultas, pode haver um risco de que essa configuração possa interromper uma dessas consultas e, se tivermos algum problema inesperado no banco de dados, eles insistirão em que eu restaure a configuração padrão.

Existem consultas reais que seriam quebradas SET ARITHABORT ON? Existe alguma situação em que seria melhor mantê-lo OFF?

TL; DR Para que minhas novas exibições indexadas funcionem, preciso definir ARITHABORT ONo banco de dados inteiro, mas meu fornecedor avisa que será por minha conta e risco. Existe realmente um risco?

krubo
fonte

Respostas:

9

Então, SET ARITHABORT ON basicamente diz "se ocorrer um erro de divisão por zero ou ocorrer um estouro aritmético anula a consulta" Esse é geralmente um comportamento desejável e é a configuração padrão da instância. Se isso causar problemas nas consultas do seu fornecedor, eu diria que eles podem estar sofrendo de alguns problemas de codificação, para começar. Eu pediria a eles mais detalhes sobre por que eles estão preocupados aqui.

De todas as regras de exibições indexadas , eu chamaria isso e muitas das regras de opções definidas são as menos controversas.

Isso teria que ser definido nas conexões que interagem com a exibição. Então, você gostaria de trabalhar com o fornecedor e realmente tentar entender o raciocínio deles e tentar fazer com que eles se comprometam com o que estão pensando na grande discordância aqui.

Dito isto - visualizações indexadas são um grande problema. Eles têm outras regras e podem afetar o aplicativo e as suposições que os desenvolvedores do fornecedor tinham ao criar e testar o desempenho. Você realmente deve ter uma conversa com eles sobre o problema de negócios que está tentando resolver por meio de visualizações indexadas e envolvê-los na conversa sobre como resolver o problema.

Mike Walsh
fonte
7

O risco óbvio de fazer essa alteração é que as consultas do fornecedor que foram executadas corretamente corretamente podem começar a gerar erros ou retornar resultados incorretos. A ARITHABORTconfiguração controla parcialmente se os erros de estouro aritmético e de divisão por zero retornam um NULLresultado, finalizam a instrução com um erro ou finalizam o lote com um erro. Como o código do fornecedor pode reagir ao código que gera um erro em vez de retornar NULLnão é algo que você gostaria de experimentar em um sistema de produção :)

No entanto, o risco é menor se o nível de compatibilidade do banco de dados for 90 ou superior e as sessões forem executadas com SET ANSI_WARNINGS ON. Essa configuração deve ter sido ONquando você testou as exibições indexadas, mas é necessário confirmar a configuração efetiva usada pelas conexões do aplicativo do fornecedor. O Management Studio pode muito bem ser configurado para usar SETopções diferentes daquelas definidas pelo código do fornecedor ao conectar-se (e você não pode substituir aquelas com os padrões de banco de dados ou instância). Verifique com o fornecedor e confirme rastreando o código do fornecedor usando o SQL Server Profiler.

Indiscutivelmente, o maior risco é que o fornecedor se recuse a dar suporte à sua instalação até que a configuração seja retornada OFF, mas você ainda deve tentar incentivá-lo a atualizar seu código para trabalhar com as SETopções recomendadas , para que você não precise escolher entre desempenho e executando uma instalação suportada. Uma alternativa é executar relatórios em uma cópia do banco de dados, é claro.

-- Recommended effective settings
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT, 
    CONCAT_NULL_YIELDS_NULL, 
    QUOTED_IDENTIFIER, 
    ANSI_NULLS, 
    ANSI_PADDING,
    ANSI_WARNINGS ON;
Paul White 9
fonte