Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-40280
waw
2003-09-19 15:42
2003.10.13
TADOQuery параметры с одинаковыми наименованиями


1-40408
Falt
2003-09-30 22:14
2003.10.13
Промежутки


14-40570
Артем К
2003-09-25 06:28
2003.10.13
Исходник простенького редактора эл.схем? (типа мини Visio).


14-40653
DProg
2003-09-24 11:20
2003.10.13
Как просто и быстро передать список строк от прогр. к программе?


1-40490
Tornado
2003-10-02 11:41
2003.10.13
Дилетанский вопрос по функциям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский