Perguntas sobre o repositório de versões tempdb

9

Hoje encontramos um erro:

Erro: 3967, Gravidade: 17

e pelo que posso dizer, é basicamente 'armazenamento de versão completa'. Isso levantou algumas questões às quais tive problemas em responder, pois na minha loja nunca tivemos esse erro antes:

  • Se houver um tamanho máximo predefinido (com base no tamanho total do tempdb ou não), é dinâmico?

  • Existe uma configuração que a torne dinâmica se não for?

  • Podemos configurar alertas com base nisso? (ou seja, DMVs para rastrear o tamanho etc.)

Travis
fonte

Respostas:

7

Gravidade 17 indica que o SQL Server ficou sem um recurso necessário. Você normalmente vê isso quando um banco de dados fica sem espaço. Nesse caso, parece que o tempdb está sendo usado para linhas de versão de isolamento de captura instantânea confirmadas de leitura para uma consulta que precisava se espalhar para o tempdb.

Isso pode ser bastante comum se o tempdb tiver um tamanho máximo limitado e for tentada uma consulta mal escrita que, por exemplo, execute uma junção cruzada muito grande.

Você pode usar esta consulta para ver o tamanho atual do armazenamento de versão no tempdb:

SELECT *
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE 'Version %';

A Technet tem um artigo interessante sobre o uso do armazenamento de versão em https://technet.microsoft.com/en-us/library/cc966545.aspx#EDAA

Esta página do MSDN menciona o erro 3967:

Quando o tempdb fica sem espaço, o Mecanismo de Banco de Dados força os armazenamentos de versão a encolher. Durante o processo de redução, as transações mais longas que ainda não geraram versões de linha são marcadas como vítimas. Uma mensagem 3967 é gerada no log de erros para cada transação da vítima. Se uma transação estiver marcada como vítima, ela não poderá mais ler as versões de linha no armazenamento de versões. Quando tenta ler versões de linha, a mensagem 3966 é gerada e a transação é revertida. Se o processo de redução for bem-sucedido, o espaço ficará disponível no tempdb.

Nenhuma das páginas que vinculei acima contém aviso explícito sobre o tamanho máximo do armazenamento de versão no tempdb, o que me leva a acreditar que a única limitação é o tamanho máximo configurado do próprio tempdb, menos o espaço usado no tempdb para outros objetos.

Max Vernon
fonte