Diferencia entre el nivel de fila y el bloqueo y las consecuencias del nivel de página

10

Cuando intento ejecutar mi Plan de mantenimiento, recibo el siguiente error:

La ejecución de la consulta "" falló con el siguiente error: "El índice" "(partición 1) en la tabla" "no se puede reorganizar porque el bloqueo de nivel de página está deshabilitado".

Actualmente tenemos el bloqueo de nivel de fila habilitado en este índice. Puedo habilitar el bloqueo de nivel de página, pero no estoy seguro de cuáles son las repercusiones.

Mi pregunta es: ¿Cuál es la diferencia entre los dos esquemas de bloqueo y cuáles son sus consecuencias en el mundo real (en producción)?

Caballero Cebolla
fuente

Respuestas:

14

La ejecución de la consulta "" falló con el siguiente error: "El índice" "(partición 1) en la tabla" "no se puede reorganizar porque el bloqueo de nivel de página está deshabilitado".

El plan de mantenimiento debe estar intentando ALTERAR ÍNDICE REORGANIZAR, que es una operación en línea. Para eliminar la fragmentación (las páginas no están en orden), las páginas deben estar bloqueadas y movidas, lo que no es posible si se han deshabilitado los bloqueos de página. La única forma de desfragmentar sin bloqueos de página es bloquear toda la partición, lo que no es posible para REORGANIZAR ya que solo está en línea.

¿Cuál es la diferencia entre los dos esquemas de bloqueo y cuáles son sus consecuencias en el mundo real (en producción)?

Debe comprender qué registro y página son para evaluar el impacto de no permitir un tipo de bloqueo en particular. Si no está familiarizado con el almacenamiento interno de SQL Server, comience con Anatomía de un registro y Anatomía de una página . En pocas palabras:

  • filas = registros
  • las filas se almacenan en páginas de 8 kb

Si tuviera que modificar los tipos de bloqueo permitidos:

  • Deshabilitar bloqueos de página = Solo bloqueos de fila y tabla
  • Deshabilitar bloqueos de fila = solo bloqueos de página y tabla
  • Deshabilitar ambos = solo bloqueos de tabla

Hay dos escenarios que conozco en los que puede ser beneficioso no permitir un tipo de bloqueo. No significa que no haya otros, ojalá alguien más intervenga con ejemplos.

Una tabla de búsqueda de acceso frecuente, que cambia con poca frecuencia : al deshabilitar los bloqueos de nivel de página y fila, todos los lectores tomarán un bloqueo de tabla compartido. Esto es más rápido / más barato en lugar de la intención compartida en la tabla, seguida de la intención compartida en una página y finalmente un bloqueo compartido en una fila o filas específicas.

Prevención de un escenario de bloqueo específico : si encuentra bloqueos causados ​​por procesos concurrentes que adquieren bloqueos que están frecuentemente en la misma página, si no se bloquean las filas, se bloquean las páginas. Solo un proceso puede acceder a la página a la vez, el otro debe esperar.

El primer ejemplo es la microoptimización y es poco probable que produzca un beneficio medible en un sistema típico. El segundo resolverá ese escenario de punto muerto en particular, pero puede introducir efectos secundarios inesperados, por ejemplo, matar la concurrencia en una sección diferente del código. Difícil de evaluar el impacto por completo, ¡enfoque con precaución!

El valor predeterminado es que ambos estén habilitados y esto no debe cambiarse sin una buena causa.

Mark Storey-Smith
fuente
9

Probablemente nada. Estoy seguro de que MS sabe mejor que tú o yo

He trabajado en sistemas OLTP de alto volumen y nunca sentí la necesidad de cambiar la configuración. Se debe volver a intentar un punto muerto porque sucederán de todos modos

Citando del blog de SQL Server Storage Engine, "Bloqueo de escala en SQL2005" n que vale la pena leer completamente de todos modos.

De manera predeterminada, tenemos habilitados los bloqueos ROW y PAGE ... SQL Server elige la granularidad de bloqueo ROW para la mayoría de los casos, pero puede elegir el bloqueo PAGE cuando corresponda. Entonces, para el caso que especificó, es probable que se bloquee ROW. No hay forma de desactivar el bloqueo de PÁGINA a nivel de base de datos o instancia. ¿Estás encontrando bloqueos debido a bloqueos de PÁGINA?

Creo que si fuerza los bloqueos de filas solo entonces consumirá recursos que podrían usarse de manera más efectiva en otros lugares. Si su carga es lo suficientemente alta como para que importe, ¿por qué consumir memoria? El artículo del blog entra en esto

Sospecho que hay algo de superstición detrás de esto, así:

gbn
fuente
+1 pero: se pueden evitar puntos muertos en los sistemas OLTP; mi sistema funciona sin bloqueo durante meses, aunque implementamos 2-3 veces por semana.
AK