Pregunta

Estoy en el negocio de crear sitios web y aplicaciones que sean no misión crítica -> por ej.software bancario, vuelos espaciales, aplicación de seguimiento de cuidados intensivos, etc.Entiendes la idea.

Entonces, con ese enorme descargo de responsabilidad, ¿es malo usar la sugerencia NOLOCK en alguna declaración Sql?Hace varios años, un compañero administrador de SQL me sugirió que debería usar NOLOCK si estoy satisfecho con una "lectura sucia" que me dará un poco más de rendimiento de mi sistema porque cada lectura no bloquea el tabla/fila/lo que sea.

También me dijeron que es una gran solución si tengo puntos muertos.Entonces, comencé a seguir ese pensamiento durante algunos años hasta que un gurú de SQL me ayudó con un código aleatorio y notó todos los NOLOCKS en mi código SQL.Me regañó cortésmente y él trató de explicármelo (por qué no es algo bueno) y me perdí.Sentí que la esencia de su explicación era "es una solución curita para un problema más grave...especialmente si estás experimentando un punto muerto.Como tal, solucione la raíz del problema”.

Recientemente busqué en Google sobre esto y encontré esta publicación.

Entonces, ¿puede algún sensei gurú de sql db iluminarme?

¿Fue útil?

Solución

Con la sugerencia NOLOCK, el nivel de aislamiento de la declaración SELECT es READ UNCOMMITTED. Esto significa que la consulta puede ver los datos sucios e inconsistentes.

Esto no es una buena idea aplicar como regla. Incluso si este comportamiento lectura sucia está bien para su aplicación basada en web de misión crítica, una exploración NOLOCK puede causar el error 601 que terminará la consulta debido al movimiento de datos como resultado de la falta de protección de bloqueo.

Cuando aislamiento de instantánea Ayuda y cuando duele - MSDN recomienda el uso LEA INSTANTÁNEA COMPROMETIDOS INSTANTÁNEA en lugar de bajo la mayoría de circunstancias.

Otros consejos

Antes de trabajar en el desbordamiento de pila, yo estaba en contra NOLOCK en el principio de que usted podría realizar una SELECT con NOLOCK y volver resultados con los datos que pueden estar fuera de fecha o inconsistente. Un factor a considerar es el número de registros puede ser insertada / actualizada al mismo tiempo otro proceso puede seleccionar datos de la misma tabla. Si esto sucede mucho entonces hay una alta probabilidad de puntos muertos a menos que utilice un modo de base de datos como READ COMMITED SNAPSHOT .

He cambiado desde mi perspectiva sobre el uso de NOLOCK después de presenciar cómo se puede mejorar el rendimiento SELECT, así como eliminar los puntos muertos en un servidor SQL Server de forma masiva cargado. Hay veces que es posible que no se preocupan de que sus datos no es exactamente comprometido al 100% y que necesitan resultados de vuelta rápida a pesar de que pueden estar fuera de fecha.

Hágase una pregunta al pensar en el uso de NOLOCK:

  

¿Mi consulta incluye una tabla que tiene un alto número de comandos INSERT / UPDATE y qué me importa si los datos devueltos por una consulta puede faltar estos cambios en un momento dado?

Si la respuesta es no, entonces utilizar NOLOCK para mejorar el rendimiento.


Me acaba de realizar una búsqueda rápida de la palabra clave NOLOCK dentro de la base de código de desbordamiento de pila y encontró 138 casos, por lo que lo uso en muy pocos lugares.

Si no se preocupan por sucio lee (es decir, en una situación predominantemente LEA), entonces NOLOCK está muy bien.

y , tenga en cuenta que la mayoría de los problemas de bloqueo se debe a que no tiene los índices 'correctas' para su carga de trabajo de consulta (siempre que el hardware está a la altura).

Y la explicación del gurú era correcta. Por lo general, es una solución curita a un problema más serio.

