У мене є два майже однакових запиту, що працюють на одному екземплярі SQL Server 2005:
- Перший - це оригінальний
SELECT
запит, згенерований LINQ (я знаю, я знаю ... Я не розробник додатків, просто DBA :). - Другий точно такий же, як і перший, доданий в
OPTION (RECOMPILE)
кінці.
Нічого іншого не змінилося.
Перший займає 55 секунд кожного разу, коли він працює.
Другий займає 2 секунди.
Обидва набори результатів однакові.
Чому цей натяк призвів до такого значного збільшення продуктивності?
Запис "Книги в Інтернеті RECOMPILE
" не пропонує дуже детального пояснення:
Доручає двигуну баз даних SQL Server відкидати план, сформований для запиту після його виконання, змушуючи оптимізатор запитів перекомпілювати план запитів наступного разу, коли буде виконаний той самий запит. Не вказуючи RECOMPILE, Database Engine кешує плани запитів і повторно використовує їх. Під час компіляції планів запитів підказка запиту RECOMPILE використовує поточні значення будь-яких локальних змінних у запиті, і, якщо запит знаходиться в межах збереженої процедури, поточні значення передаються будь-яким параметрам.
RECOMPILE є корисною альтернативою для створення збереженої процедури, яка використовує пункт З RECOMPILE, коли потрібно рекомпілювати лише підмножину запитів всередині збереженої процедури, а не всю збережену процедуру. Для отримання додаткової інформації див. Перекомпонування збережених процедур. RECOMPILE також корисний при створенні напрямних планів. Для отримання додаткової інформації див. Оптимізація запитів у розгорнутих програмах за допомогою посібників із плану.
Оскільки мій запит має багато локальних змінних, я гадаю, що SQL Server може (серйозно) оптимізувати його, коли я використовую OPTION (RECOMPILE)
підказку запиту.
Скрізь, де я дивлюся, люди кажуть, що цього OPTION (RECOMPILE)
слід уникати. Пояснення цього загалом полягає в тому, що використання цього підказки SQL Server не в змозі повторно використовувати цей план виконання, і тому доводиться витрачати час на його перекомпіляцію щоразу.
(Але) Враховуючи гігантську перевагу продуктивності, я схильний думати, що використання цього підказки цього разу було б хорошою справою.
Чи варто його використовувати? Якщо ні, чи можна змусити SQL Server використовувати кращий план виконання без цього підказки та без зміни програми?