Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 План запроса отличается при вызове хранимой процедур и просто так  [new]
Vlad Volkov
Member

Откуда: Москва
Сообщений: 15
Есть процедура, выполняющая некий SELECT-запрос.
Процедура выполняется две минуты, тот же запрос (с теми же аргументами) напрямую из SQL Analyzer'а отрабатывает меньше, чем за секунду.

Проблема в том, что при вызове процедуры план запроса используется неоптимальный. Вопрос - чем это вызвано и как бороться?
Перекомпилировать процедуру пробовал, не помогает.
18 янв 06, 10:57    [2264641]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Почему похожие запросы имеют различные планы исполнения
18 янв 06, 11:24    [2264788]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
Crimean
Member

Откуда:
Сообщений: 13148
есть еще одна фича
параметры хранимки не использовать в запросе, а ТОЛЬКО через переприсваивание локальным переменным
реально помогает
вычитал когда-то на форуме . большой респект тому , кто раскопал!
18 янв 06, 11:32    [2264835]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
Vlad Volkov
Member

Откуда: Москва
Сообщений: 15
Я не использую литеральные значения; в процедуре - параметры, при явном вызове запроса - локальные переменные.
Попробовал в начале текста процедуры переприсвоить параметрам фиксированные значения (для пущей схожести с явным вызовом) - та же фигня.
18 янв 06, 11:40    [2264890]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
Vlad Volkov
Member

Откуда: Москва
Сообщений: 15
Crimean

параметры хранимки не использовать в запросе, а ТОЛЬКО через переприсваивание локальным переменным


Ага, похоже, помогло.
Только что сам обнаружил этот факт - как раз собирался написать.
18 янв 06, 11:45    [2264929]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
Vlad Volkov
Я не использую литеральные значения; в процедуре - параметры, при явном вызове запроса - локальные переменные.
Попробовал в начале текста процедуры переприсвоить параметрам фиксированные значения (для пущей схожести с явным вызовом) - та же фигня.

Переприсваивание игнорируется. При построении плана будут использоваться заданные при вызове ХП параметры. Нужно в запросе заменять параметры на локальные переменные.

2 Crimean
Излишне категорично. В некоторых случаях замена параметров локальными переменными не является хорошим решением, т.к. приводит к построению плана на основе средней плотности.
18 янв 06, 11:47    [2264940]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
Vlad Volkov
Member

Откуда: Москва
Сообщений: 15
WiRuc
При построении плана будут использоваться заданные при вызове ХП параметры.

Правильно ли я понял мысль, что при использовании параметров сервер будет каждый раз перестраивать план, пытаясь оптимизировать его под конкретные значения параметров, а при использовании локальных переменных - план будет строиться один раз, исходя из "средней плотности"?
Буду особенно благодарен за ссылку на докуметацию - хотелось бы почитать поподробнее про этот механизм.
18 янв 06, 11:54    [2264992]     Ответить | Цитировать Сообщить модератору
 Re: План запроса отличается при вызове хранимой процедур и просто так  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
А не проще тогда сразу - WITH RECOMPILE?
Насколько я понимаю, "обманывать" построитель через локальные переменные хорошо тогда, когда разработчик ТОЧНО ЗНАЕТ наиболее типичные значения параметров при вызове процедуры, но не уверен, что при первом вызове, когда строится план запроса, будут переданы именно эти значения.
Для общего случая (например, отчеты, у которых период меняется, как минимум и время пперевтроения плана ничтожно мало на фоне времени выполнения процедуры) тогда проще перекомпилировать план при каждом выполнении.
Наверное. ;)
18 янв 06, 11:55    [2264998]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить