Есть ли разница в исполнении запроса ?

Glory
Дата: 12.03.2001 10:07:44
Привет Всем!
Волнует следующий вопрос
Есть ли разница, с точки зрения производительности, в исполнении хранимой процедуры, когда запрос написан в явном виде и когда текст запроса заноситься в переменную и вызывается с помощью execute(@myvar) ?
Genady
Дата: 12.03.2001 11:05:22
Если я не ошибаюсь, то в случае явного запроса сервер после выполнения хранит его в откомпилированном виде и собирает на него статистику, в результате чего у сервера есть возожность оптимизировать его выполнение в дальнейшем.
В случае с execute такой возможности у него нет, поскольку он не знает этого запроса, и к тому же ему каждый раз приходится его компилировать.
Я использую execute только в том случае, если без этого не могу обойтись.
Dmitry
Дата: 12.03.2001 11:07:35
На мой взгдя есть. Дело в том, что при явном указании запроса, при сохранении SP, она компилируется, т.е. строится ее план. При занесении же запроса в переменную с последующим использованием Execute план этой части заранее построить в общем случае нельзя и поэтому, я так понимаю, он и не пытается строить этот план. Так что при выполнении будет уходить время на построение плана выполнения execute.
Glory
Дата: 12.03.2001 11:34:05
А если имеется 20-30 типовых запросов, имеющих как общие условия в частях SELECT, WHERE и GROUP так и разные, которые зависят от входных параметров (поэтому и используется переменная для формирования запроса), то что тогда писать отдельную процедуру на каждый запрос ?
Но чем больше процедур, тем сложнее за ними следить, особенно если придется вносить изменения в общую часть всех запросов.
Или здесь нет точного рецепта и придется искать компромисс между "удобно для сервера" и "удобно для админа" ?
Genady
Дата: 12.03.2001 12:04:13
Боюсь, что скорее всего прийдется делать "удобно для юзера"
А что, 20 - 30 процедур это много?
Glory
Дата: 12.03.2001 12:12:29
20-30 умножаем на 10-15 таблиц получаем
Ну а в общем - понятно: все для юзера
SergSuper
Дата: 12.03.2001 12:33:23
Dmitry и Genady чуть ли не слово в слово высказали мысль(на мой взгляд неверную), что "при занесении же запроса в переменную с последующим использованием Execute план этой части заранее построить в общем случае нельзя". Интересно почему? Запрос в Execute всё равно сначала компилируется и значит строиться план.
Не знаю как в SQL2000, но в 6.5 я в процедуре специально использовал Execute для того чтобы запрос мог использовать индексы во временной таблице. Дело в том что при компиляции процедуры еще неизвестно что индекс будет и он не используется. Если же писать через Exec, то компиляция произойдет непосредственно перед выполнением и индекс подхватиться.
Genady
Дата: 12.03.2001 12:33:26
>20-30 умножаем на 10-15 таблиц получаем

Ну здесь Вам прийдется попридумывать
А вобще то, я полагал, что запросы у Вас предназначены для отчетов, а в таких запросах как правило приходиться соединять несколько таблиц, вот поэтому и полагал, что этих запросов всего 20-30
Genady
Дата: 12.03.2001 12:48:41
2 SergSuper Безусловно план выполнения запроса в любом случае строится, но в случае с execute он строится заново, а в случае с явным запросом, он просто храниться на сервере и при запросе выполняется.
Genady
Дата: 12.03.2001 12:51:24
Я бы на месте Glory просто промерял бы быстродействие в обоих случаях, тем более, что у него большая база и расхождения должны быть явно видны