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;
@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.