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

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

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

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

VIEW SERVER STATE, больше ничего не надо..
Не понял про "во время выполнения", context_info обновляется сразу, не дожидаясь завершения транзакции..
Посредством GRANT ON DM... to USER?


"во время выполнения". Давайте оббратимся к запросу с циклом. Пока идет цикл, я подразумеваю что это процесс "выполнения" запроса. То есть батч выполняется. Скажем 20 секунд.
Так вот за это время, в другом SMSS, селект по dm_exec_sessions дает context_info = 0. А селект по master..sysprocesses показывает реальный прогресс (то есть значение меняется) во время выполнения батча (цикл while .... с waitfor delay, который в последних сообщениях представлен).
16 авг 12, 16:17    [13021645]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
автор
Посредством GRANT ON DM... to USER?

grant view server state to [login_name]
16 авг 12, 16:19    [13021656]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
автор
Посредством GRANT ON DM... to USER?

grant view server state to [login_name]
Попробуем, как права дадут.

А как бы обработать прерывание выполнения? Покрасивше?
16 авг 12, 17:12    [13022118]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
фигня какая-то
Guest
_Промешан_
А какое нужно право выдать, что бы у мог dm смотреть во время выполнения процесса, а не по его завершению? Точнее что бы обновлялся контекст?


если права не отбирают/выдают каждую секунду,
а Вы по завершении цикла видите 99 в dm_exec_sessions из другой сессии,
то права на dm_exec_sessions у Вас и так есть.

зато фигня с необновлением dm_exec_sessions у меня воспроизводится

spid = 63:
declare @a binary(128)=1
while @a < 100
begin
  set @a = @a + 1
  SET CONTEXT_INFO @a
  waitfor delay '00:00:00.200'
end


в соседней сессии:

declare @a int=1
while @a < 500
begin
    set @a = @a + 1
    
	select spid, CAST(context_info as int) 
	from  master..sysprocesses where spid = 63
	
    select CAST(context_info as int)
	from sys.dm_exec_sessions where session_id = 63	
end


в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
16 авг 12, 17:50    [13022375]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
фигня какая-то
_Промешан_
А какое нужно право выдать, что бы у мог dm смотреть во время выполнения процесса, а не по его завершению? Точнее что бы обновлялся контекст?


если права не отбирают/выдают каждую секунду,
а Вы по завершении цикла видите 99 в dm_exec_sessions из другой сессии,
то права на dm_exec_sessions у Вас и так есть.

зато фигня с необновлением dm_exec_sessions у меня воспроизводится

spid = 63:
+
declare @a binary(128)=1
while @a < 100
begin
  set @a = @a + 1
  SET CONTEXT_INFO @a
  waitfor delay '00:00:00.200'
end


в соседней сессии:

+
declare @a int=1
while @a < 500
begin
    set @a = @a + 1
    
	select spid, CAST(context_info as int) 
	from  master..sysprocesses where spid = 63
	
    select CAST(context_info as int)
	from sys.dm_exec_sessions where session_id = 63	
end


в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
Вот и я о том же.
А может Glory это специально, чтобы проверить а есть ли глюки еще у кого-то с этой процедурой? :)

А какие права нужны для master..sysprocesses? щас вот думаю обычные пользователи могут ли пользоваться процедурами, в которых SET CONTEXT_INFO и еще заодно чтение прогресса...

Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?
16 авг 12, 18:47    [13022672]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
qwerty112
Guest
_Промешан_
Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?

так, а вариант с этого поста 13017499 , конкретно, тот пример куда ведёт ссылка (с SQLDMO.SQLServer2 ) - не устраивает ?
"им" сообщения с raiserror - "ловятся" на раз ..
16 авг 12, 18:55    [13022706]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
фигня какая-то
в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
Прикольная оптимизация. Context_Info обновляется для dm_exec_sessions только после взаимодействия с клиентом. Т.е. это работает нормально:
DECLARE @UI UniqueIdentifier = NewID()
SET CONTEXT_INFO @UI
WAITFOR DELAY '00:00:00.200'
GO 100
Мол юзать её как глобальную переменную не кошерно.
16 авг 12, 18:56    [13022714]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
qwerty112
_Промешан_
Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?

так, а вариант с этого поста 13017499 , конкретно, тот пример куда ведёт ссылка (с SQLDMO.SQLServer2 ) - не устраивает ?
"им" сообщения с raiserror - "ловятся" на раз ..
У нас SDAC. А умеет ли так SDAC - я не знаю.
16 авг 12, 20:05    [13022979]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
фигня какая-то
в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
Прикольная оптимизация. Context_Info обновляется для dm_exec_sessions только после взаимодействия с клиентом. Т.е. это работает нормально:
DECLARE @UI UniqueIdentifier = NewID()
SET CONTEXT_INFO @UI
WAITFOR DELAY '00:00:00.200'
GO 100
Мол юзать её как глобальную переменную не кошерно.
Почему?
16 авг 12, 20:06    [13022987]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
edyaN
Member

