Остановки при извлечении данных запроса FB1.5 + IBX 6.08 + C

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
GrafitIzh
Сообщения: 5
Зарегистрирован: 16 авг 2010, 10:35

Остановки при извлечении данных запроса FB1.5 + IBX 6.08 + C

Сообщение GrafitIzh » 10 май 2012, 16:59

Есть таблица с значениями датчиков, 4 колонки:
IDSENSORFACT - первичный ключ, bigint
FACTDATE - дата показания, timestamp
SENSORNUM - номер датчика, int
FACTVALUE - показание датчика, float

В таблице созданы прямой и обратный индексы по полям IDSensorFact и FactDate.

Нужно извлечь все показания датчиков в некотором временном интервале (одну сессию).
Программа написана на C++Builder 6, использую компоненты IBX, действую таким способом:
1. При старте программы создаю IBDatabase и IBTransaction, IBSQL
Параметры транзакции: read_committed, rec_version, nowait
2. По запросу пользователя, узнаю сколько всего будет записей в сессии отдельным запросом, устанавливаю нужный текст запроса в IBSQL и выполняю ExecQuery.
3. В таймере вынимаю по 200 записей из запроса с помощью IBSQL->Next, перерабатываю эти данные и отображаю процент выполнения пользователю

Текст программы с заполнением запроса:

Код: Выделить всё

        MsrDatabase->ActSQL->SQL->Add ("SELECT");
        MsrDatabase->ActSQL->SQL->Add ("IDSensorFact, FactDate, SensorNum, FactValue");
        MsrDatabase->ActSQL->SQL->Add ("FROM SensorFacts");
        MsrDatabase->ActSQL->SQL->Add ("WHERE (IDSensorFact >= " + IntToStr(ActIDFact) + ")");
        if (double (SessionProps->EndDate)){
            MsrDatabase->ActSQL->SQL->Add ("AND (FactDate <= '" + SessionProps->EndDate.FormatString("yyyy-mm-dd hh:nn:ss") + "')");
        }
        MsrDatabase->ActSQL->SQL->Add ("ORDER BY IDSensorFact");
На практике выходит так:
1. ExecQuery проходит быстро, первые секунд 15 выборка данных из запроса в таймере идет хорошо, сервер firebird загружает почти целиком одно ядро процессора,
2. потом все замирает: firebird освобождает процессор, моя программа перестает реагировать на действия пользователя (подвисает).
3. далее выборка данных продолжается очередные 15 секунд, потом опять подвисание... и так по циклу.

Путем прогона программы в пошаговом режиме выяснил, что зависает именно при вызове метода IBSql->Next, но не каждый раз.
Добавил в программе логирование в текстовый файл, откуда выяснил, что запрос извлекается порциями по 2520 записей, иногда по 1260 записей, зависания длятся ровно по 60 секунд.
В ibexpert запрос проходит без проблем, когда смотрю статистику запроса, то вижу что Indexed reads = 2520.

Вопрос знатокам: как исправить ситуацию, чтобы соединение не подвисало? В какую сторону копать?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Остановки при извлечении данных запроса FB1.5 + IBX 6.08

Сообщение kdv » 10 май 2012, 20:05

я уже вам ответил.
http://www.sql.ru/forum/actualutils.asp ... g=12532082
чего вы по форумам скачете?

Ответить