A execução da consulta "" falhou com o seguinte erro: "O índice" "(partição 1) na tabela" "não pode ser reorganizado porque o bloqueio no nível da página está desativado."
O plano de manutenção deve estar tentando uma ALTER INDEX REORGANIZE, que é uma operação online. Para remover a fragmentação (as páginas não estão em ordem), as páginas devem ser bloqueadas e movidas, o que não é possível se os bloqueios de página estiverem desativados. A única maneira de desfragmentar sem bloqueios de página é bloquear toda a partição, o que não é possível para REORGANIZAR apenas como online.
Qual é a diferença entre os dois esquemas de bloqueio e quais são suas consequências no mundo real (em produção)?
Você precisa entender o que são um registro e uma página para avaliar o impacto da proibição de um tipo de bloqueio específico. Se você não estiver familiarizado com os recursos internos de armazenamento do SQL Server, comece com Anatomia de um registro e Anatomia de uma página . Simplificando:
- linhas = registros
- linhas são armazenadas em páginas de 8kb
Se você alterar os tipos de bloqueio permitidos:
- Desativar bloqueios de página = Somente bloqueios de linha e tabela
- Desativar bloqueios de linha = Somente bloqueios de página e tabela
- Desativar ambos = Somente bloqueios de tabela
Estou ciente de duas situações em que pode ser benéfico proibir um tipo de bloqueio. Não significa que não há outros, espero que outra pessoa intervenha com exemplos.
Uma tabela de pesquisa acessada com frequência, que muda com pouca frequência - Ao desativar os bloqueios no nível da página e da linha, todos os leitores aceitam um bloqueio da tabela compartilhada. Isso é mais rápido / mais barato do que o compartilhamento de intenção comum na tabela, seguido por compartilhamento de intenção em uma página e, finalmente, um bloqueio compartilhado em uma ou mais linhas específicas.
Impedindo um cenário de conflito específico - Se você encontrar conflitos causados por processos simultâneos que adquirem bloqueios frequentemente na mesma página, a proibição de bloqueios de linha resultará em bloqueios de página. Somente um processo pode acessar a página de cada vez, o outro deve esperar.
O primeiro exemplo é a micro-otimização e é improvável que produza benefícios mensuráveis em um sistema típico. O segundo resolverá esse cenário de conflito em particular, mas poderá introduzir efeitos colaterais inesperados, como por exemplo, matar a simultaneidade em uma seção diferente do código. Difícil avaliar o impacto completamente, aproxime-se com cuidado!
O padrão é que ambos sejam ativados e isso não deve ser alterado sem uma boa causa.