Suponha que eu tenha ativado o RCSI e meu servidor esteja funcionando bem; Não houve picos no uso de recursos e o aumento da carga no tempdb foi mínimo. Tudo isso é bom, mas como posso saber se a mudança causou problemas aos meus usuários? Por exemplo, com a finalidade de encontrar problemas causados pelo RSCI que o Read Committed não teria causado, existe algum:
- Mensagens de erro que posso rastrear?
- Scripts de diagnóstico que posso executar?
- Métricas a serem observadas?
- Registrando os desenvolvedores de aplicativos podem colocar seu próprio código?
- Reclamações específicas de usuários para as quais devo estar alerta?
Estou muito feliz em usar o RCSI, mas o objetivo desta pergunta é encontrar maneiras práticas de rastrear o impacto de ativá-lo após o fato.
escopo
Esta é uma pergunta difícil de responder e de considerar todos os problemas possíveis, porque quase todas as cargas de trabalho possuem características únicas que requerem atenção especial. Alguns podem funcionar perfeitamente usando níveis de isolamento otimistas, e outros requerem intervenção em determinadas áreas.
Na maioria dos casos, um único nível de isolamento não é 100% adequado para qualquer carga de trabalho, mas o descuido do desenvolvedor, a ingenuidade etc. podem resultar no uso de níveis de isolamento incorretos. Se isso causa algum problema ou não, geralmente é uma questão de sorte ou falta de simultaneidade.
Para RCSI, os únicos erros que encontrei foram relacionados ao preenchimento/falta de espaço do armazenamento de versão. Você pode ter uma ideia do que procurar pesquisando nas mensagens de erro disponíveis:
Se você estivesse falando sobre Snapshot Isolation, sua maior preocupação seriam os conflitos de atualização:
Mas esse é um cenário totalmente diferente.
Isso depende do que você está tentando diagnosticar. Mais comumente, seria "o que está usando o armazenamento de versão e quanto ele está usando?"
Aqui está um fragmento de código de sp_PressureDetector , ligeiramente reformatado para respeitar o comprimento da resposta:
Se você estiver no SQL Server 2017 ou superior, poderá verificar usando algo assim:
Observe que eles monitoram apenas o tamanho do armazenamento de versão em tempdb . Se você estiver no SQL Server 2019+ e usando a Recuperação Acelerada de Banco de Dados, você desejará monitorar o Armazenamento de Versão Persistente.
Além do tamanho do armazenamento de versões, você também pode querer observar transações de longa duração usando o Armazenamento de versões. Algo assim pode fornecer detalhes suficientes:
Em geral, você gostaria de procurar transações de longa duração que possam estar impedindo a limpeza do armazenamento de versões.
Não consigo pensar em nada que possa ser útil.
Você gostaria de ficar de olho nas reclamações dos usuários sobre resultados incorretos ou entradas duplicadas.
Tentando ser conciso aqui, pode haver áreas do aplicativo que são sensíveis à simultaneidade, onde o bloqueio é necessário para a correção dos resultados que o bloqueio de leitura confirmada fornece.
Eu sugiro ver exemplos nestas postagens de Paul White:
Em particular, os detalhes de quais garantias de consistência você está obtendo atualmente com o bloqueio de leitura confirmada como o nível de isolamento e como as modificações de dados podem obter resultados estranhos no isolamento de instantâneo confirmado de leitura. Consultas sensíveis a leituras obsoletas podem ter uma dica READCOMMITTEDLOCK aplicada, conforme mostrado no artigo da tabela de sequência.