Страница 1 из 1
Есть ли чтонибудь более эффективное чем Open - close????
Добавлено: 29 июл 2005, 20:02
NT Man
Пишу программу на Delphi в которой пользователь с помощью двух условий выбирает группу строчек и редактирует. Условие задаётся при помощи:
SELECT *
FROM REESTR
WHERE (REESTR.ODATE =

date)AND(REESTR.FIL = :fil)
ORDER BY OTIME
IBQueryReestr.Params[0].AsDateTime := DateTimePicker1.Date;
IBQueryReestr.Params[1].AsInteger := DBLookupComboBoxFil1.KeyValue;
IBQueryReestr.Close;
IBQueryReestr.Prepare;
IBQueryReestr.Open;
Работает это довольнотаки медленно особенно если учесть, что условия фильтра могут меняться достаточно быстро. Вопрос есть ли реальная альтернатива связке Close - Prepare - Open, если брать во внимание что SQL код не меняется. Меняются лишь параметры.
Добавлено: 29 июл 2005, 20:23
Merlin
А подумать? Переведём запрос с SQL на русский и представим себе, что я не с сервером разговариваю, а с тобой:
А достань-ка ты мне, милейший, звёздочку
ИЗ таблички Реестр
Где Дата равна :потом скажу
И какой-то Фил равен :тоже потом скажу
Теперь прикинь, сказал я тебе дата=сегодня и фил=5. Не, 5 мало, пусть будет 8. Ты пошёл, пошукал по сусекам, и принёс мне вожделенные звёздочки по этим условиям. А теперь я захотел получить звёздочки на дату 21 сентября 1954 года и с филом 50. Ну и как ещё мне можно от тебя добиться результата, кроме как повторить вопрос, заменив цифирь? Другое дело, что ты уже подготовился (типа prepare) к тому, в каких именно сусеках ты будешь шарить, размышлять о том, куда за звёздочками идти, не будешь. Поэтому Prepare у тебя в программе совершенно лишнее. Запрос сам запрепарится при первом выполнении и останется препаренным пока ты не переформулируешь что мол, не звёздочки, а рюмочки и не из реестра, а из серванта. Тогда ему придётся забыть про реестры и звёздочки и подумать - а что такое рюмочки и где у нас стоит сервант. Теперь он готов бегать к серванту и обратно мухой, потому что помнит что это и где. Смысл препаре в этом и IBX делает его автоматически когда надо. А если запрос выполняется слишком долго, надо поанализировать - слишком до фига ты от него хочешь или сформулировал невнятно, ему много бегать или долго думать приходится. Посмотреть план выполнения, заценить, те ли индексы используются или даже те ли созданы, которые надо.
Добавлено: 29 июл 2005, 22:03
NT Man
Понял без Close и Open никак....
Prepare вообще убираем т.к. сервак не дурак и сам при первой возможности будет искать там где надо.
Единственное что смущает, неужели после Close сервак помнит где искать нужную мне звёдочку? Т.е. сохраняется ли оптимизация после close??? Если да то вопрос исчерпан, а если нет то так эту оптимизацию сохранить для следующего запроса. Потамучто прироста скорости не чувствую после первого запроса.
Добавлено: 30 июл 2005, 00:04
Merlin
Загляни в сорцы IBX, как он Open делает и когда Prepare и UnPrepare, и всё поймёшь. Если сделаешь так
Prepare
Open-Close Open-Close Open-Close
Unprepare
будет как у него самого. А между Open и Close он действительно нафиг не нужен. Прироста производительности не видишь либо потому что запрос прост как мычание коровы и с первого раза отрабатывает быстрее не бывает, либо наоборот, плохой и не оптимизируется вовсе - нет нужных индексов. Первый кандидат на это дело - order by.
Добавлено: 30 июл 2005, 15:49
NT Man
Merlin, спасибо...
Больше не буду бояться Close-Open.