Nossa aplicação utiliza bloqueios de aplicação do SQL Server e temos casos em que precisamos ver se existe ou não um determinado bloqueio. Para fazer isso, recuperamos e filtramos informações de sys.dm_tran_locks
.
Isso funciona, mas mesmo a consulta mais simples ( SELECT * FROM sys.dm_tran_locks
) contra esse DMV em nosso sistema leva mais de 100 ms (CPU e duração de ambos) e, às vezes, pode variar acima de 500 ms. Isso ocorre ao executar como usuário superadmin ou não, do SSMS ou não.
Há aproximadamente 10.000 linhas retornadas no máximo de um full SELECT
, e estamos executando em uma VM com bastante CPU e RAM e um subsistema de disco rápido. Não parece que essa consulta deva demorar tanto.
Alguém já viu isso antes ou sabe o que pode estar acontecendo aqui? Fico feliz em fornecer mais informações se isso for útil.
Você deve usar
APPLOCK_MODE
eAPPLOCK_TEST
em vez de escanear as fechaduras DMV.Fundo
O
sys.dm_tran_locks
próprio DMV emprega a interface de função com valor de tabela (sTVF) amplamente usada, exposta via T-SQL usando aOPENROWSET(TABLE ...
sintaxe somente interna. A interface contém os métodos usuaisOpen
,GetRow
eClose
usados para todos os iteradores do mecanismo de execução.O padrão sTVF é usado por muitas funções e exibições do sistema. A forma como cada um inicializa e fornece acesso linha por vez aos dados subjacentes varia de acordo com a fonte de dados.
Alguns exemplos de pilhas de chamadas para este DMV específico abaixo:
abrir
obter linha
descreva o dono do cadeado
trava de estabilidade lógica
recurso de bloqueio
ID do objeto associado
tipo de dados da coluna de saída
Também há variações em torno das quais (se houver) os parâmetros fornecidos ao sTVF podem ser inseridos no acesso aos dados internos. Onde há suporte para pushdown, as linhas são filtradas antes de serem apresentadas ao processador de consulta.
A maioria dos sTVFs suporta a passagem de parâmetros como referências externas (por exemplo, valores de coluna fornecidos por um
APPLY
), mas não todos. O suporte para esse aspecto melhorou gradualmente em várias versões principais do produto.A documentação resume muito bem: