У виробничому додатку (C #, розмовляючи зі стандартом SQL Server 2014) наведено нижче запит, який виглядає приблизно так. Більшу частину часу він працює в мілісекундах. Але періодично (за певних значень @Id
) це стає гарно і займає хвилину або близько того. Це більше часу, ніж час очікування програми, тому програма не працює для користувача.
У випадках "збивається", повернутий набір результатів вірно порожній, як і у багатьох, але не у всіх інших випадках.
На щастя, це можна відтворити як у виробництві, так і в розробці.
Розробник каже, що видалення "TOP 1" із запиту, а потім переконайтеся, що додаток витрачає зайві рядки набору результатів, усуває проблему з продуктивністю.
Планувальник запитів не пропонує індексів, коли TOP 1
він присутній. (in dev)
Зміна запиту та виправлення програми триває. Rollout займає певний час.
Моє запитання: Чи є доступний для DBA спосіб налаштування або налаштування виробничого екземпляра SQL Server для подолання цієї проблеми перед тим, як змінити додаток з новим запитом?
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
завжди одні й ті самі значення змушують "зійти нанівець"? Якщо так, то тестуйте, використовуючи одне з цих значень, і фіксуйте фактичний план запитів. Це підкаже, що йде не так. Якщо "погані" значення не узгоджуються, то, ймовірно, це або нюхання параметрів (див. Відповідь @ MartinSmith для вирішення), або ж проблема блокування, пов'язана з тим, як клієнт насправді запитує та споживає набір результатів.