Pregunta

Creo que la verdadera pregunta es:

Si no me importan las lecturas sucias, agregar la sugerencia con (NOLOCK) a una instrucción SELECT afectará el rendimiento de:

  1. la declaración SELECT actual
  2. otras transacciones contra la tabla dada

Ejemplo:

Select * 
from aTable with (NOLOCK)
¿Fue útil?

Solución

1) , una selección con NOLOCK se completará más rápido que una selección normal.

2) , una selección con NOLOCK permitirá que otras consultas sobre la tabla afectada se completen más rápido que una selección normal.

¿Por qué sería esto?

NOLOCK típicamente (dependiendo de su motor de base de datos) significa darme sus datos, y no me importa en qué estado se encuentre, y no me moleste en mantenerlos quietos mientras lee. . Es todo más rápido, menos intensivo en recursos y muy muy peligroso.

Se le debe advertir que nunca realice una actualización o realice algo crítico para el sistema, o donde se requiera una corrección absoluta utilizando datos que se originaron de una lectura NOLOCK . Es absolutamente posible que estos datos contengan filas que se eliminaron durante la ejecución de la consulta o que se hayan eliminado en otras sesiones que aún no se han finalizado. Es posible que estos datos incluyan filas que se han actualizado parcialmente. Es posible que estos datos contengan registros que violen las restricciones de clave externa. Es posible que estos datos excluyan filas que se han agregado a la tabla pero que aún no se han confirmado.

Realmente no tiene forma de saber cuál es el estado de los datos.

Si está tratando de obtener cosas como un Recuento de filas u otros datos de resumen en los que es aceptable algún margen de error, entonces NOLOCK es una buena manera de aumentar el rendimiento de estas consultas y evitar tenerlas impactar negativamente en el rendimiento de la base de datos.

Utilice siempre la sugerencia NOLOCK con gran precaución y trate los datos que devuelva sospechosamente.

Otros consejos

NOLOCK hace que la mayoría de las instrucciones SELECT sean más rápidas, debido a la falta de bloqueos compartidos. Además, la falta de emisión de los bloqueos significa que los escritores no se verán obstaculizados por su SELECT.

NOLOCK es funcionalmente equivalente a un nivel de aislamiento de READ UNCOMMITTED. La principal diferencia es que puede usar NOLOCK en algunas tablas pero no en otras, si lo desea. Si planea usar NOLOCK en todas las tablas en una consulta compleja, entonces usar SET TRANSACTION ISOLATION LEAD READ UNCOMMITTED es más fácil, porque no tiene que aplicar la sugerencia a cada tabla.

Aquí hay información sobre todos los niveles de aislamiento a su disposición, así como sugerencias de tabla.

ESTABLECER NIVEL DE AISLAMIENTO DE LA TRANSACCIÓN

Sugerencia de tabla (Transact-SQL)

Además de lo que se dijo anteriormente, debe ser muy consciente de que nolock realmente impone el riesgo de que usted no obtenga filas que se han confirmado antes de su selección.

Ver http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

Será más rápido porque no tiene que esperar bloqueos

  • El SELECT actual comenzará antes, porque no tiene que esperar.

  • Las otras transacciones se ralentizarán ya que ahora comparten su tiempo de procesamiento con una nueva transacción.

No lo uses.

NOLOCK a menudo se explota como una forma mágica de acelerar las lecturas de la base de datos, pero trato de evitar usarlo siempre que sea posible.

El conjunto de resultados puede contener filas que aún no se han confirmado, que a menudo se deshacen más tarde.

Un error o conjunto de resultados puede estar vacío, faltar filas o mostrar la misma fila varias veces.

Esto se debe a que otras transacciones están moviendo datos al mismo tiempo que lo está leyendo.

READ COMMITTED agrega un problema adicional en el que los datos se corrompen dentro de una sola columna donde varios usuarios cambian la misma celda simultáneamente.

También hay otros efectos secundarios, que resultan en sacrificar el aumento de velocidad que esperabas obtener en primer lugar.

Ahora ya sabes, nunca lo vuelvas a usar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top