Ryzyko zmiany na ARITHABORT ON

12

Współpracuję z dostawcą, który zapewnia, że ​​zapewniają podstawową aplikację, i mogę tworzyć własne rozszerzenia, o ile nie modyfikuję podstawowej aplikacji. Jest wbudowany w ColdFusion łączący się z bazą danych SQL Server 2005.

Niektóre raporty, które zbudowałem, zależą od widoków korzystających z funkcji wyliczonych z tabel podstawowych, a raporty stają się bardzo powolne w miarę powiększania się tabel. Aby przyspieszyć raporty, chcę użyć widoków indeksowanych . Ale po utworzeniu widoku indeksowanego w moim środowisku testowym aplikacja podstawowa nie mogła już wstawiać do tabel podstawowych (zwróciła komunikat o błędzie, który ARITHABORTmusi być wyświetlany ONpodczas korzystania z widoków indeksowanych).

Wygląda więc na to, że aby korzystać z widoków indeksowanych, muszę mieć podstawową aplikację przy SET ARITHABORT ONkażdym wstawianiu / aktualizowaniu podstawowych tabel. Uruchomiłem to w moim środowisku testowym:

ALTER DATABASE MyDatabase SET ARITHABORT ON;

i wydaje się, że działa dobrze. Ale mój sprzedawca mówi, ponieważ ponieważ aplikacja ma tysiące zapytań, może istnieć ryzyko, że to ustawienie może przerwać jedno z tych zapytań, a jeśli pojawią się jakieś nieoczekiwane problemy z bazą danych, nalegają, aby przywrócić ustawienie domyślne.

Czy istnieją jakieś zapytania, które zostałyby złamane SET ARITHABORT ON? Czy jest jakaś sytuacja, w której lepiej byłoby ją zatrzymać OFF?

TL; DR Aby moje nowe widoki indeksowane działały, muszę ustawić ARITHABORT ONdla całej bazy danych, ale mój sprzedawca ostrzega, że ​​będzie to na własne ryzyko. Czy rzeczywiście istnieje ryzyko?

krubo
źródło

Odpowiedzi:

9

SET ARITHABORT ON Mówi więc w zasadzie „jeśli wystąpi błąd przez zero lub przepełnienie arytmetyczne przerwie zapytanie” Jest to zwykle pożądane zachowanie i jest to domyślne ustawienie dla całej instancji. Jeśli spowoduje to problemy z zapytaniami dostawcy, powiedziałbym, że na początku mogły one mieć problemy z kodowaniem. Poprosiłbym ich o więcej szczegółów na temat tego, dlaczego ich to dotyczy.

Spośród wszystkich zasad indeksowanych widoków nazwałbym to, a wiele z ustawionych opcji jest najmniej kontrowersyjnych.

Należy to ustawić w połączeniach, które wchodzą w interakcję z widokiem. Dlatego chciałbyś współpracować z dostawcą i naprawdę spróbować zrozumieć ich rozumowanie i spróbować przekonać ich do tego, co myślą na temat wielkiej niezgody tutaj.

To powiedziawszy - wyświetlenia indeksowane to wielka sprawa. Mają inne reguły i mogą wpływać na aplikację i założenia, które twórcy dostawcy mieli podczas budowania i testowania wydajności. Powinieneś naprawdę porozmawiać z nimi na temat problemu biznesowego, który próbujesz rozwiązać za pomocą indeksowanych widoków, i zaangażować ich w rozmowę na temat rozwiązania problemu.

Mike Walsh
źródło
7

Oczywistym ryzykiem związanym z wprowadzeniem tej zmiany jest to, że zapytania dostawcy, które poprzednio działały poprawnie, mogą zacząć generować błędy lub zwracać nieprawidłowe wyniki. To ARITHABORTustawienie częściowo kontroluje, czy błędy arytmetyczne i błędy dzielenia przez zero zwracają NULLwynik, kończą instrukcję z błędem lub kończą partię z błędem. Jak kod dostawcy może zareagować na kod, który generuje błąd zamiast zwracać, NULLnie jest czymś, z czym chciałbyś eksperymentować w systemie produkcyjnym :)

Jednak ryzyko jest niższe, jeśli poziom zgodności bazy danych wynosi 90 lub więcej, a sesje są uruchamiane SET ANSI_WARNINGS ON. To ustawienie musiało mieć miejsce ONpodczas testowania widoków indeksowanych, ale musisz potwierdzić skuteczne ustawienie używane przez połączenia aplikacji dostawcy. Management Studio może być skonfigurowane tak, aby używało innych SETopcji niż te ustawione przez kod dostawcy podczas łączenia (i nie można zastąpić tych z domyślnymi ustawieniami bazy danych lub instancji). Skontaktuj się z dostawcą i potwierdź, śledząc kod dostawcy za pomocą SQL Server Profiler.

Prawdopodobnie większe ryzyko polega na tym, że dostawca odmówi wsparcia instalacji do momentu przywrócenia ustawienia OFF, ale nadal powinieneś spróbować zachęcić swojego dostawcę do zaktualizowania kodu, aby działał z zalecanymi SETopcjami, więc nie musisz wybierać między wydajność i uruchomienie obsługiwanej instalacji. Alternatywą jest oczywiście uruchamianie raportów dla kopii bazy danych.

-- 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
źródło