Pregunta

Antecedentes:. Tengo una consulta rendimiento crítico que me gustaría correr y no me importa acerca de las lecturas sucias

Mi pregunta es; Si estoy usando combinaciones, tengo que especificar la sugerencia NOLOCK en esos 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 voy a tener que especificar la pista (NOLOCK) en la unión para asegurar que no estoy cerrando la tabla unida?

¿Fue útil?

Solución

No voy a abordar el argumento READ UNCOMMITTED, simplemente su pregunta original.

Sí, es necesario WITH(NOLOCK) en cada mesa de la unión. No, sus consultas no son los mismos.

Trate de este ejercicio. Comenzar una transacción e insertar una fila en la Tabla 1 y la Tabla 2. No confirmar o deshacer la transacción aún. En este punto su primera consulta devolverá éxito e incluir las filas no comprometidos; su segunda consulta no volverá porque tabla2 no tiene la indirecta WITH(NOLOCK) en él.

Otros consejos

Yo estaba bastante seguro de que es necesario especificar el NOLOCK para cada JOIN en la consulta. Pero mi experiencia se limitaba a SQL Server 2005.

Al levantar la vista de MSDN sólo para confirmar, no pude encontrar nada definido. El siguiente declaraciones sí parece que me haga pensar, que para el año 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 que son accede el plan de consulta , incluyendo tablas y vistas referenciadas en una vista. Además, SQL Server realiza las comprobaciones de consistencia correspondiente cerradura.

[SQL Server 2005]

En SQL Server 2005, todas las sugerencias de bloqueo se propagan a todas las tablas y vistas que se hace referencia en una vista. Además, SQL Server realiza las comprobaciones de consistencia correspondiente cerradura.

Además, el punto a la nota - y esto se aplica a los años 2005 y 2008:

Las sugerencias de tabla se ignoran si la tabla no se accede por el plan de consulta. Esto puede ser causado por el optimizador de la elección de no acceso a la tabla en absoluto, o porque se accede a una vista indizada en su lugar. En el último caso, el acceso a una vista indizada se puede prevenir mediante el uso de la sugerencia de consulta OPTION (EXPAND VIEWS).

Ni. Se establece el nivel de aislamiento en READ UNCOMMITTED que siempre es mejor que dar cerradura individual consejos. O, mejor aún, si se preocupan por los detalles como consistencia , el uso aislamiento de instantánea .

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