Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Добрый день.
Есть ли какой-то способ отслеживания хода выполнения процедуры в случае с курсорами?

Условия: нагруженный сервер. Порядка 10 млн записей в главной таблице. Курсоры, увы, неизбежны в этой операции.
Из таблицы выбираются данные (ну скажем порядка 1000 - 10 000). Эти данные внутри курсора обрабатываются через хранимку. В хранимке по опр многочисленным условиям проставляются данные в эту и другие таблицы.
Поскольку главная таблица сильно нагружена, между каждой итерацией стоит waitFor delay '00:00:00.010'.
Время выполнения в таком случае сильно не играет (хотя при прочих равных все же имеет значение). Однако хотелось бы получать некоторые данные о ходе выполнения и иметь возможность (скажем) остановить выполнение (не обязательно).

Примерный код:
    declare CUR cursor local for
      select id,code from maintable with (nolock)
      where catalogueid=@catalogueid 
    Open cur
    fetch next from cur into @id,@code
    while @@FETCH_STATUS = 0
    begin
      exec UpdateMainSP @id=@id,@catalogueid=@catalogueid,@code=@code  -- delay внутри процедуры
      fetch next from cur into @id,@code
    end
    close cur
    deallocate cur 


Первое что приходит в голову: писать все количество во временную таблицу первой записью и второй записью обновлять значение в каждой итерации.
  -- create table #tmp (id int, cnt int)
  insert into #tmp  
  select 1,COUNT(*) from maintable where catalogueid=@catalogueid 
  insert into #tmp (id,cnt) value(2,0)
  declare CUR cursor local for
      select id,code from maintable with (nolock)
      where catalogueid=@catalogueid 
    Open cur
    fetch next from cur into @id,@code
    while @@FETCH_STATUS = 0
    begin
      set @cnt = @cnt + 1
      update #tmp set cnt = @cnt where id = 2
      exec UpdateMainSP @id=@id,@catalogueid=@catalogueid,@code=@code  -- delay внутри процедуры
      fetch next from cur into @id,@code
    end
    close cur
    deallocate cur
  -- drop table #tmp

Из внешней среды (скажем в интерфейсе из которого запускается процедура обработки) обращаться по таймеру к #tmp и проверять соотношение id = 1 и id = 2. Создать таким образом прогресс бар.

Но почему-то мне кажется, что есть какая-то более продвинутая и менее нагружающая вещь. Если знаете, поделитесь плиз.
Благодарю.
14 авг 12, 20:50    [13011532]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
В дополнение: внутри хранимки тоже есть курсор. Там идет отбор по записям из других таблиц, многочисленные проверки и так далее.
Архитектура увы такая, учитывая, что кое-где почти пивоты.
14 авг 12, 20:53    [13011547]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Нет идей или сам вопрос идиотский?
15 авг 12, 13:30    [13014487]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
Luke, use SET CONTEXT_INFO
15 авг 12, 13:33    [13014509]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_,

Ну как бы временные таблицы из другой сессии не особо позапрашиваешь, надо тогда глобальную временную таблицу делать через ##.
Если нужен банальный прогресс бар, то можно просто в отдельную таблицу (пусть даже глобальную временную) писать номер шага.
В духе
create table ##tmp (a int)
insert into ##tmp values (1)
update ##tmp set a = a + 1
15 авг 12, 13:38    [13014547]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
Luke, use SET CONTEXT_INFO

Thanks, sensei!

А как им воспользоваться в "контексте" моего вопроса.
Из хелпа я не очень понял, как можно, скажем, запустив два smss, в первом запустив запрос, а во втором получить это контекст_инфо? Наверное в двух разных конекшнах (делаю вывод) - нельзя.

Тогда может быть вы имели в виду запуск батча в асинхронном режиме, и по ходу курсора обновлять CONTEXT_INFO? А другим запросом (в том же конекшне) проверять значение? Растолкуйте.