Откуда:
Сообщений: 185
_Промешан_,
BOL
Предпочтительным способом для получения контекстных данных по текущему сеансу является использование функции CONTEXT_INFO. Контекстные данные по сеансу также хранятся в столбцах context_info следующих системных представлений:

sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses


в sys.dm_exec_requests все обновляется.

SELECT context_info , cast(context_info as int)
FROM sys.dm_exec_requests
WHERE session_id = XXX;
16 авг 12, 20:28    [13023063]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
edyaN
в sys.dm_exec_requests все обновляется
Мужики, но вы то версии скуля выкладывайте.
А то словно "криворукие вы все, не можете нормально банально компильнуть SQL из исходников".
16 авг 12, 21:34    [13023293]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
_Промешан_
Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?
темповая таблица будет блокироваться в транзакции...

Конечно, читать её можно с nolock, но несколько процессов писать туда не смогут.
_Промешан_
"не работает" - это значит что пока выполняется первый запрос (цикл), в другом окне я судорожно нажимаю F5 с введенным запросом (См выше) и "чуда" не случается, то есть CONTEXT_INFO остается прежним значением (то есть до начала цикла).
Да, интересная особенность sys.dm_exec_sessions по сравнению с master..sysprocesses, не знал.

Сам я всегда, много лет, использовал для получения этих данных функцию CONTEXT_INFO()
16 авг 12, 21:59    [13023394]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
Mnior
Мол юзать её как глобальную переменную не кошерно.
Почему?
Ну, "не работает" же.
А вооще вроде как название говорит само за себя.
Вот что пишет BOL.
BOL
Сведения о контексте сеанса могут быть использованы для хранения сведений, специфических для каждого пользователя или текущего состояния приложения.
Т.е. никто на запрещает и для временной задачи можно.
BOL
Новое значение не распространяется на представление sys.dm_exec_sessions до тех пор, пока выполнение пакета, содержащего инструкцию SET CONTEXT_INFO, не будет завершено.
Так что edyaN или лукавит или баг.

И вообще в задачу не вкуриваю, чем не катит?:
RaisError('%d',1,1,@Progress) WITH NoWait;
Ну а прервать наличием некоторой константы в таблице/вьюхе.

Мне кажется ТС просто вломы переписать оную процедуру.
Сегодня ты можешь "выровнять" одну процедуру за семь дней, завтра семь за один день.
16 авг 12, 22:10    [13023459]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
edyaN
Member

Откуда:
Сообщений: 185
Mnior
BOL
Новое значение не распространяется на представление sys.dm_exec_sessions до тех пор, пока выполнение пакета, содержащего инструкцию SET CONTEXT_INFO, не будет завершено.
Так что edyaN или лукавит или баг.


ну вообще-то то, что я написал не противоречит процитированному.
данные в sys.dm_exec_sessions обновляются после завершения пакета, а в sys.dm_exec_requests сразу же. То есть если смотреть в sys.dm_exec_requests, то можно увидеть прогресс выполнения.

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
17 авг 12, 12:25    [13025759]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
edyaN
ну вообще-то то, что я написал не противоречит процитированному.
Ну вообще-то противоречит общему диалогу и смыслу.
Для чего вы вообще написали?: 13023063
Видимо как ответ на это: 13022375
WHILE (и использование в задаче ТС) не подразумевает старт и окончание пакета в цикле. =)

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

Откуда:
Сообщений: 969
alexeyvg

может WITH (READUNCOMMITTED) спасет?
С темповой таблицей потребуется не только обновлять и прочитывать из "долгоиграющего запроса с курсором", но так же из другой сессии прочитывать и обновлять эту темповую таблицу.
Полагаю было бы бессмысленным наличие глобальных темп-таблиц, если бы ими нельзя было бы пользоваться из другого конекта во время транзакции. У глобальных такое же поведение (по идее) как и у обычных таблиц.

Mnior похоже наш Glory в самом начале просто ввел всех в заблуждение и использовать надо вместо dm_exec_sessions - dm_exec_requests.

Ну а прервать наличием некоторой константы в таблице/вьюхе.

