Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расскажите русским языком, нафига нужен ADOQuery.Prepare? [D7, MSSQL]


Aleksandr ©   (2003-09-23 15:54:00) 

Сколько лет работаю, везде, где читаю про этот метод, одна и та же стандартная фраза типа подготовить запрос на сервере... Но мне все равно непонятно, что это означает, и чем в отношении производительности или качества отличаются


ADOQuery1.Prepare;
ADOQuery1.ExecSQL

от просто

ADOQuery1.ExecSQL


Johnmen   (2003-09-23 18:06:00) [1]

>MsGuns © (23.09.03 17:52)

Да нет же, не был я категоричен. Просто сам у себя спросил, зачем писать явно лишний код ? Для себя же и ответил.
Твои резоны, возможно, тоже имеют право быть.


MsGuns   (2003-09-23 17:52:00) [2]

>Val © (23.09.03 17:40) [8]
>как невыполнение Prepare относится к этим вещам?

Объясняю на примере. В проекте есть масса запросов к разным таблицам и для разных целей, выполняемых, к примеру, одной TIBQuery. При этом есть запросы разовые (например, для получения детальной информации по выбранному для редактирования контрагенту), а есть периодические (подсчет сумм и количества записей для итогов по "гриду"). Первые мне не надо перечитывать, поэтому я ставлю там Prepare или не ставлю, но если ставлю, то явно даю понять, что запрос у меня может измениться кардинально. Во втором случае при первом запуске (активизируется форма с тем самым гридом) я ставлю Prepare, а вот событиях датасета AfterScroll, AfterPost и т.д. я просто делаю Close/Open без подготовки, давая понять, что запрос просто переоткрывается.

Хотя, конечно, это дело лично каждого и я никому ничего не навязываю. Просто Johnmen был, ИМХО, излишне категоричен ;))


Val   (2003-09-23 17:40:00) [3]

>MsGuns © (23.09.03 17:35) [7]
как невыполнение Prepare относится к этим вещам?


MsGuns   (2003-09-23 17:35:00) [4]

>Johnmen © (23.09.03 16:46) [6]
> А значит и явное Prepare не нужно никогда.

А как быть с алгоритмикой и читабельностью кода ?


Johnmen   (2003-09-23 16:46:00) [5]

Не знаю, как там в АДО, а в нормальных компонентах в методе ExecSQL сделано примерно так:
if not Prepared then Prepare;
То есть, если несколько раз выполнять ExecSQL, то препарирование произойдет неявно один раз при первом вызове. А значит и явное Prepare не нужно никогда.


Aleksandr   (2003-09-23 16:35:00) [6]

Понял, спасибо... У меня такие не случаются.


stone   (2003-09-23 16:33:00) [7]

Prepare может помочь если однотипный запрос выполняется несколько раз подряд + СУБД должно поддерживать режим построения плана выполнения запроса. Содержимое запроса при этом не имеет значения.


Aleksandr   (2003-09-23 16:26:00) [8]

Ну, а нужен ли Prepare, если делается запрос с кейсами и прочими подзапросами?


roottim   (2003-09-23 16:23:00) [9]

2Aleksandr © (23.09.03 15:54)
+ к Stone пример:

ADOQuery1.SQL.Text := "UPDATE TABLE_NAME SET FIELD_NAME = "T" WHERE ID = :P_1";
ADOQuery1.Prepare;
for i := 0 to 10000 do
begin
ADOQuery1.Parameters[0].Value = i;
ADOQuery1.ExecSQL;
end;
ADOQuery1.UnPrepare;


вот тут проявляется выгода!, подготовки плана запроса, компиляции SQL кода происходит один раз, затем меняются параметры и выполняется...
мб пример неудачен но смысл в том...


stone   (2003-09-23 15:59:00) [10]

Строится план выполнения запроса, в результате сам запрос может выполнится быстрее. Впрочем, тут нужно рассматривать каждый частный случай. Зачастую, prepare не требуется.


Наверх

Титульная страница Поиск, карта сайта Написать письмо