Twierdziłbym, że prawie na pewno był to wąchanie parametrów.
Często mówi się, że SET OPTIONSmoże to wpłynąć na wydajność w ten sposób, ale nie widziałem jeszcze jednego wiarygodnego źródła tego roszczenia, z wyjątkiem przypadku, w którym używasz indeksowanych widoków / utrwalonych kolumn obliczeniowych.
W takim przypadku (dla SQL2005 + i chyba, że baza danych jest w trybie zgodności z SQL2000 ). Jeśli masz oba, ARITHABORTa ANSI_WARNINGS OFFnastępnie zauważysz, że indeks nie jest używany, więc może mieć skan zamiast pożądanego wyszukiwania (i trochę narzutu, ponieważ nie można użyć utrwalonego wyniku obliczeń). ADO.NET wydaje się domyślnie mieć ANSI_WARNINGS ONz szybkiego testu, który właśnie zrobiłem.
Twierdzenie w odpowiedzi Bena, że „sposób, w jaki serwer wykonuje obliczenia numeryczne”, może dodać minuty do wyniku, który w innym przypadku zająłby mniej niż sekundę, po prostu nie wydaje mi się wiarygodny. Myślę, że to, co się zwykle zdarza, polega na tym, że po zbadaniu problemu z wydajnością, Profiler jest używany do identyfikacji nieprawidłowego zapytania. To jest wklejane do studia zarządzania i natychmiast uruchamia i zwraca wyniki. Jedyną widoczną różnicą między połączeniami jest ARITH_ABORTopcja.
Szybki test w oknie studia zarządzania pokazuje, że po SET ARITHABORT OFFwłączeniu i uruchomieniu zapytania problem wydajności powtarza się, więc najwyraźniej sprawa jest zamknięta. Rzeczywiście wydaje się, że jest to metoda rozwiązywania problemów zastosowana w łączu Gregga Starka .
Jednak ignoruje to fakt, że z tym zestawem opcji możesz uzyskać dokładnie ten sam zły plan z pamięci podręcznej .
Ponowne użycie tego planu może się zdarzyć, nawet jeśli jesteś zalogowany jako inny użytkownik niż korzysta z połączenia aplikacji.
Przetestowałem to, wykonując najpierw zapytanie testowe z aplikacji sieci web, a następnie ze studia zarządzania za pomocą SET ARITHABORT OFFi widziałem, że liczba użytkowników rośnie od poniższego zapytania.
SELECT usecounts, cacheobjtype, objtype, text ,query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Aby to współużytkowanie planów pf rzeczywiście miało miejsce, wszystkie klucze pamięci podręcznej planu muszą być takie same. Oprócz arithabortinnych przykładów wykonujący się użytkownicy potrzebują tego samego domyślnego schematu (jeśli zapytanie opiera się na niejawnym rozpoznawaniu nazw), a połączenia wymagają tego samego languagezestawu.
Pełniejsza lista kluczy pamięci podręcznej planu tutaj