W aplikacji produkcyjnej (C # rozmawiającej z SQL Server 2014 Standard) jest zapytanie, które wygląda tak jak poniżej. Przez większość czasu działa w milisekundach. Ale czasami (dla niektórych wartości @Id
) szaleje i zajmuje około minuty. Jest to czas dłuższy niż limit czasu aplikacji, więc aplikacja nie działa dla użytkownika.
W przypadkach „szaleje” zwrócony zestaw wyników jest poprawnie pusty, podobnie jak w wielu, ale nie we wszystkich innych przypadkach.
Na szczęście jest to powtarzalne zarówno w środowisku produkcyjnym, jak i programistycznym.
Deweloper mówi, że usunięcie „TOP 1” z zapytania, a następnie upewnienie się, że aplikacja zużywa dodatkowe wiersze zestawu wyników, rozwiązuje problem z wydajnością.
Planer zapytań sugeruje brak indeksów, gdy TOP 1
jest obecny. (w dev).
Trwa zmiana zapytania i naprawa aplikacji. Wdrożenie zajmuje trochę czasu.
Moje pytanie: Czy istnieje jakikolwiek dostępny sposób DBA na dostrojenie lub ulepszenie produkcyjnej instancji SQL Server, aby rozwiązać ten problem, zanim aplikacja zmieni się wraz z wprowadzeniem nowego zapytania?
SELECT TOP 1
subscription_id
FROM subscription AS sub
JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id
JOIN person_group AS apg ON apg.person_id = bi.person_id
JOIN pplan ON pplan.plan_id = sub.plan_id
JOIN product ON product.product_id = [plan].product_id
JOIN product_attribute ON product_attribute.product_id = product.product_id
WHERE apg.group_id = @Id
AND apg.start_date < GETDATE()
AND (apg.end_date IS NULL OR apg.end_date > GETDATE())
AND (sub.end_date IS NULL OR sub.end_date > GETDATE())
AND product_attribute.attribute_type = 'special feature'
AND product_attribute.attribute_data = '1'
ORDER BY sub.start_date ASC;
źródło
@ID
zawsze powodują, że „wariuje”? Jeśli tak, przetestuj przy użyciu jednej z tych wartości i przechwyć aktualny plan zapytań. To powie ci, co się dzieje źle. Jeśli „złe” wartości nie są spójne, wydaje się prawdopodobne, że jest to albo sniffing parametrów (patrz rozwiązanie @ MartinSmith, aby uzyskać rozwiązanie), albo problem z blokowaniem związany z tym, jak klient faktycznie żąda i zużywa zestaw wyników.Odpowiedzi:
Jeśli nie możesz zmienić zapytania, możesz skorzystać z przewodnika po planach.
Przetestuj wydajność zapytania za pomocą
OPTION (QUERYTRACEON 4138)
(będzie potrzebował kogoś zsysadmin
uprawnieniami, aby spróbować).Jeśli daje to zadowalającą wydajność, możesz zastosować to z przewodnikiem planu. Jeśli nie daje zadowalającej wydajności, spróbuj znaleźć wskazówkę, która działa. Być może
OPTION (HASH JOIN, MERGE JOIN)
problem stanowią niewłaściwe zagnieżdżone pętle. Może być konieczne skorzystanie zUSE PLAN N'...'
podpowiedzi.Po zapoznaniu się z wymaganymi wskazówkami możesz je zastosować, korzystając z informacji tutaj .
źródło
OPTION (QUERYTRACEON 4138)
wykonał lewę. Dzięki. Teraz posortuj przewodniki po planach.dla uśmiechów spróbuj
to> zmienia się na> = więc nie dokładnie to samo zapytanie
źródło