sql - uncommitted - Efecto de la sugerencia de NOLOCK en las declaraciones SELECT
t sql select nolock syntax (5)
1) Sí , una selección con NOLOCK
se completará más rápido que una selección normal.
2) Sí , una selección con NOLOCK
permitirá que otras consultas en la tabla efectuada se completen más rápido que una selección normal.
¿Por qué sería esto?
Normalmente, NOLOCK
(dependiendo de su motor de base de datos) me da sus datos, y no me importa en qué estado se encuentre, y no me moleste en mantenerlo inmóvil mientras lo lee. Es todo a la vez más rápido, menos intensivo en recursos y muy muy peligroso.
Se le debe advertir que nunca haga una actualización o que realice ninguna operación crítica del sistema, o cuando se requiera una corrección absoluta utilizando datos que se originaron a partir 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 han eliminado en otras sesiones que aún no se han finalizado. Es posible que estos datos incluyan filas que se hayan actualizado parcialmente. Es posible que estos datos contengan registros que violen las restricciones de clave externa. Es posible que estos datos excluyan las filas que se han agregado a la tabla pero que aún no se han confirmado.
Realmente no tienes manera de saber cuál es el estado de los datos.
Si intenta obtener cosas como un recuento de filas u otros datos de resumen donde se acepta un margen de error, entonces NOLOCK
es una buena forma de aumentar el rendimiento de estas consultas y evitar que tengan un impacto negativo en el rendimiento de la base de datos.
Siempre use la sugerencia NOLOCK
con mucha precaución y trate cualquier dato que regrese sospechosamente.
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:
- la instrucción SELECT actual
- otras transacciones contra la tabla dada
Ejemplo:
Select *
from aTable with (NOLOCK)
Además de lo que se dijo anteriormente, debe tener muy en cuenta que nolock en realidad impone el riesgo de que no obtenga las filas que se han comprometido antes de su selección.
NOLOCK hace que la mayoría de las sentencias SELECT sean más rápidas, debido a la falta de bloqueos compartidos. Además, la falta de emisión de las cerraduras 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 así lo desea. Si planea usar NOLOCK en todas las tablas en una consulta compleja, entonces usar SET TRANSACTION ISOLATION LEVEL 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 consejos sobre la mesa.
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 están compartiendo 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 retrotraen.
Un conjunto de error o resultado 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ás leyendo.
READ COMMITTED agrega un problema adicional donde los datos están corruptos dentro de una sola columna donde varios usuarios cambian la misma celda simultáneamente.
También hay otros efectos secundarios que, en primer lugar, sacrifican el aumento de velocidad que esperabas obtener.
Ahora ya sabes, nunca más lo uses.