Estou tentando solucionar um problema de bloqueio que ocorre por menos de um segundo. O aplicativo OLTP é muito sensível e precisa ter um tempo de resposta inferior a 200ms para algumas transações, conforme o SLA acordado. Tivemos alguns problemas de escalação de bloqueios com o novo lançamento de código que pudemos resolver com a redução do tamanho do lote nas atualizações. Mesmo com o tamanho pequeno do lote, suspeitamos que o novo sp esteja bloqueando as mesmas linhas que as transações OLTP estão atualizando.
Preciso encontrar a sessão que está sendo bloqueada e o recurso está aguardando. De acordo com meu entendimento, "limite do processo bloqueado" pode ser definido por no mínimo 1 segundo e, portanto, isso não capturará o bloqueio.
Estou experimentando os eventos wait_info e wait_completed x.
Existe alguma outra maneira de rastrear isso. obrigado
Respostas:
Como você está especificamente interessado em bloquear, em vez de esperar em geral, o
locks_lock_waits
evento estendido parece mais adequado.Com um filtro ligado
increment >= 200
O item acima reúne as instruções aguardando bloqueios pelo tempo limite, mas não fornece o recurso de bloqueio específico.
Eu nunca usei esse evento e não tenho ideia de quanto sobrecarga essa sessão causaria no seu servidor de produção.
Encontrei este vídeo sobre o assunto. Isso recomenda enfaticamente a filtragem
counter
para reduzir o número de eventos coletados, e eu fiz isso acima.Também menciona um antigo comando não documentado legado
Qual (se o sinalizador de rastreamento 3605 estiver ativado) despeja informações limitadas, como as abaixo, no log de erros do SQL Server.
Eu apenas mencionei isso de passagem, pois os eventos estendidos seriam claramente preferíveis de qualquer maneira, pois estão documentados e muito mais poderosos.
fonte
dbcc lock(StallReportThreshold, 200)
primeiro e ele gera as informações quando o limite é excedido, desde que o sinalizador de rastreamento 3605 esteja ativado. O SQL Server não coleta essas informações para o caso de você poder executá-las posteriormente.Se você estiver interessado em bloquear, há vários eventos estendidos disponíveis:
Os dois primeiros eventos têm uma
duration
coluna (microssegundos) na qual você pode filtrar seus limites. Eles também têm umaresource_description
ação que fornecerá alguns detalhes sobre os recursos envolvidos.O
lock_escalation
evento também possui umastatement
ação que você pode adicionar para coletar a instrução T-SQL que acionou a escalação do bloqueio. Também temescalation_cause
. Aqui está uma sessão de amostra:Eu suspeito que provavelmente haja um motivo para você não definir o limite do relatório de processo bloqueado para menos de um segundo: o bloqueio é perfeitamente normal em um RDBMS - o mecanismo de banco de dados precisa bloquear recursos para protegê-los. Embora não exista uma definição oficial de quando o bloqueio se torna bloqueado, o bloqueio do tique por mais de um segundo parece normal para mim.
fonte