2012-08-24 16 views
34

Todo se basa en la suposición de que con (nolock) es totalmente apropiado para la situación. Ya hay muchas preguntas debatiendo si se usa o no con (nolock).con (nolock) o (nolock) - ¿Hay alguna diferencia?

He mirado alrededor y no he sido capaz de encontrar si existe una diferencia real entre el uso de with(nolock):

select customer, zipcode from customers c with(nolock) 

o simplemente (nolock):

select customer, zipcode from customers c (nolock) 

¿Existe un funcional diferencia entre los dos? ¿Estilístico?
¿Es uno más antiguo que el otro y tiene una posibilidad de ser obsoleto?

+1

ver aquí: http://stackoverflow.com/questions/1723910/syntax-for-nolock-in-sql – paul

+2

Son alias. Cuando la sugerencia se especifica con otra opción, la sugerencia debe especificarse con la palabra clave WITH: 'FROM t WITH (TABLOCK, INDEX (myindex))' http://msdn.microsoft.com/en-us/library/ms187373.aspx – edze

+1

El Nolock también se puede llamar como READUNCOMMITTED y solo se aplica en las instrucciones SELECCIONAR. Especifica que no se pueden emitir bloqueos compartidos contra la tabla, lo que impide que otras transacciones modifiquen los datos en la tabla. eche un vistazo a esta publicación http://www.sqlserverlogexplorer.com/difference-between-nolock-and-with-nolock/ –

Respuesta

45

No hay diferencia funcional, pero finalmente la sintaxis sin WITH no funcionará. Esto ha quedado obsoleto:

select customer, zipcode from customers c (nolock) 

Por lo tanto usted debe utilizar este formato:

select customer, zipcode from customers c with (nolock) 

No utilizar la palabra clave WITH de sugerencias de tabla ya no se utiliza por lo menos desde 2008. SQL Server Buscar en el siguiente tema para la frase Specifying table hints without using the WITH keyword.:

http://msdn.microsoft.com/en-us/library/ms143729%28SQL.100%29.aspx

(discusiones acerca de si se debe utilizar nolock en absoluto, por supuesto, están separados. I've blogged about them here.)

+0

Para referencia sobre cuándo usar 'with (nolock)': http://stackoverflow.com/questions/686724/sql-when-should-you-use-with-nolock? rq = 1 – Rob

+1

@Rob quieres decir cuándo * no * usar 'NOLOCK', ¿verdad? :-) –

+0

@ AaronBertrand El enlace de MSDN que ha especificado indica que NOLOCK está en desuso solo para las instrucciones UPDATE y DELETE. No parece estar en desuso para las instrucciones SELECT. – Dono

3

Realmente depende de la versión de SQL Server en la que se encuentre.

Revisando la documentación más reciente para SQL Server 2012 table hints omitiendo WITH es una característica obsoleta. Entonces, aunque from customers c (nolock) probablemente funcione; realmente debería estar usando from customers c WITH (nolock)

Tenga en cuenta que esto es diferente de from customers nolock; donde nolock serviría como el alias de la tabla.

Funcionalmente; ellos parecen ser lo mismo.

2

Intenté esto para un resultado de fila de datos 170000+, sin embargo, no vi ninguna diferencia a través del plan de ejecución de consultas. Ambos funcionan de la misma manera.

+6

Esto debería ser un comentario, no una respuesta. Ya se mencionó dos veces que no hay diferencia funcional ... hace más de un año. – Leigh

+1

Dale un respiro a este tipo ... –

+0

Es bueno saber que has comparado los planes en una mesa que no es pequeña. Para referencia futura, probablemente sea útil saber qué número de versión de SQL Server está utilizando. (+1 de todos modos) –

5

Aunque no encontramos diferencia entre (nolock) y con (nolock) ... con (nolock) no funcionaría en la versión de SQL Server 2000.

Y también me di cuenta de que cuando intenta extraer datos de los servidores vinculados, simplemente '(nolock)' no funcionará, mientras que debería usar 'with (nolock)'.

-- this will not work 
select * from server1.DB1.dbo.table1 (nolock) 

-- this will work 
select * from server1.DB1.dbo.table1 with (nolock) 
+1

Gracias por tomarse el tiempo para publicar. Esto debería ser un comentario a la publicación anterior de Aaron, pero puedo ver que aún no tiene la reputación de publicar comentarios. +1 para ponerte en camino. – Rob

Cuestiones relacionadas