Próbuję zrozumieć problem, który mamy z SQL Server 2000. Jesteśmy witryną o umiarkowanie transakcyjnym charakterze i mamy zapisany proces, sp_GetCurrentTransactions
który akceptuje ID klienta i dwie daty.
Teraz, w zależności od dat i klienta, to zapytanie może zwrócić wszystko od zera do 1000 wierszy.
Problem: doświadczyliśmy tego, że nagle dostaniemy szereg błędów (typowych Execution Timeout Expired
lub podobnych) dla konkretnego klienta podczas próby wykonania zapisanego proc. Sprawdzamy więc zapytanie, uruchamiamy je w SSMS i stwierdzamy, że zajmuje ono 30 sekund. Ponownie kompilujemy zapisany proc i -bang- działa teraz za 300ms.
Rozmawiałem o tym z naszą DBA. Powiedział mi, że baza danych utworzyła plan zapytań, kiedy utworzyliśmy przechowywany proc. Powiedział, że był to dobry plan dla tego zestawu parametrów, ale jeśli rzucisz na niego pewien zestaw parametrów, wtedy plan nie będzie najlepszym planem dla tych danych, więc zobaczysz, że działa wolno.
Opcje przedstawione mi to przeniesienie tego problemu z przechowywanego proc i z powrotem do dynamicznego SQL, który ma plan wykonania tworzony przy każdym uruchomieniu.
To wydaje mi się krokiem wstecz i wydaje mi się, że musi być jakiś sposób na obejście tego. Czy istnieje inny sposób rozwiązania tego problemu?
Wszelkie odpowiedzi są mile widziane.