Вопросы и ответы по MS SQL Server

  Все выпуски  

Вопросы и ответы по MS SQL Server


Информационный Канал Subscribe.Ru


Вопросы и ответы по MS SQL Server

Выпуск No. 21 от 2003-07-11

Вопрос : Как показать прогресс выполнения хранимой процедуры?

Ответ:
Каких-то специальных встроенных средств для определения процесса выполнения процедуры в MSSQL нет. Я покажу один из наиболее простых способов, в котором используются стандартные средства SQL. Хотя "по взрослому" правильнее использовать Notification Services, или что-то вроде того. (О Notification Services можно почитать в манускрипте http://www.sql.ru/articles/mssql/Notification_Services.zip, ZIP - 1060K. Автор Александр Гладченко)

Суть этого способа заключается в создании таблицы, содержащей информацию о ходе выполнения процедуры. В нашем случае это будет глобальная временная таблица ##Progress.
Ничего сверхоригинального. Но есть один интересный момент.
Для работы необходимо иметь два соединения с базой данных. Запуск кода в первом соединении должен производиться в асинхронном режиме, т.е. программа не должна ждать завершения выполнения скрипта:
-- создание временной таблицы, содержащей информацию прогрессе

if OBJECT_ID('tempdb..##Progress') IS NULL
begin
create table ##Progress (i int)
insert ##Progress values(0)
end
else
update ##Progress set i=0

declare @i int, @f float
set @i=0

while @i<100-- 100%
begin
-- набор операторов для обработки
select @f=sum(a.info-b.info)
from sysobjects a
join sysobjects b on b.ID<a.ID

set @i=@i+1
-- обновление информации о прогрессе
update ##Progress set i=@i
end

Считывание информации о ходе выполнения производится во втором соединении с помощью следующего скрипта:
declare @t int, @p int

select @t=i, @p=i from ##Progress with (nolock)
while @t<100-- процесс выполнен на 100%
begin
select @p=i from ##Progress with (nolock)
if @t<>@p break-- сменился показатель прогресса

waitfor delay '00:00:01'-- задержка на 1 секунду до следующей проверки
end

select @p as Progress

После того, как этот код вернет значение счетчика, его нужно запустить еще раз. До тех пор, пока значение счетчика не будет равно 100.
Обратите внимание на использование оператора WAITFOR. С помощью него сервер не будет загружаться постоянным запросом о ходе выполнения процедуры.
Сетевой трафик также не будет загружен, потому что максимальное количество запросов с клиентской станции информации о ходе выполнения не будет превышать число 100, а при быстром выполнении процедуры будет равно количеству секунд, в течение которых она выполнялась.

"Подводным камнем" этого метода является то, что при некорректном завершении выполнения скрипта в первом соединении, необходимо принудительно завершить работу скрипта во втором соединении. В данном случае это легче всего сделать на клиентской станции с помощью соответствующих проверок.

Конечно, если Ваша процедура выполняется несколько секунд, то не стоит городить весь этот огород. Но если выполнение длится несколько минут, то информация о работе не помешает. В этом случае также пригодится подробная служебная информация о процессе выполнения процедуры, которая поможет Вам найти "узкие" места в ее коде.
Генеральный спонсор рассылки - ООО "Софтоматика"
Надеюсь, Вы нашли эту информацию полезной. Вопросы, предложения и пожелания шлите на адрес sql@likor.ru
С уважением, Сергей Кошкин.
Обсудить этот выпуск можно на Форуме рассылки

Архив рассылки смотрите на сайте Рассылки http://sql.softmatics.ru/
Рейтинг@Mail.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное