Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.13;
Скачать: CL | DM;

Вниз

Расскажите русским языком, нафига нужен ADOQuery.Prepare?   Найти похожие ветки 

 
Aleksandr ©   (2003-09-23 15:54) [0]

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


ADOQuery1.Prepare;
ADOQuery1.ExecSQL

от просто

ADOQuery1.ExecSQL


 
stone ©   (2003-09-23 15:59) [1]

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


 
roottim   (2003-09-23 16:23) [2]

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 кода происходит один раз, затем меняются параметры и выполняется...
мб пример неудачен но смысл в том...


 
Aleksandr ©   (2003-09-23 16:26) [3]

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


 
stone ©   (2003-09-23 16:33) [4]

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


 
Aleksandr ©   (2003-09-23 16:35) [5]

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


 
Johnmen ©   (2003-09-23 16:46) [6]

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


 
MsGuns ©   (2003-09-23 17:35) [7]

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

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


 
Val ©   (2003-09-23 17:40) [8]

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


 
MsGuns ©   (2003-09-23 17:52) [9]

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

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

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


 
Johnmen ©   (2003-09-23 18:06) [10]

>MsGuns © (23.09.03 17:52)

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



Страницы: 1 вся ветка

Текущий архив: 2003.10.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
6-40549
first_aid
2003-08-15 12:03
2003.10.13
TWebBrowser+прокся+имя пользователя+пароль???


8-40521
Soul_Reaver
2003-06-11 20:26
2003.10.13
DirectX и DelphiX на Delphi6


1-40496
AlEn
2003-10-02 11:18
2003.10.13
как добавить данные из Edit в столбец Listview.


14-40590
Delirium^.Tremens
2003-09-24 13:50
2003.10.13
Разочарование года


1-40346
Mishenka
2003-10-01 23:25
2003.10.13
Как определить существует ли данный каталог?