Сообщение
Merlin » 29 июл 2005, 20:23
А подумать? Переведём запрос с SQL на русский и представим себе, что я не с сервером разговариваю, а с тобой:
А достань-ка ты мне, милейший, звёздочку
ИЗ таблички Реестр
Где Дата равна :потом скажу
И какой-то Фил равен :тоже потом скажу
Теперь прикинь, сказал я тебе дата=сегодня и фил=5. Не, 5 мало, пусть будет 8. Ты пошёл, пошукал по сусекам, и принёс мне вожделенные звёздочки по этим условиям. А теперь я захотел получить звёздочки на дату 21 сентября 1954 года и с филом 50. Ну и как ещё мне можно от тебя добиться результата, кроме как повторить вопрос, заменив цифирь? Другое дело, что ты уже подготовился (типа prepare) к тому, в каких именно сусеках ты будешь шарить, размышлять о том, куда за звёздочками идти, не будешь. Поэтому Prepare у тебя в программе совершенно лишнее. Запрос сам запрепарится при первом выполнении и останется препаренным пока ты не переформулируешь что мол, не звёздочки, а рюмочки и не из реестра, а из серванта. Тогда ему придётся забыть про реестры и звёздочки и подумать - а что такое рюмочки и где у нас стоит сервант. Теперь он готов бегать к серванту и обратно мухой, потому что помнит что это и где. Смысл препаре в этом и IBX делает его автоматически когда надо. А если запрос выполняется слишком долго, надо поанализировать - слишком до фига ты от него хочешь или сформулировал невнятно, ему много бегать или долго думать приходится. Посмотреть план выполнения, заценить, те ли индексы используются или даже те ли созданы, которые надо.