Форум: "Базы";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
ВнизРасскажите русским языком, нафига нужен 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c