nicescar , ну так я вроде и предложил такой метод. Только мне он кажется кощунственным. Ну разве что решетки перепутал (сначала там их было две) :)
15 авг 12, 13:52    [13014686]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Промешан_
Из хелпа я не очень понял, как можно, скажем, запустив два smss, в первом запустив запрос, а во втором получить это контекст_инфо? Наверное в двух разных конекшнах (делаю вывод) - нельзя.

На чем основан этот вывод ?
Что мешает(кроме отсутсвия прав) в любом коннекте выполнить
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id =<номер другого коннекта>
15 авг 12, 14:05    [13014844]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
_Промешан_
Из хелпа я не очень понял, как можно, скажем, запустив два smss, в первом запустив запрос, а во втором получить это контекст_инфо? Наверное в двух разных конекшнах (делаю вывод) - нельзя.

На чем основан этот вывод ?
Что мешает(кроме отсутсвия прав) в любом коннекте выполнить
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id =<номер другого коннекта>
В таком случае наверное и не надо SET context_info устанавливать. Верно?

А в одном коннекте (пока выполняется батч) можно послать другой запрос? В этом случае ведь он тоже будет относиться к текущему @@SPID.
15 авг 12, 15:31    [13015608]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Промешан_
В таком случае наверное и не надо SET context_info устанавливать. Верно?

Если вы его не установите, то как собственно узнаете о прогрессе то ?


_Промешан_
А в одном коннекте (пока выполняется батч) можно послать другой запрос?

Нет
15 авг 12, 15:36    [13015630]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
_Промешан_,

Да, и не вполне понятно какое поле там отвечает за "инкремент". Там же в основном суммируется по заданному @@SPID.
Единственное что там можно проверить статус со sleeping на running. А все остальные параметры обновляются только по завершении батча.
15 авг 12, 15:36    [13015638]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
_Промешан_
В таком случае наверное и не надо SET context_info устанавливать. Верно?

Если вы его не установите, то как собственно узнаете о прогрессе то ?
По @@SPID, а разве нет? Судя по проставлению разных context - количество записей в результирующем наборе по session_id не меняется. И в этой записи остается последний использованный context для других батчей.

Так вот и о прогрессе то как узнать в итоге? Что то я не понял пока.
15 авг 12, 15:40    [13015668]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Промешан_
По @@SPID, а разве нет?

Мда
Для того, чтобы "продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное"
Если вы никуда ничего не занесете о прогрессе, что как @@SPID или еще что поможет прочитать информацию о прогрессе ?
15 авг 12, 15:43    [13015680]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
_Промешан_
По @@SPID, а разве нет?

Мда
Для того, чтобы "продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное"
Если вы никуда ничего не занесете о прогрессе, что как @@SPID или еще что поможет прочитать информацию о прогрессе ?

Ну так! Что и куда нужно заносить? Всмысле к чему вся эта прелесть про CONTEXT_INFO?
15 авг 12, 19:20    [13017195]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
_Промешан_
Glory
пропущено...

Мда
Для того, чтобы "продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное"
Если вы никуда ничего не занесете о прогрессе, что как @@SPID или еще что поможет прочитать информацию о прогрессе ?

Ну так! Что и куда нужно заносить? Всмысле к чему вся эта прелесть про CONTEXT_INFO?


Поправьте меня, если я не прав.
Вы предлагаете вносить инкремен в CONTEXT_INFO в течении курсора вместо занесения во времянку?
И если все так, второй вопрос - получается в курсоре мне надо будет ставить GO оператор, это значит что каждая итерация будет отдельным пакетом?
15 авг 12, 19:52    [13017270]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
_Промешан_
Поправьте меня, если я не прав.
Вы предлагаете вносить инкремен в CONTEXT_INFO в течении курсора вместо занесения во времянку?
И если все так, второй вопрос - получается в курсоре мне надо будет ставить GO оператор, это значит что каждая итерация будет отдельным пакетом?
Откуда такой вывод? Ну и "GO-оператора" не существует.
15 авг 12, 20:08    [13017324]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
invm
_Промешан_
Поправьте меня, если я не прав.
Вы предлагаете вносить инкремен в CONTEXT_INFO в течении курсора вместо занесения во времянку?
И если все так, второй вопрос - получается в курсоре мне надо будет ставить GO оператор, это значит что каждая итерация будет отдельным пакетом?
Откуда такой вывод? Ну и "GO-оператора" не существует.
даже незнаю чем мне ваш вопрос и комментарий помогает. Наверное ничем.
15 авг 12, 20:38    [13017439]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Эмпирическим путем я открыл, что в цикле
declare @a binary(128)=1
while @a < 100
begin
  set @a = @a + 1
  SET CONTEXT_INFO @a
  waitfor delay '00:00:00.200'
