Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Через ADO+ODBC к INFORMIX [D5, INFORMIX]


Mute ©   (2001-12-18 13:08:00) 

Всем привет.

Не подскажет ли кто-нибудь как выйти из ситуации.
Выполняю запрос к БД INFORMIX с помощью утилиты Query Tool, работающей через ODBC. Запрос при этом идет примерно 13 сек.
Тот же запрос, выполняемый из Delphi (ADOQuery) через ODBC, идет примерно 14 мин.
ADO конечно все замедляет. Но нельзя ли уменьшить время запроса?


Mute   (2001-12-19 10:50:00) [1]

Да, видимо все-таки это тот самый случай (когда надо читать доки). :)
Еще одна интересная фича обнаружилась. Если делать While not EOF do Next; ,
то сканируются все записи. А вот ежели сделать First, то прыгаем на 2-ю запись. Prior после First проходит, но ничего не меняет при этом.
Ладно, буду копать дальше. Спасибо за советы.


Delirium   (2001-12-18 18:31:00) [2]

Я не знаю, как работает INFORMIX, но в MSSQL join-ы существенно ускоряют работу в сложных запросах. Я думаю синтаксис должен быть похожий - надо тебе поэкспериментировать или инфу по INFORMIX-овскому SQL почитать.


Mute   (2001-12-18 18:14:00) [3]

А так он вообще не ест. Говорит - ошибка синтаксиса.


Delirium   (2001-12-18 17:34:00) [4]

Попрбуй так:

select E.ccy as CCY, T.doc_type as DOC_TYPE, T.transfer_type as TRANSFER_TYPE, E.db_acc_l0 as DB_ACC_L0,
E.cr_acc_l0 as CR_ACC_L0, sum(E.amount) as TOTAL, count(*) as amount
from et_wrk_b200 E

join tr_wrk_00 T on T.tran_id=E.tran_id

where E.cr_acc_l0 in ("20206","20202")
and E.entry_date between "08.01.1998" and "08.01.1998"
group by E.ccy, T.doc_type, T.transfer_type, E.db_acc_l0, E.cr_acc_l0


Mute   (2001-12-18 17:08:00) [5]

select E.ccy as CCY, T.doc_type as DOC_TYPE, T.transfer_type as TRANSFER_TYPE, E.db_acc_l0 as DB_ACC_L0,
E.cr_acc_l0 as CR_ACC_L0, sum(E.amount) as TOTAL, count(*) as amount
from et_wrk_b200 E, tr_wrk_00 T
where E.cr_acc_l0 in ("20206","20202")
and T.tran_id=E.tran_id
and E.entry_date between "08.01.1998" and "08.01.1998"
group by E.ccy, T.doc_type, T.transfer_type, E.db_acc_l0, E.cr_acc_l0


Delirium   (2001-12-18 16:47:00) [6]

А запрос покажи, я не пойму как он может работать 14 мин. только потому, что RecordSet - локальный!


Mute   (2001-12-18 16:44:00) [7]

Да там "копейки": всего 71 запись. Я думаю, что это связано с особенностями Informix. При выводе DataSetа на Grid ругается: не могу использовать bookmark с множеством записей. При Last: не могу двигаться по курсору в обратном направлении, хотя While not EOF do Next; отрабатывает. При Prior: недопустимо в данном контексте. И еще RecordCount не возвращается (=-1).


Delirium   (2001-12-18 16:04:00) [8]

Собственно, CursorLocation указывает где будет создан RecordSet на сервере или на клиенте, естественно если резльтат запроса - огромный, то прокачка по сети займёт время. Каков примерный объём (в Mb) возвращаемой информации ?


Mute   (2001-12-18 15:45:00) [9]

В принципе так работает. Даже быстрее, чем просто через ODBC или BDE, но не выводит на DBGrid и не позволяет делать Last, Prior.


Delirium   (2001-12-18 15:23:00) [10]

Попробуй
CursorLocation=clUseServer


Mute   (2001-12-18 15:21:00) [11]

То же самое.


Delirium   (2001-12-18 14:41:00) [12]

Тогда, дело действительно в настройках ADO-соединения, посмотри CursorType и CursorLocation, самый быстрый вариант:
CursorType=ctStatic
CursorLocation=clUseClient


Mute   (2001-12-18 14:35:00) [13]

Тоже, как и в Query Tool, примерно секунд 13.


Delirium   (2001-12-18 13:54:00) [14]

А сколько запрос работает в TQuery ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо