Temos poucas consultas que verificam seu status em uma tabela a cada 5 segundos e atualizam seu status.
Abaixo está a aparência da consulta (todas as colunas da tabela estão na consulta de atualização)
update table1
set
Name='somename'
DetailMessage='Error'
LastUpdate=getdate()
where id=14
Recentemente, esta tabela teve problemas de bloqueio e a consulta de atualização acima é um bloqueador de leads Sp_Blitzindex
.
Abaixo estão alguns passos que eu fiz até agora ..
1. Assegurar que as chaves estrangeiras sejam indexadas (elas também são chave primária)
2. Crie índices para selecionar instruções que podem se beneficiar do novo índice, para que a contenção de bloqueio neste índice seja reduzida
3. Também reduzi o Fillfactor para 10, antes cada página armazenava 93 linhas, agora armazena apenas 7 linhas por página (ainda não consegui me dar uma explicação 100% lógica sobre como essa mudança ajudaria... )
Alguma sugestão adicional.. Avise-me se precisar de mais detalhes
Abaixo está o esquema da tabela (nomes das colunas alterados) e a tabela possui apenas 350 linhas e as consultas atualizam esta tabela na frequência de 20/30 consultas a cada 5 segundos...
create table dbo.table1
(
[ID] [int] NOT NULL,
[Name] [varchar](500) NULL,
[DetailMessage] [nvarchar](max) NOT NULL ,
[LastUpdate] [datetime] NOT NULL
)
PS: Esta é uma consulta de terceiros e não podemos modificar o banco de dados de origem com alterações como alterar o nível de isolamento...
Versão SQL :SQl 2012
Se este aplicativo de terceiros estiver mantendo esses bloqueios de linha por tempo suficiente para causar contenção e
Uma opção seria habilitar o isolamento de instantâneo confirmado de leitura nesse banco de dados:
Isso deve impedir que essas
UPDATE
consultas bloqueiem suas consultas de leitura.Observe que isso afetará os resultados das consultas de leitura, pois eles verão um instantâneo pontual dos dados que estão sendo lidos, em vez de serem bloqueados aguardando a atualização. Também aumentará a carga no tempdb. Para um tratamento detalhado da implementação do RCSI, confira o post de Kendra Little aqui:
Implementando o isolamento de instantâneo ou instantâneo confirmado de leitura no SQL Server: um guia
Já vi isso antes, ou algo muito parecido... só não lembro de todos os detalhes. Acho que a solução foi reconstruir o índice clusterizado ou até mesmo selecionar as linhas em outra tabela, descartar o original, recriar e reinserir as linhas da tabela de cópia.
provavelmente / possivelmente algo a ver com registros de limpeza fantasmas, pois você está atualizando continuamente a tabela, muitos registros serão excluídos logicamente (também conhecidos como fantasmas), então eles serão removidos pela tarefa de limpeza de registros fantasmas (consulte, por exemplo, https://mssqlwiki .com/tag/what-is-ghost-cleanup-task/ ) Suspeito que esta seja a origem do bloqueio.
Seria interessante saber se existem spids de sistema (session_Id < 50) envolvidos na cadeia de bloqueio.