Twierdziłbym, że prawie na pewno był to wąchanie parametrów.
Często mówi się, że SET OPTIONS
moż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, ARITHABORT
a ANSI_WARNINGS
OFF
nastę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 ON
z 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_ABORT
opcja.
Szybki test w oknie studia zarządzania pokazuje, że po SET ARITHABORT OFF
włą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 OFF
i 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 arithabort
innych 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 language
zestawu.
Pełniejsza lista kluczy pamięci podręcznej planu tutaj