2009-01-22 11 views
10

Wystąpił problem z plikiem sp.Procedura przechowywana powodująca przekroczenie limitu czasu tylko w przypadku uruchamiania z aplikacji

Mamy dość prosty sp zawierającą deklarowaną stół i parę sprzężenia zewnętrzne, które w deklaracjach końcowych pomiędzy 20 i 100 wierszy.

Ponieważ wysyłanie zapytań do tego sp dawało nam słabe wyniki zarówno w produkcji, jak i w środowisku testowym, ostatnio przepisaliśmy je, aby były bardziej wydajne i przetestowane z dużą wydajnością w naszym środowisku testowym.

Wydaliśmy go do produkcji tylko, aby dowiedzieć się, że nadal jest bardzo powolny i są przyczyną naszej aplikacji .NET 2.0 do limitu czasu kiedy to się nazywa.

Zrozumieliśmy nic i poszedł do Management Studio na bazie produkcyjnej i prowadził tam SP, wykonuje mniej niż 1 sek.

To znaczy, gdy biegł z naszej aplikacji jest wyjątkowo powolny i powoduje limity czasu, gdy biegł z Management Studio jest bardzo szybkie i nie zajmuje więcej niż sekundę.

Ktoś, kto ma dobrą znajomość SQL Server 2005, może dać nam wskazówkę dotyczącą tego?

+0

Kiedy mówisz, że testujesz SP w studio zarządzania, czy dzwonisz do SP za pomocą EXEC i podajesz jakieś parametry, czy właśnie używasz treści zapytania z wnętrza SP? – AnthonyWJones

+0

Czy testowałeś w SSMS z tym samym użytkownikiem, którego aplikacja używa do łączenia? – devio

Odpowiedz

0

Upewnij się, że baza produkcyjna posiada up-to-date statystyk i indeksy są w dobrym stanie (jeśli to możliwe pod odbudowywania indeksów zaangażowanych).

0

Czy możesz mieć pewność, że nie występuje sytuacja zakleszczenia? Bieg ze studia zarządzania byłby odizolowany, ponieważ od aplikacji może być częścią większej transakcji.

1

Niż za odpowiedzi chłopaki, wydaje się, że uruchomiony sp_recompile rozwiązał problem, przynajmniej wszystko przebiegło bezproblemowo odkąd wykonałem je wczoraj po południu, będę go obserwował i sprawdzał, czy pozostanie szybki.

Nie jednak zrozumieć, że rekompilacji nie powstał, kiedy zmienił treść wewnątrz sp?

9

myślę, że może być problem „Parametr wąchania”. Jest to proces, w którym środowisko wykonawcze SQL Server "wykrywa" wartości parametrów sp podczas kompilacji lub rekompilacji w celu wygenerowania szybszych planów wykonania. Czasami jednak uzyskuje się kombinację parametrów, które wraz z aktualnymi danymi, które sp powróci, czyni naprawdę powolny sp.

Istnieje kilka dobrych wyjaśnień. Szukaj w Stackoverflow. To jest jeden jest dobry: http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

Jednym z możliwych rozwiązań jest utworzenie zmiennych lokalnych w sp i ustawienie dla nich wartości parametrów wejściowych. Następnie użyj tylko zmiennych lokalnych w sp.

CREATE PROCEDURE [dbo].spTest 
    @FromDate as DATETIME 
AS 
BEGIN 
    DECLARE @FromDate_local as DATETIME 
    SET @FromDate_local = '2009-01-01' 

    SET @FromDate_local = @FromDate 
    ... 
    SELECT * FROM TestTbl WHERE FromDate >= @FromDate_local 
END 
+0

DZIĘKUJEMY! Wpadłem na ten problem, a Twoje rozwiązanie działało pięknie! – Chuck