Supongo que la verdadera pregunta es:
Si no me interesan las lecturas sucias, agregar la sugerencia with (NOLOCK) a una instrucción SELECT afectará el rendimiento de:
- la declaración SELECT actual
- otras transacciones contra la tabla dada
Ejemplo:
Select *
from aTable with (NOLOCK)
sql
sql-server
locking
Bob Probst
fuente
fuente
Respuestas:
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 contra la tabla afectada se completen más rápido que una selección normal.¿Por qué sería esto?
NOLOCK
generalmente (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 haga una actualización o realice algo crítico para el sistema, o donde se requiera una corrección absoluta utilizando datos que se originaron en una
NOLOCK
lectura. 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 hayan 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 donde un margen de error es aceptable, entonces
NOLOCK
es una buena manera de aumentar el rendimiento de estas consultas y evitar que afecten negativamente el rendimiento de la base de datos.Siempre use la
NOLOCK
sugerencia con gran precaución y trate los datos que devuelva de forma sospechosa.fuente
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 TRANSACCIÓN
Sugerencia de tabla (Transact-SQL)
fuente
Además de lo que se dijo anteriormente, debe ser muy consciente de que nolock realmente impone el riesgo de que no obtenga filas que se hayan 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
fuente
Será más rápido porque no tiene que esperar las cerraduras
fuente
La respuesta es Sí si la consulta se ejecuta varias veces a la vez, porque cada transacción no tendrá que esperar a que se completen las demás. Sin embargo, si la consulta se ejecuta una sola vez, la respuesta es No.
Sí . Hay una probabilidad significativa de que el uso cuidadoso de WITH (NOLOCK) acelere su base de datos en general. Significa que otras transacciones no tendrán que esperar a que termine esta declaración SELECT, pero por otro lado, otras transacciones se ralentizarán ya que ahora comparten su tiempo de procesamiento con una nueva transacción.
Tenga cuidado de usar solo
WITH (NOLOCK)
en sentencias SELECT en tablas que tengan un índice agrupado.WITH (NOLOCK) a menudo se explota como una forma mágica de acelerar las transacciones de lectura de la base de datos.
El conjunto de resultados puede contener filas que aún no se han confirmado, que a menudo se deshacen más tarde.
Si WITH (NOLOCK) se aplica a una tabla que tiene un índice no agrupado, otras transacciones pueden cambiar los índices de fila a medida que los datos de la fila se transmiten a la tabla de resultados. Esto significa que al conjunto de resultados pueden faltar filas o mostrar la misma fila varias veces.
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.
fuente