Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Lock Escalation - O que está acontecendo aqui?


"Bloquear escalonamento " é como o SQL lida com o bloqueio para grandes atualizações. Quando o SQL vai alterar muitas linhas, é mais eficiente para o mecanismo de banco de dados receber menos bloqueios maiores (por exemplo, tabela inteira) em vez de bloquear muitas coisas menores (por exemplo, bloqueios de linha) .

Mas isso pode ser problemático quando você tem uma tabela enorme, porque bloquear a tabela inteira pode bloquear outras consultas por um longo tempo. Essa é a desvantagem:muitos bloqueios de granularidade pequena são mais lentos do que menos (ou um) bloqueios de granularidade grossa, e ter várias consultas bloqueando diferentes partes de uma tabela cria a possibilidade de impasse se um processo estiver aguardando outro.

Existe uma opção de nível de tabela, LOCK_ESCALATION , novo no SQL 2008, que permite o controle do escalonamento de bloqueios. O padrão, "TABLE", permite que os bloqueios escalem até o nível da tabela. DISABLE impede o escalonamento de bloqueio para a tabela inteira na maioria dos casos. AUTO permite bloqueios de tabela, exceto se a tabela for particionada, caso em que os bloqueios são feitos apenas no nível da partição. Consulte esta postagem do blog para mais informações.

Suspeito que o IDE adiciona essa configuração ao recriar uma tabela porque TABLE é o padrão no SQL 2008. Observe que LOCK_ESCALATION não é suportado no SQL 2005, portanto, você precisará removê-la se tentar executar o script em um instância de 2005. Além disso, como TABLE é o padrão, você pode remover com segurança essa linha ao executar novamente seu script.

Observe também que, no SQL 2005, antes dessa configuração estar presente, todos os bloqueios podiam ser escalados para o nível de tabela - em outras palavras, "TABLE" era a única configuração no SQL 2005.