powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Есть ли разница в исполнении запроса ?
25 сообщений из 35, страница 1 из 2
Есть ли разница в исполнении запроса ?
    #32002925
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Всем!
Волнует следующий вопрос
Есть ли разница, с точки зрения производительности, в исполнении хранимой процедуры, когда запрос написан в явном виде и когда текст запроса заноситься в переменную и вызывается с помощью execute(@myvar) ?
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002928
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я не ошибаюсь, то в случае явного запроса сервер после выполнения хранит его в откомпилированном виде и собирает на него статистику, в результате чего у сервера есть возожность оптимизировать его выполнение в дальнейшем.
В случае с execute такой возможности у него нет, поскольку он не знает этого запроса, и к тому же ему каждый раз приходится его компилировать.
Я использую execute только в том случае, если без этого не могу обойтись.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002929
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгдя есть. Дело в том, что при явном указании запроса, при сохранении SP, она компилируется, т.е. строится ее план. При занесении же запроса в переменную с последующим использованием Execute план этой части заранее построить в общем случае нельзя и поэтому, я так понимаю, он и не пытается строить этот план. Так что при выполнении будет уходить время на построение плана выполнения execute.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002931
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если имеется 20-30 типовых запросов, имеющих как общие условия в частях SELECT, WHERE и GROUP так и разные, которые зависят от входных параметров (поэтому и используется переменная для формирования запроса), то что тогда писать отдельную процедуру на каждый запрос ?
Но чем больше процедур, тем сложнее за ними следить, особенно если придется вносить изменения в общую часть всех запросов.
Или здесь нет точного рецепта и придется искать компромисс между "удобно для сервера" и "удобно для админа" ?
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002932
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь, что скорее всего прийдется делать "удобно для юзера"

А что, 20 - 30 процедур это много?
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002933
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20-30 умножаем на 10-15 таблиц получаем
Ну а в общем - понятно: все для юзера
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002934
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry и Genady чуть ли не слово в слово высказали мысль(на мой взгляд неверную), что "при занесении же запроса в переменную с последующим использованием Execute план этой части заранее построить в общем случае нельзя". Интересно почему? Запрос в Execute всё равно сначала компилируется и значит строиться план.
Не знаю как в SQL2000, но в 6.5 я в процедуре специально использовал Execute для того чтобы запрос мог использовать индексы во временной таблице. Дело в том что при компиляции процедуры еще неизвестно что индекс будет и он не используется. Если же писать через Exec, то компиляция произойдет непосредственно перед выполнением и индекс подхватиться.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002935
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>20-30 умножаем на 10-15 таблиц получаем

Ну здесь Вам прийдется попридумывать
А вобще то, я полагал, что запросы у Вас предназначены для отчетов, а в таких запросах как правило приходиться соединять несколько таблиц, вот поэтому и полагал, что этих запросов всего 20-30
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002936
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper Безусловно план выполнения запроса в любом случае строится, но в случае с execute он строится заново, а в случае с явным запросом, он просто храниться на сервере и при запросе выполняется.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002937
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы на месте Glory просто промерял бы быстродействие в обоих случаях, тем более, что у него большая база и расхождения должны быть явно видны
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002938
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да в том-то и дело, что при общем времени исполнения запроса 20-25 минут, я не вижу больших расхождений во времени(не более 5 минут) при запуске из QA процедуры, которая использует execute и запуске явно составленного запроса из того же QA.

Может быть, конечно, дело в том, что у тестируемых таблиц уже имеется статистика, уже построенная по рекомендациям ITW.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002939
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть выигрыш будет при одновременном запуске запроса с нескольких коннектов. Тогда, как я понимаю, план выполнения для одинаковых запросов может быть одновременно использован разными коннектами(пользователями), если используется явное написание запроса а не execute. Так ли это ?
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002940
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял из BOL, то сервер в любом случае хранит план запроса, просто план процедуры хранится постоянно, а динамического запроса до тех пор пока подобные запросы поступают.
SQL Server 7.0 execution plans have two main components:
1. Query plan
1. Execution context

Собственно Query plan это и есть план запроса, а Execution context это план выполнения, зависящий от конкретного подключения, т.е.
select * from MyTable where PriKey = ? - Query plan
select * from MyTable where PriKey = 45 - Execution plan построенный на основе Query plan.

