Diferença entre nível de linha e bloqueio de nível de página e consequências

10

Ao tentar executar meu plano de manutenção, recebo o seguinte erro:

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."

Atualmente, temos o bloqueio no nível da linha ativado neste índice. Posso ativar o bloqueio no nível da página, mas não tenho certeza de quais são as repercussões.

Minha pergunta é: Qual é a diferença entre os dois esquemas de travamento e quais são suas consequências no mundo real (em produção)?

Cavaleiro-Cebola
fonte

Respostas:

14

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.

Mark Storey-Smith
fonte
9

Provavelmente nada. Tenho certeza que a MS sabe melhor do que você ou eu

Trabalhei em sistemas OLTP de alto volume e nunca senti a necessidade de alterar as configurações. Um impasse deve ser tentado novamente, porque acontecerá de qualquer maneira

Citando no blog do SQL Server Storage Engine, "Escalonamento de bloqueio no SQL2005" n que vale a pena ler completamente mesmo assim.

Por padrão, temos os bloqueios ROW e PAGE ativados ... O SQL Server escolhe a granularidade do bloqueio ROW na maioria dos casos, mas pode escolher o bloqueio PAGE, quando apropriado. Portanto, para o caso que você especificou, o bloqueio de linha é provável. Não há como desativar o bloqueio de PAGE no nível do banco de dados ou da instância. Você está encontrando bloqueio devido a bloqueios de PAGE?

Acho que se você forçar apenas os bloqueios de linha, consumirá recursos que poderiam ser usados ​​com mais eficiência em outros lugares. Se sua carga é alta o suficiente para ser importante, por que consumir memória? O artigo do blog entra nesse

Eu suspeito que há alguma superstição por trás disso, assim:

gbn
fonte
+1 mas: os bloqueios nos sistemas OLTP podem ser evitados; meu sistema funciona sem impasse por meses, embora implantemos 2-3 vezes por semana.
AK