end

который занимает 20 секунд, проверка
select CAST(context_info as int), * from sys.dm_exec_sessions where session_id = 396


Не работает до тех пор, пока батч не завершится.

Скромно повторяю свой вопрос - какой смысл в CONTEXT_INFO применительно к вопросу автора?
15 авг 12, 20:41    [13017444]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
в тему
Guest
Получение прогресса выполнения хранимой процедуры
15 авг 12, 20:58    [13017499]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
_Промешан_
invm
пропущено...
Откуда такой вывод? Ну и "GO-оператора" не существует.
даже незнаю чем мне ваш вопрос и комментарий помогает. Наверное ничем.

_Промешан_
Не работает до тех пор, пока батч не завершится.
Можно точнее сказать - "не работает" - это какой то номер ошибк, или ещё что то?

Совсем непонятно, что у вас не получается, вам уже практически код написали.
_Промешан_
даже незнаю чем мне ваш вопрос и комментарий помогает
Ну, вопросы обычно не помогают, они спрашивают :-)

Комментарий поможет понять, что такое GO, и как странно звучит фраза "получается в курсоре мне надо будет ставить GO оператор"

Это всё равно что сказать "получается в умножении мне надо будет файл поставить".
15 авг 12, 21:46    [13017651]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
alexeyvg
_Промешан_
пропущено...
даже незнаю чем мне ваш вопрос и комментарий помогает. Наверное ничем.

_Промешан_
Не работает до тех пор, пока батч не завершится.
Можно точнее сказать - "не работает" - это какой то номер ошибк, или ещё что то?

"не работает" - это значит что пока выполняется первый запрос (цикл), в другом окне я судорожно нажимаю F5 с введенным запросом (См выше) и "чуда" не случается, то есть CONTEXT_INFO остается прежним значением (то есть до начала цикла).
но когда первый код завершается, тогда да, я вижу изменения - CONTEXT_INFO становится равно 99. До этого, оно равно 0.
16 авг 12, 12:47    [13019780]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
в тему
Получение прогресса выполнения хранимой процедуры


Интересно.
Вот если использовать этот код:
select spid, cast(context_info as varchar) from  master..sysprocesses where spid = NNN

То все работает и обновляется.
А вот этот, что дал Глори в моем топике, не работает
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id =<номер другого коннекта> 

Интересно почему?
16 авг 12, 12:57    [13019869]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_,

может, разрешения на sysprocesses и на DMV разные нужны?
На DMV точно нужен VIEW SERVER STATE.
16 авг 12, 13:23    [13020090]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
_Промешан_,

может, разрешения на sysprocesses и на DMV разные нужны?
На DMV точно нужен VIEW SERVER STATE.

А у вас работает оба кода проверки?


пс: что бы теперь такого написать в курсоре, что бы можно было процесс прервать извне? Теоретически можно было бы проставить CONTEXT_INFO, скажем в -1 и проверять в курсоре/цикле. Но вдруг что еще есть интересное (что бы не затрачивать время на дополнительный селект)?
16 авг 12, 13:59    [13020446]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_
А у вас работает оба кода проверки?

Да, только в первом случае возвращается varchar, во втором - varbinary.
16 авг 12, 14:09    [13020540]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
_Промешан_
А у вас работает оба кода проверки?

Да, только в первом случае возвращается varchar, во втором - varbinary.

Хм... любопытно.
А какое нужно право выдать, что бы у мог dm смотреть во время выполнения процесса, а не по его завершению? Точнее что бы обновлялся контекст?
16 авг 12, 14:11    [13020557]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить