Usuário com melhor resposta
Monitorar Bloqueios

Pergunta
-
Respostas
-
Olá LPJ,
Você pode utilizar tanto o Acquired quanto o Released afinal em tese todo lock adquirido deverá ser liberado. A IDE realmente pesa mais. Existem formas de gerar o Trace sem utilizar a interface gráfica e a redução da carga pode chegar a 70%. O problema é que gerar o trace apenas via SP é um pouco chato e demanda conhecer vários códigos de eventos.
Como a idéia é monitorar bloqueios, acredito que o Blocker Script seja mais efetivo. O profiler só seria mais interessante para esse tipo de situação se você fosse correlacioná-lo com o Performance Monitor. Assim você poderia ver como o servidor se comporta no momento de um bloqueio e (ou) liberação específica, mas ainda assim acho que o Blocker Script é mais negócio.
[ ]s,
Gustavo
Todas as Respostas
-
Cara,
Eu uso essa consultinha direto e me auxilia direto:
declare @comando varchar(700)--BLOQUEADOS
set @comando = 'select ' + '''' + 'bloqueado' + '''' + ' processo, spid, banco = left(db_name(dbid), 20), blocked, equipamento = left(hostname, 20), '
set @comando = @comando + 'programa = left(program_name, 20), tempo_de_espera = convert(int, waittime/1000), '
set @comando = @comando + 'open_tran, status from master.dbo.sysprocesses '
set @comando = @comando + 'where blocked > 0 union '
--BLOQUEADORES
set @comando = @comando + 'select ' + '''' + 'bloqueante' + '''' + ' processo, spid, banco = left(db_name(dbid),20) , blocked, equipamento = left(hostname, 20), '
set @comando = @comando + 'programa = left(program_name, 20), tempo_de_espera = convert(int, waittime/1000), '
set @comando = @comando + 'open_tran, status from master.dbo.sysprocesses '
set @comando = @comando + 'where blocked = 0 and spid in (select blocked from master.dbo.sysprocesses where blocked > 0) '
set @comando = @comando + ' order by spid'exec(@comando)
Cria um job talvez...que salve em uma tabela. Mas atende para o custo dessa sua automação (disco...).
-
POde crer, eu tb tenho uma consultinha parecida com essa. O que eu não queria esra justamente isso. Num ambiente "busy", colocar esse cara pra rodar num job a cada n segundos o I/O com certeza vai me atrapalhar. Eu tinha olhado o evento lock no profiler, mas não achei uma coluna como avg wait time/sec. O que me interessa são os blocks com um waittime acima de n segundos. Pelo perfom e ate pelo alerta do sql server eu consigo esse carinha, mas primeiro não sei se seria o contador/alerta certo e segundo não consigo logar isso para verificar depois. Mas valeu véio
-
Boa Tarde,
A idéia do comando é interessante, mas já existe uma solução similar no site da Microsoft.
How to monitor blocking in SQL Server 2005 and in SQL Server 2000
http://support.microsoft.com/kb/271509/en-us
Support WebCast: Microsoft SQL Server: Rapid Blocker Script Analysis
http://support.microsoft.com/kb/324885/en-us
Se existe a preocupação com o ambiente "Busy" adianto que o Profiler onera mais que uma consulta na sysprocesses (principalmente se o trace for rodado localmente). Você pode utilizar a coluna Duration como parâmetro para duração de um lock.
Se a idéia é obter informações em um nível mais macro tente utilizar o System Monitor. Se você realmente deseja investigar consultas que provoquem locks só temos o Profiler e os Blocker Scripts.
Vale a pena lembrar que locks são normais e fazem parte das rotinas normais do banco de dados. Tome cuidado para aplicar os filtros devidos e não monitorar bloqueios desnecessários.
[ ]s,
Gustavo
-
Eu estava justamente dando uma olhadinha no Blocker script da MS..bem interessante.
Quanto ao Profiler Gustavo, na verdade eu iria gerar traces server side.Realmente ele pode me onerar bastante se eu for pela IDE. cara.mas qual dos locks eu pego ?..o Acquired ?..É justamente isso que eu não sei, se o trace vai me dar a informação correta que eu estou querendo, na verdade eu não quero locks demorados..eu posso ter um shared lock demorado e este provavelmente não irá escalonar e eu posso ter essa informação erronea (posso estar verifcando isso depois), mas eu queria os processos bloqueados acima de n segundos e o bloqueador destes.
Acho que o blocker script vai me ajudar mais...
Valeu cara
Brigadão -
Olá LPJ,
Você pode utilizar tanto o Acquired quanto o Released afinal em tese todo lock adquirido deverá ser liberado. A IDE realmente pesa mais. Existem formas de gerar o Trace sem utilizar a interface gráfica e a redução da carga pode chegar a 70%. O problema é que gerar o trace apenas via SP é um pouco chato e demanda conhecer vários códigos de eventos.
Como a idéia é monitorar bloqueios, acredito que o Blocker Script seja mais efetivo. O profiler só seria mais interessante para esse tipo de situação se você fosse correlacioná-lo com o Performance Monitor. Assim você poderia ver como o servidor se comporta no momento de um bloqueio e (ou) liberação específica, mas ainda assim acho que o Blocker Script é mais negócio.
[ ]s,
Gustavo