В случае явного запроса Query plan хранится обязательно, а хранится ли он при динамическом я не знаю, пойду покопаюсь в BOL
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002943
VadimB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кретично время а кол-во процедур 450 (30 запросов * 15 таблиц),
то можно написать одну служебную процедуру, которая создает в БД эти 450 прикладных процедур.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002960
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
> А если имеется 20-30 типовых запросов, имеющих как общие условия в частях SELECT, WHERE
> и GROUP так и разные, которые зависят от входных параметров (поэтому и используется
> переменная для формирования запроса), то что тогда писать отдельную процедуру на каждый
> запрос ?
Если вы используете технологи ADO, то в ней специально для решения данной задачи имеются средства - параметризованные prepared-запросы. Повторяю, через ODBC эта фича недоступна - только через ADO. В свойствах ADO-компонента присваивается prepared=true, задается текст запроса, в который вместо значений параметров (переменной части запроса) подставляются либо имена параметров, предваряемые двоеточием (в Delphi), либо знаки вопроса (в VBA). Дополнительно создается коллекция ADO-параметров, которая цепляется к данному ADO-компоненту, в которых и указываются значения параметров.
При выполнении такого запроса он компилируется на сервере только первый раз. При компиляции SQL-сервер "знает" о переменных и постоянных частях запроса, то есть план запроса составляется так, как при компиляции хранимых процедур с параметрами. Данный план некоторое время хранится в кэше даже если пославший запрос юзер разорвал соединение. Если от этого же или даже от другого юзера придет аналогичный запрос с другими значениями параметров, то повторная компиляция не производится - подставляются новые значения параметров в ранее сгенеренный план, и запрос выполняется.
В чем отличие SP от параметризованных запросов?
1. Если долгое время не посылать повторно такой запрос на сервер, то план запроса будет вытеснен из кэша и утерян. Это вызовет повторную компиляцию запроса при его повторном получении сервером.
2. Хранимые процедуры возвращают необновляемый набор данных. Параметризованный запрос может возвращать обновляемый набор данных.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002975
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если время выполнения запроса = 20-25 МИНУТ, то я не думаю, что будет какая-то ощутимая разница. Как уже много раз говорилось выше, существует два этапа - составление плана и собственно выполнение. Разница между динамическим запросом и SP - в том, что в SP план уже готов и его не надо вновь формировать, а взапросе - надо (если его нет в кэше). Так вот я с трудом могу представить, чтобы время составления запроса было сравнимо с 20-25 минутами, или даже на порядок меньше. Так что разница за счет времени составления запроса конечно будет, но она будет пренебрижимо мала...
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002978
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Garya:
На чем основано утверждение, что хранимые процедуры возвращают необновляемый набор записей?
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002982
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dmitry
По-моему это правильно.
Для одного коннекта уж точно, а что-будет в случае многих коннектов ?

2Garya
Не знаю,конечно,как в ADO и Delphi,но в VFP 7.0(да и 6.0, кажется)есть функция SQLPREPARE(), которая прекрасно работает и при использовании ODBC.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002983
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory

В случае множества коннектов сервер будет использовать план запроса из кешаб этот план будет построен после первого выполнения этого запроса. Что касается процедур, то в BOL написано, что кроме того, что сервер хранит план запроса, он еще и оптимизирует выполнение процедуры с каждым ее запуском, в случае с динамичесим запросом вероятно он этого делать не может. Насколько хороша эта оптимизация не знаю. Я бы все же сделал процедуры по обеим принципам и попробовал бы погонять их. Несколько запусков я полагаю мало.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002984
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следовательно, хотя бы теоритически выигрыш при множественных коннектах все-таки будет ?
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002985
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выигрыш в каком случае? План запроса в любом случае используется повторно. А вот насчет оптимизации, как я уже говорил не знаю, совет - измерьте.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002994
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 All: В моей предыдущей реплике фразу "время составления запроса" следует читать как "время составления плана"

2 Genady: что значит "оптимизирует выполнение процедуры с каждым ее запуском"? С каждым разом все лучше и лучше что ли?
А можно оригинал (из BOL)? Я так понимаю что план строится как раз для оптимизации и не перестраивается до применения sp_Recompile. Либо же он перестраивается каждый раз, если указано with recompile и тогда не отличается от динамического запроса. (при этом действительно возможно составление более оптимального плана на текущий момент при условии обновления статистики).
2 Glory: даже при вытеснении плана из кэша, при множественных коннектах время на составление плана несравнимо с 20-25 мин
И если уж коннекты ОЧЕНЬ множественные (настолько что формироваине плана даст сильную нагрузку и будет сильно сказываться на поризводительности), то остается только пожалеть сервер, которому придется кроме того справляться с такой интенсивностью ТАКИХ запросов.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002995
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой, однако, животрепещущий вопрос - за сутки 21 сообщение
Даже не припомню когда еще такое было
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002998
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
2Dmitry: Согласен. Если запрос вызывается 2-3 раза и выполняется 20-30 минут при каждом вызове, время составления плана запроса мало имеет значения. Однако, на практике могут встречаться задачи выполнения в цикле одного и того же параметризованного запроса (с малым временем выполнения) в новым значением параметров на каждом шаге цикла. Если число циклов 1000 и более, а время выполнения запроса мало, то время его компиляции и составления плана оказывается весьма существенным.
2Павел: А тебе известен способ вставки записей в возвращаемый хранимой процедурой набор данных? Что-нибудь вроде Isert into exec MyProc... или Insert into MyProc...?
2Glory: Насчет SQLPrepare. Припоминаю - что-то такое в ODBC действительно было. Приношу извинения за недостоверную информацию. Я мало работал через ODBC, все больше через ADO.
...
Рейтинг: 0 / 0
Есть ли разница в исполнении запроса ?
    #32002999
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Кстати, я читал в какой-то статье (по-моему на сайте MS) о том, как работает оптимизатор SQL-сервера. Он учитывает такую вешь, как стоимость оптимизации, и производит ее поэтапно. Сначала делается черновая грубая оценка времени выполнения запроса. Если оно получается малым, то дальнейшая оптимизация не выполняется, поскольку затраты времени на оптимизацию могут оказаться выше затрат времени на выполнение запроса с грубо построенным планов выполнения. Если же предварительные результаты оценки показывают, что время выполнения запроса должно быть достаточно большим, производится его более тщательная оптимизация для уменьшения этого времени. IMHO, довольно грамотный поход.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Есть ли разница в исполнении запроса ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]