Editar : Definitivamente no estoy sugiriendo que NOLOCK se debe utilizar. Creo que debería haber hecho que, evidentemente clara. (Yo sólo he usarlo, en circunstancias extremas donde había analizados que estaba bien). A modo de ejemplo, hace un tiempo que trabajé en algunos TSQL que había sido rociado con NOLOCK para tratar de aliviar los problemas de bloqueo. Yo los quité, implementado los índices correctos, y todos los puntos muertos fue.

duda de que era un "gurú" que había tenido ninguna experiencia en el alto tráfico ...

Los sitios web son por lo general "sucio" en el momento en que la persona está viendo la página completamente cargado. Considere una forma que se carga desde la base de datos y guarda los datos que se editan ?? Es estúpida la forma en que la gente va de aproximadamente lecturas sucias siendo tal un no, no.

Dicho esto, si usted tiene un número de capas sobre la base de sus selecciona, usted podría ser la construcción de una redundancia peligroso. Si estás tratando de dinero o de estado de escenarios, entonces necesita no sólo datos transaccionales leído / escribe, sino una solución adecuada concurrencia (algo más "gurús" no se moleste con).

Por otro lado, si usted tiene una búsqueda avanzada de productos para un sitio web (es decir, algo que probablemente no se almacenan en caché y ser un poco intensivo) y alguna vez se ha construido un sitio con más de unos pocos usuarios concurrentes ( phenominal la cantidad de "expertos" no tienen), es ridículo para embotellar el cuello todos los demás procesos detrás de él.

Saber lo que significa y usarlo cuando sea apropiado. Su base de datos casi siempre será su principal cuello de botella en estos días y ser inteligentes acerca del uso de NOLOCK le puede ahorrar miles de dólares en infraestructura.

EDIT:. No se trata sólo interbloqueos que ayuda con la, también es la cantidad que se va a hacer todos los demás esperar hasta que haya terminado, o viceversa

Usando sugerencia NOLOCK en EF4?

Ninguna de las respuestas es incorrecta, aunque quizás un poco confusa.

  • Al consultar valores/filas individuales es siempre Es una mala práctica utilizar NOLOCK: probablemente nunca desee mostrar información incorrecta o tal vez incluso tomar alguna medida sobre datos incorrectos.
  • Al mostrar información estadística aproximada, NOLOCK puede resultar muy útil.Tome SO como ejemplo:Sería una tontería llevar candados para leer el exacto número de vistas de una pregunta, o el número exacto de preguntas para una etiqueta.A nadie le importa si usted formula incorrectamente 3360 preguntas etiquetadas con "sql-server" ahora y, debido a una reversión de transacción, 3359 preguntas un segundo después.

Como un desarrollador profesional diría que depende. Pero sin duda sigo AGCS y los potros OMG consejo. Sabe lo que está haciendo, saber cuando ayuda y cuando duela y

leer consejos y otras ideas pobres

lo que podría hacer que usted entiende el servidor SQL más profundo. en general, sigo la regla de que SQL sugerencias son malos, pero desafortunadamente ellos cada uso ahora y luego, cuando me harto de forzar el servidor SQL hacer cosas ... Pero estos son casos raros.

Luke

Cuando aplicación de soporte quiso responder a las consultas ad-corvejón de la producción-servidor utilizando SSMS (que no fueron atendidos a través de la presentación de informes) solicité que utilizan nolock. De esa manera el negocio 'principal' no se ve afectada.

Estoy de acuerdo con algunos comentarios acerca de sugerencia NOLOCK y especialmente con aquellos que dicen "usarlo cuando sea apropiado". Si la solicitud por escrito mal y está utilizando concurrencia inapropiada manera - que pueden causar la extensión de bloqueo. Altamente tabla transaccional también están consiguiendo bloqueado todo el tiempo debido a su naturaleza. Tener una buena cobertura del índice no ayudará a la recuperación de los datos, pero el establecimiento de nivel de aislamiento en la lectura no confirmada hace. También creo que el uso de sugerencia NOLOCK es seguro en muchos casos cuando la naturaleza de los cambios es predecible. Por ejemplo - en la fabricación cuando los trabajos con los viajeros van a través de diferentes procesos con una gran cantidad de plantillas de mediciones, se puede ejecutar de forma segura consulta contra el trabajo terminado con sugerencia NOLOCK y de esta manera evitar la colisión con otras sesiones que dieron al promovidos o bloqueos exclusivos sobre la mesa /página. Los datos de acceso en este caso es estática, pero puede residir en una mesa muy transaccional con cientos de millones de registros y actualizaciones miles / inserciones por minuto. Saludos

