sql >> Base de Datos >  >> RDS >> Sqlserver

Escalamiento de bloqueo - ¿Qué está pasando aquí?

"Escalamiento de bloqueo " es cómo SQL maneja el bloqueo para actualizaciones grandes. Cuando SQL va a cambiar muchas filas, es más eficiente para el motor de la base de datos tomar menos bloqueos más grandes (por ejemplo, toda la tabla) en lugar de bloquear muchas cosas más pequeñas (por ejemplo, bloqueos de fila) .

Pero esto puede ser problemático cuando tiene una tabla enorme, porque bloquear toda la tabla puede bloquear otras consultas durante mucho tiempo. Esa es la contrapartida:muchos bloqueos de pequeña granularidad son más lentos que menos (o uno) bloqueos de granularidad gruesa, y tener múltiples consultas bloqueando diferentes partes de una tabla crea la posibilidad de interbloqueo si un proceso está esperando a otro.

Hay una opción a nivel de tabla, LOCK_ESCALATION , nuevo en SQL 2008, que permite controlar el escalamiento de bloqueos. El valor predeterminado, "TABLA", permite que los bloqueos se escalen hasta el nivel de la tabla. DISABLE evita la escalada de bloqueo a toda la tabla en la mayoría de los casos. AUTO permite bloqueos de tabla excepto si la tabla está dividida, en cuyo caso los bloqueos solo se realizan hasta el nivel de partición. Consulte esta publicación de blog para más información.

Sospecho que el IDE agrega esta configuración al volver a crear una tabla porque TABLE es el valor predeterminado en SQL 2008. Tenga en cuenta que LOCK_ESCALATION no es compatible con SQL 2005, por lo que deberá eliminarlo si intenta ejecutar el script en un instancia de 2005. Además, dado que TABLE es el valor predeterminado, puede eliminar esa línea de manera segura cuando vuelva a ejecutar su secuencia de comandos.

También tenga en cuenta que, en SQL 2005 antes de que esta configuración estuviera presente, todos los bloqueos podían escalar al nivel de la tabla; en otras palabras, "TABLA" era la única configuración en SQL 2005.