Мне кажется ТС просто вломы переписать оную процедуру.
Сегодня ты можешь "выровнять" одну процедуру за семь дней, завтра семь за один день.
Учитывая ту тему, в которой описывается использование райз ерроров - это работает только для SQLDMO. А у соединяюсь четез SDAC. У меня обычный эррор вызовет либо натуральную ошибку и прерывание (в случае от 16 и выше).

Впрочем надо попробовать. Вроде бы перехватчик ошибок в компоненте Connection есть. Только вот мне кажется что ошибку он както по своему выдает.

Но остается вопрос - как передать выполняющейся ХПшке сигнал о прекращении деятельности?
17 авг 12, 17:49    [13028356]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
_Промешан_
Mnior похоже наш Glory в самом начале просто ввел всех в заблуждение и использовать надо вместо dm_exec_sessions - dm_exec_requests.
Можно ещё использовать sysprocessed.

_Промешан_
alexeyvg

может WITH (READUNCOMMITTED) спасет?
С темповой таблицей потребуется не только обновлять и прочитывать из "долгоиграющего запроса с курсором", но так же из другой сессии прочитывать и обновлять эту темповую таблицу.
Полагаю было бы бессмысленным наличие глобальных темп-таблиц, если бы ими нельзя было бы пользоваться из другого конекта во время транзакции. У глобальных такое же поведение (по идее) как и у обычных таблиц.
Читать то их можно, но вот записать не получится.

Теоретически есть блокировка на уровне строк, но там так много ограничений...
17 авг 12, 17:54    [13028389]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
_Промешан_
Но остается вопрос - как передать выполняющейся ХПшке сигнал о прекращении деятельности?
Либо, как писали, использовать таблицу для этих сигналов, либо убить коннект.
17 авг 12, 17:55    [13028400]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
использование райз ерроров - это работает только для SQLDMO. А у соединяюсь четез SDAC.
Обычный PRINT вываливается?
Не верю! ©
17 авг 12, 22:17    [13029319]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
_Промешан_
использование райз ерроров - это работает только для SQLDMO. А у соединяюсь четез SDAC.
Обычный PRINT вываливается?
Не верю! ©
Ну вы читали по ссылке? Там проблема возникает в том, что мессаджи не иммедиэйт, а накапливаются. проверять не стал. Ну и как бы убить коннект в этом случае не получится.

Решил пойти стопами глобальных темп таблиц, т.к. других пока решений не увидел (в том числе что бы остановить можно было процедуру - как можно убить процесс в том же коннекте? )
На входе создается глобальная темп таблица с одним полем и одной записью, которое обновляется в цикле.
Остановка процедуры происходит при удалении этой таблицы. Соответственно действие остановки - дроп таблицы. В цикле на обновление темп-табл стоит трай-кетч и в кетче выходим из процедуры return -1.

Я при проверке на ADO (с SQL Native Client драйвером), в одном коннекте смог запустить асинхронно без возврата результа процедуру (то есть возвращается контроль к интерфейсу) и в этом же коннекте можно проверять и удалять темп-таблицу. Ну как бы работает.

Если есть другие варианты (детально если можно) - велкам.
20 авг 12, 17:42    [13038563]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
Mnior
Обычный PRINT вываливается?
Не верю! ©
Ну вы читали по ссылке? Там проблема возникает в том, что мессаджи не иммедиэйт, а накапливаются. проверять не стал.
Ани просто не имеют его готовить. Это не свойство PRINT это свойство всех сообщений. Но чтобы отсылалось немедленно, поэтому я и написал выше:
Mnior
RaisError('%d',1,1,@Progress) WITH NoWait;
Проглазели?

PS: Для тех кто в танке, PRINT и RaisError(,1,1) - одно и тоже.
20 авг 12, 21:36    [13039612]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Mnior
PS: Для тех кто в танке, PRINT и RaisError(,1,1) - одно и тоже.
Немного уточню:
raiserror('Message', -1, 1);
20 авг 12, 22:09    [13039756]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm
raiserror('Message', -1, 1);
Надо же.
21 авг 12, 14:02    [13043083]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
_Промешан_
пропущено...
Ну вы читали по ссылке? Там проблема возникает в том, что мессаджи не иммедиэйт, а накапливаются. проверять не стал.
Ани просто не имеют его готовить. Это не свойство PRINT это свойство всех сообщений. Но чтобы отсылалось немедленно, поэтому я и написал выше:
Mnior
RaisError('%d',1,1,@Progress) WITH NoWait;
Проглазели?

PS: Для тех кто в танке, PRINT и RaisError(,1,1) - одно и тоже.
В общем тут почитайте 173816 и не проглазейте.

И еще не проглазейте мой вопрос: как остановить выполнение цикла?
21 авг 12, 15:13    [13043773]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить