sql server 2008 - sirven - Bloqueo de escalada: ¿qué está pasando aquí?
ver historial de bloqueos en sql server (2)
" Bloquear escalamiento " es cómo SQL maneja el bloqueo para grandes actualizaciones. Cuando SQL va a cambiar muchas filas, es más eficiente para el motor de 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 filas).
Pero esto puede ser problemático cuando tienes una tabla enorme, porque bloquear una tabla completa puede bloquear otras consultas durante mucho tiempo. Ese es el equilibrio: muchos bloqueos de granularidad pequeña son más lentos que menos (o uno) bloqueos de grano grueso, y tener múltiples consultas bloqueando diferentes partes de una tabla crea la posibilidad de un punto muerto si un proceso está esperando otro.
Hay una opción de nivel de tabla, LOCK_ESCALATION
, nueva en SQL 2008, que permite controlar la escalada de bloqueo. El valor predeterminado, "TABLE" permite que los bloqueos escalen hasta el nivel de la tabla. DISABLE previene escalada de bloqueo a toda la tabla en la mayoría de los casos. AUTO permite bloqueos de tabla, excepto si la tabla está particionada, en cuyo caso los bloqueos solo se realizan hasta el nivel de partición. Mira esta publicación en el 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 tendrá que quitarlo si intenta ejecutar el script en una Instancia de 2005 Además, dado que TABLE es el valor predeterminado, puede eliminar esa línea de forma 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, "TABLE" era la única configuración en SQL 2005.
Al modificar una tabla (quitar una columna) en SQL Server 2008, hice clic en el botón Generar script de cambio y noté que la secuencia de comandos de cambio que se genera deja la columna, dice "ir" y luego ejecuta una instrucción ALTER TABLE adicional que parece establecer la escalada de bloqueo para la tabla a "TABLE". Ejemplo:
ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE)
También debo señalar que esto es lo último que está haciendo el script de cambio. ¿Qué está haciendo aquí y por qué establece LOCK_ESCALATION en TABLE?
Puede verificar si necesita incluir la declaración LOCK_ESCALATION en su script al comparar este valor antes y después de ejecutar la parte principal de su script:
SELECT lock_escalation_desc FROM sys.tables WHERE name=''yourtablename''
En mi caso, alterar la tabla para descartar o agregar una restricción no parece modificar este valor.