rowlock - SQL Server NOLOCK y se une
with index sql server (3)
Antecedentes: tengo una consulta de rendimiento crítico que me gustaría ejecutar y no me importan las lecturas sucias.
Mi pregunta es; Si estoy usando uniones, ¿tengo que especificar la sugerencia de NOLOCK en esas también?
Por ejemplo; es:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID
Equivalente a:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID
¿O tendré que especificar la (NOLOCK)
en la unión para asegurarme de que no estoy bloqueando la tabla unida?
Estaba bastante seguro de que debes especificar el NOLOCK
para cada JOIN
en la consulta. Pero mi experiencia se limitó a SQL Server 2005.
Cuando busqué MSDN solo para confirmar, no pude encontrar nada definitivo. Las declaraciones a continuación parecen hacerme pensar, que para 2008, sus dos declaraciones anteriores son equivalentes, aunque para 2005 no es el caso:
[SQL Server 2008 R2]
Todas las sugerencias de bloqueo se propagan a todas las tablas y vistas a las que accede el plan de consultas , incluidas las tablas y vistas a las que se hace referencia en una vista. Además, SQL Server realiza las comprobaciones de coherencia de bloqueo correspondientes.
[SQL Server 2005]
En SQL Server 2005, todos los consejos de bloqueo se propagan a todas las tablas y vistas a las que se hace referencia en una vista. Además, SQL Server realiza las comprobaciones de coherencia de bloqueo correspondientes.
Además, tenga en cuenta que esto se aplica tanto a 2005 como a 2008:
Las sugerencias de la tabla se ignoran si el plan de consulta no accede a la tabla. Esto puede deberse a que el optimizador elige no acceder a la tabla, o porque se accede a una vista indexada. En este último caso, se puede evitar el acceso a una vista indexada utilizando la sugerencia de consulta
OPTION (EXPAND VIEWS)
.
Ninguno. Establece el nivel de aislamiento como READ UNCOMMITTED
que siempre es mejor que dar pistas de bloqueo individuales. O, mejor aún, si le importan detalles como la consistency , use el aislamiento de instantáneas .
No READ UNCOMMITTED
argumento READ UNCOMMITTED
, solo su pregunta original.
Sí, necesitas WITH(NOLOCK)
en cada mesa de la unión. No, tus consultas no son lo mismo.
Prueba este ejercicio. Comience una transacción e inserte una fila en table1 y table2. No comprometer ni deshacer la transacción todavía. En este punto, su primera consulta será exitosa e incluirá las filas no confirmadas; su segunda consulta no regresará porque table2 no tiene la WITH(NOLOCK)
en ella.