Форум: "Базы";
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];
ВнизЧерез ADO+ODBC к INFORMIX Найти похожие ветки
← →
Mute (2001-12-18 13:08) [0]Всем привет.
Не подскажет ли кто-нибудь как выйти из ситуации.
Выполняю запрос к БД INFORMIX с помощью утилиты Query Tool, работающей через ODBC. Запрос при этом идет примерно 13 сек.
Тот же запрос, выполняемый из Delphi (ADOQuery) через ODBC, идет примерно 14 мин.
ADO конечно все замедляет. Но нельзя ли уменьшить время запроса?
← →
Delirium (2001-12-18 13:54) [1]А сколько запрос работает в TQuery ?
← →
Mute (2001-12-18 14:35) [2]Тоже, как и в Query Tool, примерно секунд 13.
← →
Delirium (2001-12-18 14:41) [3]Тогда, дело действительно в настройках ADO-соединения, посмотри CursorType и CursorLocation, самый быстрый вариант:
CursorType=ctStatic
CursorLocation=clUseClient
← →
Mute (2001-12-18 15:21) [4]То же самое.
← →
Delirium (2001-12-18 15:23) [5]Попробуй
CursorLocation=clUseServer
← →
Mute (2001-12-18 15:45) [6]В принципе так работает. Даже быстрее, чем просто через ODBC или BDE, но не выводит на DBGrid и не позволяет делать Last, Prior.
← →
Delirium (2001-12-18 16:04) [7]Собственно, CursorLocation указывает где будет создан RecordSet на сервере или на клиенте, естественно если резльтат запроса - огромный, то прокачка по сети займёт время. Каков примерный объём (в Mb) возвращаемой информации ?
← →
Mute (2001-12-18 16:44) [8]Да там "копейки": всего 71 запись. Я думаю, что это связано с особенностями Informix. При выводе DataSetа на Grid ругается: не могу использовать bookmark с множеством записей. При Last: не могу двигаться по курсору в обратном направлении, хотя While not EOF do Next; отрабатывает. При Prior: недопустимо в данном контексте. И еще RecordCount не возвращается (=-1).
← →
Delirium (2001-12-18 16:47) [9]А запрос покажи, я не пойму как он может работать 14 мин. только потому, что RecordSet - локальный!
← →
Mute (2001-12-18 17:08) [10]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 17:34) [11]Попрбуй так:
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 18:14) [12]А так он вообще не ест. Говорит - ошибка синтаксиса.
← →
Delirium (2001-12-18 18:31) [13]Я не знаю, как работает INFORMIX, но в MSSQL join-ы существенно ускоряют работу в сложных запросах. Я думаю синтаксис должен быть похожий - надо тебе поэкспериментировать или инфу по INFORMIX-овскому SQL почитать.
← →
Mute (2001-12-19 10:50) [14]Да, видимо все-таки это тот самый случай (когда надо читать доки). :)
Еще одна интересная фича обнаружилась. Если делать While not EOF do Next; ,
то сканируются все записи. А вот ежели сделать First, то прыгаем на 2-ю запись. Prior после First проходит, но ничего не меняет при этом.
Ладно, буду копать дальше. Спасибо за советы.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c