![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос и ProgressBar [D5, D6, D7, IB6.x]
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-)