Creo que es casi nunca correcta de utilizar nolock.

Si está leyendo una sola fila, entonces el índice correcto significa que usted no tendrá que NOLOCK como acciones individuales fila se completan rápidamente.

Si está leyendo muchas filas para que no sea nada visualización temporal, y se preocupan por ser capaz de repetir el resultado, o defender por el número producido, entonces NOLOCK no es apropiado.

NOLOCK es una etiqueta de sustituto de "no me importa si esta respuesta contiene filas duplicadas, las filas que se eliminan, o filas que nunca se insertan en primer lugar debido a la reducción"

Los errores posibles con arreglo NOLOCK:

  • Las filas, que coincidan con lo que no se devuelve nada.
  • se devuelven filas individuales múltiples veces (incluyendo múltiples instancias de la misma clave primaria)
  • se devuelven las filas que no coinciden.

Cualquier acción que puede causar una división de página mientras que el nolock seleccione está en marcha puede causar estas cosas ocurran. Casi cualquier acción (incluso una eliminación) puede causar una división de página.

Por lo tanto:. Si "sabe" que la fila no se puede cambiar mientras se está ejecutando, no utilice nolock, como un índice permitirá la recuperación eficiente

Si sospecha que la fila puede cambiar mientras se ejecuta la consulta, y se preocupa por la precisión, no utilice nolock.

Si usted está considerando NOLOCK debido a callejones sin salida, examinar la estructura del plan de consulta para los recorridos de tablas inesperados, trazar los puntos muertos y ver por qué se producen. NOLOCK alrededor escribe puede significar que ciertos problemas que previamente un punto muerto serán potencialmente tanto escribir la respuesta equivocada.

Las mejores soluciones, cuando sea posible son:

  • Replicar los datos (utilizando log-replicación) a una base de datos de informes.
  • Utilice instantáneas SAN y montar una versión coherente de la base de datos
  • Utiliza una base de datos que tiene un nivel de aislamiento mejor fundamental

El nivel de aislamiento de transacción de instantánea se creó porque MS estaba perdiendo ventas a Oracle. Oracle utiliza deshacer / rehacer registros para evitar este problema. Postgres utiliza MVCC. En el futuro Heckaton de MS usará MVCC, pero eso es años lejos de ser listos para la producción.

NOLOCK es utilizada en muchas ocasiones como una forma mágica para acelerar la base de datos lee, pero trato de evitar su uso whever posible.

El conjunto de resultados puede contener filas que aún no se han confirmado, que son a menudo más adelante deshace.

Un error o conjunto de resultados puede estar vacío, sean filas desaparecidos o mostrar la misma fila varias veces.

Esto se debe a otras transacciones se están moviendo datos al mismo tiempo lo estás leyendo.

LEER COMPROMETIDOS añade un problema adicional en que los datos está dañado dentro de una sola columna en la que varios usuarios cambian la misma célula simultáneamente.

En la vida real, donde se encuentra con sistemas ya escrito y agregar índices a las tablas a continuación drásticamente ralentiza la carga de datos de una tabla de datos 14gig, que se ven obligados en algún momento a utilizar con NOLOCK en sus informes y al final del mes proessing modo que la suma los funtions (suma, conteo, etc.) no hacen fila, página, bloqueo de tablas y deteriate el rendimiento general. Fácil de decir en un nuevo sistema nunca uso con NOLOCK y uso de índices - pero añadiendo índices rebajas severly la carga de datos, y cuando estoy a continuación, dije, bueno, alterar la base de código para eliminar los índices, a continuación, carga a granel a continuación, volver a crear los índices - el cual es todo muy bien, si está desarrollando un nuevo sistema. Pero no cuando se tiene un sistema ya existente.

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