![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли узнать сколько записей в SQL запросе во время его вып..? [D5, IB5.x]
Sirus © (2002-05-08 08:14:00)Привет мастерам...
Есть вопрос: Можно ли узнать сколько записей уже считано в SQL запрос во время его выполнения???
У меня запрос на выборку выполняется страшно долго... Хотелось бы сделать ProgressBar только вот неизвестно сколько процентов работы выполнено...
With best regards Sirus
Sirus (2002-05-08 14:44:00) [1]Всем спасибо за участие в дискуссии... (моем баловстве) :)))
Но это было ничуть не баловство... просто была такая проблемка..
А решил проблему я без всяких ПрогрессБаров...
Попросту сделал бегущую строку которая бегает туда сюда...
Юзеру понравилось... А 500000 записей нужны были для подсчета...
Причем скажем 157234 запись напрямую зависела от 1657 записи...
А 1657 запись в свою очередь зависела от 461905 записи... и вот так до конца... то есть запрос должен был делиться еще на много маленьких запросиков... И нечего советовать...
просто скажите подтип Johnmen"a
> Полноценно нереализуемо...
With best regards Sirus...
P.S. Я вовсе не баловень
Johnmen (2002-05-08 14:13:00) [2]>kaif © (08.05.02 14:06) : Полностью согласен !
kaif (2002-05-08 14:06:00) [3]SELECT COUNT(*) я предлагал для случая, когда сам запрос быстрый, а Fetch-ей много. Потом для ProgressBar.Max можно иметь и приблизительное кол-во записей. в конце концов, можно открыть транзакцию repeatable read (snapshot).
Я не предлагаю все это, как выход. Но иногда рассмотрение всех альтернатив позволяет легче примириться с тем, что есть или создать эрекцию для улучшения общей логики.
Зачем качать 500тыс. записей на клиент? Если для последующей печати или записи в файл, к примеру, то тут возможны варианты умных решений.
А если для просмотра, то зачем из вообще скачивать? Кто это смотреть будет?
Если для математической обработки, то может лучше все это на сервере организовать при помощи всяких ХП и UDF?
Reindeer Moss Eater (2002-05-08 13:54:00) [4]> kaif
У человека юзер скучал ожидая результаты одного запроса, теперь ему предлагают сначала дождаться Select Count,
потом смотреть на прогрессбар с отображением основного запроса и все для того чтобы потом выяснилось что "в это время в замке" другой юзер сделал Truncate этой таблице.
Johnmen (2002-05-08 13:49:00) [5]>kaif © (08.05.02 13:39)
Если быть абсолютно точным, то SELECT COUNT(*)... не поможет, т.к. между ним и содержательным запросом может измениться количество записей, напр.др.юзером....
kaif (2002-05-08 13:39:00) [6]А что значит запрос выполняется долго?
1.Долго выполняется сам запрос до первого Fetch
2.Долго выкачиваются данные при помощи Fetch.
В 1-м случае надо найти способ ускорить запрос (грамотно построить базу, проиндексировать поля, используемые в объединении и т.п.)
Во 2-м случае можно не делать сразу Fetch всех записей, а максимальное кол-во записей можно узнать предварительно с помощью другого запроса, что-то вроде SELECT COUNT(*)... с ограничениями, соответствующими ограничениям первого запроса.
Johnmen (2002-05-08 11:45:00) [7]>Reindeer Moss Eater (08.05.02 11:38)
Это был ответ на вопрос Автора ветки...
>Я просто хотел сказать, что по-русски это
>называется "баловство" (то что хочет Sirus) - вот именно...
>Reindeer Moss Eater (08.05.02 10:40) - Никак...
Reindeer Moss Eater (2002-05-08 11:38:00) [8]Если это был ответ на мой вопрос, то прошу прощения за двусмысленность.
Я конечно же не спрашивал как выставить максимальное значение.
Я просто хотел сказать, что по-русски это называется "баловство" (то что хочет Sirus)
Johnmen (2002-05-08 11:28:00) [9]>+aaZ (08.05.02 11:24)
За что такие обидки ? По-моему, я четко ответил на поставленный вопрос...
+aaZ (2002-05-08 11:24:00) [10]2 Johnmen:
Я смотрю, ты умнее всех ... на словах, а на деле не хватает тебя ответить?
Johnmen (2002-05-08 10:52:00) [11]Полноценно нереализуемо...
Reindeer Moss Eater (2002-05-08 10:40:00) [12]Если даже узнать сколько записей зафетчено, то как реализовать прогресс бар?
Очень часто сам сервер не знает сколько записей будет в рекордсете после выполнения запроса. Про клиента я уже не говорю.
Как выстваить максимальное значение прогресса?
Сергей Иванов (2002-05-08 10:34:00) [13]В BDE есть структура DBIQryProgress. Попробуй там покопаться.
Reindeer Moss Eater (2002-05-08 09:19:00) [14]Когда скучающий юзер получит хотя бы десятую часть всех 500000 записей, он начнет скучать еще сильнее
Sirus (2002-05-08 09:16:00) [15]Я по моему неправильно поставил вопрос...
Надо узнать сколько записей уже считано в запрос TQuery...
Текст запроса:SELECT * FROM SUBS_DATA
Записей в таблице около500000...
Чтобы юзер не скучал во время открытия запроса, ему нужен прогрессбар...
Вопрос: Как все это реализовать???
Oleg_er (2002-05-08 08:44:00) [16]savva © (27.04.02 09:08)
Если использовать компоненты TADOQuery, то там есть событие OnFetchProgress
procedure Tdata.qryPodTemaFetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
end;
что к чему - сам разберешься, там все понятно...
Oleg_er (2002-05-08 08:37:00) [17]используй ADOQuery