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

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

Запрос и ProgressBar [D5, D6, D7, IB6.x]


Страницы:   1 2 3

Dummes ©   (2005-06-10 12:49:00) 

Посоветуйте как ослеживать время выполнения SQL-запросов с отображением в ProgressBar.

Dummes


Zacho   (2005-06-16 13:16:00) [1]

В смысле, "как посылается" ? Обычно, TIBSQL.

Я сделал 2 простеньких тестовых приложения. В одном - запрос, "дергающий" генератор, в другом - запрос, читающий "текущее" значение генератора.

Собственно, моей целью было убедится в том, что генератор будет менять значение именно в результате вызова isc_dsql_fetch, а не isc_dsql_execute2 или isc_dsql_execute. В чём и убедился :)

Так что использовать генераторы можно только для "прогресса" фетча, а это гораздо проще сделать без генераторов (например, потому что не понадобится дополнительный коннект для отслеживания изменения значения генератора)


Mike Kouzmine   (2005-06-16 12:26:00) [2]

Zacho ©   (16.06.05 11:01) [42] Это понятно. Я спросил как клиент получает. Не текст запроса, а как он посылается.


Zacho   (2005-06-16 11:01:00) [3]

Mike Kouzmine ©   (16.06.05 10:36) [41]

Естественно, функцией GEN_ID


Mike Kouzmine   (2005-06-16 10:36:00) [4]

Zacho ©   (15.06.05 21:24) [40] Ради интереса в выходные проверю.
А как ты смотришь значение генератора?


Zacho   (2005-06-15 21:24:00) [5]

Zacho ©   (15.06.05 20:45) [39]
Но новое значение генератора клиент получит только после очередного fetch (т.е. после MyDataSet.Next


Дополню: на самом деле клиент эти значения будет получать "пачками", в зависимости от того, сколько записей выберется за один фетч.
Только что проверил :) И просто запросом, и с ХП. Запрос  выбирает примерно 7000 записей. В другом процессе отслеживается значение генератора. В первом делаем DataSet.Open. Во втором процессе видим, что генератор прирос на 400. В первом начинаем делать DataSet.Next. Во втором процессе видим, что некоторое время значение генератора не изменяется, потом (очевидно, первый процесс "затребовал" новую порцию данных) начинает расти. Потом останавливается. И т.д.
Так что отслеживать "прогресс" выполнения запроса с помощью генератора - занятие довольно бессмысленное.

P.S. Приведённые мной цифры довольно условны.


Zacho   (2005-06-15 20:45:00) [6]

Mike Kouzmine ©   (15.06.05 20:21) [37]
Нет. Не понят. Если база локальная, то да. Иначе нет.


Не важно, локальная или сетевая. Но новое значение генератора клиент получит только после очередного fetch (т.е. после MyDataSet.Next), а зачем тогда генератор ? То же самое можно сделать и на клиенте, и обычной переменной в ХП.
С "прерыванием запроса" - другое дело. Но, по сути дела, скорее всего это будет "прерыванием фетча", а не запроса. Впрочем, здесь уже я могу ошибаться :)


Mike Kouzmine   (2005-06-15 20:29:00) [7]

Хотя я сам не пробовал. Скорее всего не прав. Да и обсуждалось выше. Сморозил.


Mike Kouzmine   (2005-06-15 20:21:00) [8]

Johnmen ©   (15.06.05 17:59) [35] За все надо платить. :) Плата Select count(*) where ........
Zacho ©   (15.06.05 19:38) [36] Нет. Не понят. Если база локальная, то да. Иначе нет.


Zacho   (2005-06-15 19:38:00) [9]

Mike Kouzmine ©   (15.06.05 16:29) [34]
Берешь генератор и в хп каждую итерацию фор селект прибавляешь по 1. А клиетн читает.


Ну и чем это отличается от цикла
MyDataSet.Open;
while not MyDataSet.Eof do
begin
 ... // а здесь мы что-то делаем с прогрессбаром ...
 MyDataSet.Next;
end;
на клиенте ?
Правильно, ничем. Намёк понятен ? :)

> Кстати, с помощью генератора можно прерывать и
>выполнение хп.
> Поясню.  теперь клиент меняет значение генератора, хп
> каждую итерацию читает, как изменил - выход.

А это - уже другая задача. Кстати, см. Digitman ©   (14.06.05 10:40) [19]
Он ведь истинную правду сказал :)


Johnmen   (2005-06-15 17:59:00) [10]

>Mike Kouzmine ©   (14.06.05 17:13) [32]

Один недостаток (как уже говорилось) - не узнать заранее размер стакана.


Mike Kouzmine   (2005-06-15 16:29:00) [11]

Sergey13 ©   (15.06.05 09:34) [33] А что тут умолять. Все сразу поняли как. Берешь генератор и в хп каждую итерацию фор селект прибавляешь по 1. А клиетн читает.
Кстати, с помощью генератора можно прерывать и выполнение хп.
Поясню.  теперь клиент меняет значение генератора, хп каждую итерацию читает, как изменил - выход.


Sergey13   (2005-06-15 09:34:00) [12]

2[32] Mike Kouzmine ©   (14.06.05 17:13)
>Digitman ©   (10.06.05 12:51) [1] Можно, через генератор.
Теперь все должны умолять о подробностях? 8-)


Mike Kouzmine   (2005-06-14 17:13:00) [13]

Digitman ©   (10.06.05 12:51) [1] Можно, через генератор.


ЮЮ   (2005-06-14 12:53:00) [14]

>Значит через fetch можно отслеживать?

fetch - это уже второй этап, когда запрос уже выполнился и большое количество отобранных записей передается нп клиента.
Так что это не для тебя: и запрос у тебя оптимальный, и записей, как положенно, возвращает немного. Так что fetch будет моментальный


Zacho   (2005-06-14 12:52:00) [15]

Dummes   (14.06.05 12:42) [28]

Вот именно фетч ты и можешь "визуализировать". А выполнение запроса - нет.

msguns ©   (14.06.05 10:43) [20]
А если сотворить на сервере евент..


Не получится :))) Евенты придут клиенту только после коммита. Все сразу :)
Но нечто анологичное можно сотворить с UDF.


msguns   (2005-06-14 12:46:00) [16]

Можно поподробнее про асинхронные операции в ИБ ?


Dummes   (2005-06-14 12:42:00) [17]

А вот что нашел в литературе:FetchProgress (RecordsetEvent) Method
     

This method is called periodically during a lengthy asynchronous operation to report how many more rows have currently been retrieved (fetched) into the Recordset.

Syntax

FetchProgress Progress, MaxProgress, adStatus, pRecordset

Parameters

Progress   A Long. The number of records that have currently been retrieved by the fetchoperation.

MaxProgress   A Long. The maximum number of records expected to be retrieved.

adStatus   An EventStatusEnum status value.

pRecordset   A Recordset object. The object for which the records are being retrieved.

Значит через fetch можно отслеживать?


Dummes   (2005-06-14 11:02:00) [18]

Dummes, поюзай TDBProgressBar из RX.

А смысл юзать?
Проблемма Max и приращения остается...Увы.


Lexer   (2005-06-14 10:59:00) [19]

Dummes, поюзай TDBProgressBar из RX.


Sergey13   (2005-06-14 10:59:00) [20]

2[23] Dummes   (14.06.05 10:53)
>Запросы оптимизированны.
ИМХО, это слишком оптимистическое заявление. 8-)
Редко встречаются запросы, которые нельзя бы было улучшить. Разве что
select * from table. 8-)


Страницы:   1 2 3

Наверх

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