Eu sei que há muitos bloqueios no meu banco de dados e tentei o meu melhor para classificar isso por fornecedor, pois esse aplicativo é suportado por eles e ainda não produziu nenhum resultado bem-sucedido. De vez em quando, temos problemas de bloqueio e esse bloqueio fica tão grave e seu design é tão ruim que todo o portal cai, a menos e até que eu mate alguns SPIDs que estão mantendo bloqueio exclusivo (principalmente).
Estou usando sp_blitzindex há quase um ano e sou um grande fã do Kit de Primeiros Socorros fornecido pelo Sr. Brent Ozar e equipe. Quando executo sp_blitzindex neste banco de dados onde o bloqueio ocorre, ele diz - " Aggressive Under-Indexing: Total lock wait time > 5 minutes (row + page) with long average waits " com a prioridade de 10. Verifiquei a coluna URL e também verifiquei outras páginas relacionadas, mas não consegui muita ajuda.
Eu sei que as tabelas listadas aqui estão indexadas e mais alguns índices precisam ser criados, no entanto, quando executo o mesmo procedimento, ou seja, sp_blitzindex para esses objetos individualmente no nível da tabela usando o comando abaixo:
EXEC dbo.sp_BlitzIndex @DatabaseName='db1', @SchemaName='sch', @TableName='tab1';
Não recebo nenhum detalhe de índice ausente. Todos os índices existentes são utilizados e a contagem de leitura é menor que a contagem de gravação, apenas o problema destacado aqui está na coluna "Aguardas de bloqueio" para a chave primária.
Não tenho ideia de qual índice de coluna precisa ser criado. Eu também verifiquei sp_blitzlock para ver se eu poderia reunir mais informações que ajudariam, no entanto, tudo o que vejo há muitos impasses e os mesmos objetos são listados, o que é figurado na subindexação agressiva.
Também verifiquei a saída de sp_blitzcache passando a ordem de classificação como "leituras" e "duração" neste banco de dados específico, mas nenhuma solicitação de índice ausente. Existem avisos dizendo "Consulta Não Parametrizada" e "Consulta Não Parametrizada, não SARGables" e esses planos envolvem diferentes conjuntos de tabelas.
Qualquer ajuda é muito apreciada.
Version: Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) Sep 7 2018 01:37:51 Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
Unidade Gratuita
Como você está usando o First Responder Kit , continuarei usando-o em meus exemplos para ensiná-lo a diagnosticar isso melhor.
Nenhum índice ausente?
Por que o SQL Server não tem nenhuma solicitação de índice ausente nos DMVs ou nos planos de consulta?
Primeiro, espere
Use
sp_BlitzFirst @SinceStartup = 1;
e confira suas estatísticas de espera.Se
LCK_
as esperas não estiverem perto do topo da sua lista (10 primeiros ou mais) e se aAvg ms Per Wait
coluna não estiver mostrando valores acima de 1-2 segundos para asLCK_
esperas, a situação pode não ser tão terrível. Eu provavelmente mudaria meu foco para outro lugar.Modificadores
Em vez de usar
sp_BlitzCache
para ver Reads ou Duration, use-o para ver estes:Você pode encontrar consultas que modificam muitos dados de uma só vez. Se você fizer isso, alterá-los para modificações em lote pode reduzir a sobrecarga de bloqueio.
O problema com essa abordagem é que ela depende de planos de execução estarem no cache quando você estiver procurando por eles. Eles podem não ser, por vários motivos .
Como você está executando
sp_BlitzCache
, preste atenção na linha no rollup Warnings (segunda saída);Problemas comuns
Bloqueios longos podem vir de lugares que os usuários finais podem não perceber, como manutenção de índice.
Se esta for a fonte, você pode considerar reduzir o nível de fragmentação em que você realiza a manutenção (50-80%), a frequência da manutenção (semanal ou mensal) ou simplesmente não fazer isso e atualizar apenas as estatísticas ( muito menos invasivo e menos propenso a bloqueio).
Procure por padrões de código que usem
BEGIN TRAN
, e trabalhe muito antes de confirmar. Isso requer que você faça uma revisão de código. Não há atalho aqui, e normalmente é o tipo de coisa que você deseja que uma ferramenta de monitoramento faça.Procure
sp_BlitzIndex
por chaves estrangeiras com ações em cascata . Estes podem causar uma quantidade dramática de bloqueio.Espero que isto ajude!