Главная страница
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.015 c
3-40262
prorok2
2003-09-23 09:42
2003.10.13
Список доступных SQL серверов в сети


14-40667
alxx
2003-09-23 16:30
2003.10.13
Найти файлы по маске и в них заменить одну строку на другую


14-40631
Johnmen
2003-09-24 14:26
2003.10.13
А любят ли программеры рыбу ?


4-40739
diMAN
2003-08-06 19:25
2003.10.13
Изменение размера шрифта у консольного приложения


3-40290
bushmen
2003-09-22 10:43
2003.10.13
Трёхзвенная архитектура