SELECT TOP 1 завдає шкоди ефективності запитів; чи є доступний dba спосіб подолати це?


13

У виробничому додатку (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;

Ви пробували це як підзапит? Наприклад, виберіть топ-1 підписки_id з (виберіть [решта запиту без верху1]
SeanR

Можливо, якась "нормальна" настройка запитів спрацює? Якщо показники досить привабливі, сканування проходить. Це менш інвазивно, ніж керівництво плану.
usr

Так чи @ID завжди одні й ті самі значення змушують "зійти нанівець"? Якщо так, то тестуйте, використовуючи одне з цих значень, і фіксуйте фактичний план запитів. Це підкаже, що йде не так. Якщо "погані" значення не узгоджуються, то, ймовірно, це або нюхання параметрів (див. Відповідь @ MartinSmith для вирішення), або ж проблема блокування, пов'язана з тим, як клієнт насправді запитує та споживає набір результатів.
RBarryYoung

Відповіді:


12

Якщо ви не можете змінити запит, ви можете скористатися посібником із плану.

Перевірте ефективність запиту за допомогою OPTION (QUERYTRACEON 4138)(знадобиться хтось із sysadminдозволами, щоб спробувати це).

Якщо це дає задовільну ефективність, ви можете застосувати це до керівництва щодо плану. Якщо це не дає задовільних показників, спробуйте знайти підказку. Можливо, OPTION (HASH JOIN, MERGE JOIN)якщо проблемою є невідповідні вкладені петлі. Можливо, вам доведеться вдатися до USE PLAN N'...'підказки.

Коли ви дізнаєтесь необхідний підказки, можете застосувати їх, використовуючи тут інформацію .


OPTION (QUERYTRACEON 4138)зробив трюк. Спасибі. Тепер перейдемо до сортування посібників із плану.
О. Джонс

0

для посмішок спробуйте це
>> змінюється на> =, тож не точний запит

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 
       AND apg.group_id = @Id
       AND apg.start_date < GETDATE()
       AND isnnull(apg.end_date, GETDATE()) >= GETDATE()             
  JOIN pplan 
        ON pplan.plan_id = sub.plan_id
       AND isnnull(sub.end_date, GETDATE()) >= GETDATE()
  JOIN product 
        ON product.product_id = [plan].product_id 
  JOIN product_attribute 
        ON product_attribute.product_id = product.product_id 
       AND product_attribute.attribute_type = 'special feature' 
       AND product_attribute.attribute_data = '1' 
 ORDER BY sub.start_date ASC;

"Зміна запиту та виправлення програми триває. Робот займає деякий час." ОП шукає рішення, яке фіксує продуктивність "як є".
Мартін Сміт

@MartinSmith І коли вони викажуть виправлення, це може бути кращим виправленням. Якщо додатки споживають додаткові рядки, будуть інші зміни програми.
папараццо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.