2009-11-12 27 views
17

he visto sentencias SQL utilizando nolock y con (nolock) por ejemplo -sintaxis para nolock en SQL

select * from table1 nolock where column1 > 10 

Y

select * from table1 with(nolock) where column1 > 10 

¿Cuál de las afirmaciones anteriores es correcta y por qué?

Respuesta

6

Ambos son técnicamente correctos, sin embargo not using the WITH keyword has been deprecated a partir de SQL 2005, así que acostúmbrese a utilizar la palabra clave WITH - respuesta corta, use la palabra clave WITH.

+0

ok así que con (nolock) se ha convertido prácticamente en la nueva sintaxis a partir de sql 2005, aunque nolock en sí mismo todavía funciona. ¿es asi? – seenasan

+0

sí, todavía funciona sin el "con", pero ha quedado obsoleto, lo que significa que no funcionará de esa manera muy probablemente en un lanzamiento en algún momento en el futuro (podría ser el próximo lanzamiento, podría ser el siguiente, podría ser 10 a partir de ahora) ... – chadhoc

+0

también sobre inserción, actualización debe con (nolock) ser utilizado allí también como una norma de programación? – seenasan

5

Utilice "CON (NOLOCK)".

27

La primera declaración no bloquea nada, mientras que la segunda lo hace. Cuando probé esto apenas ahora en SQL Server 2005, en

select * from table1 nolock where column1 > 10 --INCORRECT 

"nolock" se convirtió en el alias, dentro de esa consulta, de tabla1.

select * from table1 with(nolock) where column1 > 10 

realiza la funcionalidad nolock deseada. ¿Escéptico? En una ventana separada, ejecute

BEGIN TRANSACTION 
UPDATE tabl1 
set SomeColumn = 'x' + SomeColumn 

para bloquear la tabla, y luego pruebe cada instrucción de bloqueo en su propia ventana. El primero se bloqueará, esperando que se suelte el bloqueo, y el segundo se ejecutará inmediatamente (y mostrará los "datos sucios"). No olvide emitir

ROLLBACK 

cuando haya terminado.

+0

+1 Para captar la distinción de (nolock) frente a nolock - spot on en lo que respecta a las cosas de alias. La distinción debería ser el uso de "(nolock) vs. con (nolock)" en lugar de "nolock vs. con (nolock)" como se muestra en la pregunta - buena captura – chadhoc

18

La lista de características en desuso es en Deprecated Database Engine Features in SQL Server 2008:

  • Especificación NOLOCK o READUNCOMMITTED en la cláusula FROM de un UPDATE o instrucción DELETE.
  • Especificando la tabla sugerencias sin utilizar la palabra clave WITH.
  • sugerencia de tabla HOLDLOCK sin paréntesis
  • Uso de un espacio como separador entre los consejos de la tabla.
  • La aplicación indirecta de los consejos de tabla a una invocación de una función de valores de tabla multi-declaración (TVF) a través de una vista.

todos ellos están en la lista de características que se eliminarán a veces después de la próxima versión de SQL, lo que significa que probablemente va a ser compatible con el release enxt sólo bajo un nivel de compatibilidad de base de datos más baja.

Dicho mi 2c en el tema como tal son:

  • Tanto from table nolock y from table with(nolock) están equivocados. Si necesita lecturas sucias, debe usar los niveles apropiados transaction isolation: set transaction isolation level read uncommitted.De esta forma, el nivel de islación utilizado se establece explícitamente y se controla desde una "perilla", en oposición a extenderse a través de la fuente y sujeto a todas las peculiaridades de los consejos de tabla (aplicación indirecta a través de vistas y TVF, etc.).
  • Las lecturas sucias son una generación. Lo que se necesita, en el 99.99% de los casos, es la reducción de la contención, no los datos no leídos. La contención se reduce escribiendo las consultas adecuadas en un esquema bien diseñado y, si es necesario, implementando el aislamiento de instantáneas. La mejor solución, que resuelve las obras casi siempre ahorrar algunos casos extremos, es enable read commited snapshot en la base de datos y dejar que el motor de su magia:

    ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

después extraer todas las pistas de la selecciona

+1

+1 para un par de cosas, la primera vez que noté la desaprobación de nolock en el FROM para actualizar/eliminar - muy agradable. Aunque no estoy totalmente de acuerdo en que las lecturas sucias sean una abominación (hay algunos escenarios en los que puede tener sentido usarlos, incluso sobre un enfoque optimista de lectura comprometida), sí estoy de acuerdo en que se usa en exceso, se malinterpreta, y hay muchos , muy pocos escenarios donde tiene sentido y aún menos donde el uso se entiende realmente. – chadhoc

+0

Estoy de acuerdo en que las lecturas sucias tienen su uso, pero digamos que me gusta usar un efecto dramático para enfatizar el mensaje. –

+0

NOLOCK se ha incluido en la lista como "Características no admitidas en la versión siguiente de SQL Server" para varias versiones de SQL Server. 2008, 2014 y 2016. –

0

Ambos son sintácticamente correctos.

NOLOCK se convertirá en el alias de table1.

CON (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 posteriormente.

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á leyendo.

READ COMMITTED agrega un problema adicional donde los datos se corrompen en 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 esperaba obtener.

Ahora ya lo sabes, nunca más lo vuelvas a usar.

Cuestiones relacionadas