Pregunta

Soy un Informe Desarrollador que quiere hacer mis consultas de la forma más eficiente posible.Yo solía trabajar con un DBA que me dijo - creo que porque yo siempre estaba tratando con informes en un Servidor de Producción - uso de NOLOCK en cada consulta.

Ahora, yo trabajo con un DBA que ha prohibido NOLOCK bajo cualquier circunstancia, incluso cuando un informe de la mina (debido a una falta considerable de los índices en un par de tablas) es detener la replicación y actualizaciones del sistema.En mi opinión, en este caso, un NOLOCK sería una buena cosa.

Dado que la mayoría de mis SQL formación ha llegado a varios Administradores de bases de datos con opiniones muy diferentes, yo quería preguntarle esto a una amplia variedad de Administradores de bases de datos.

¿Fue útil?

Solución

Si su informe de bloques de actualizaciones que el administrador es el correcto:usted no debe usar NOLOCK.El hecho de que no son los conflictos es una clara indicación de que si sería el uso de lecturas te sería incorrecto informes.

En mi opinión, siempre hay alternativas mejores a NOLOCK:

  • Son sus cuadros de producción de sólo lectura, en efecto, y nunca conseguir modificado?Marca la base de datos de sólo lectura!
  • Análisis de tabla causar conflictos de bloqueo?Índice de las tablas de forma adecuada, los beneficios son múltiples.
  • No se puede modificar/no sabe cómo indexar adecuadamente?Uso EL AISLAMIENTO DE INSTANTÁNEA.
  • No se puede cambiar de aplicación para el uso de instantáneas?Encienda lectura instantánea comprometido!
  • Usted ha medido el impacto de las versiones de fila y tener evidencia de que influye en el rendimiento?Usted no puede indexar los datos?y usted está bien con incorrecto informes?A continuación, al menos hazte un favor y uso SET TRANSACTION ISOLATION LEVEL, no una sugerencia de consulta.Será más fácil para posteriormente fijar el nivel de aislamiento en lugar de modificar cada consulta.

Otros consejos

No es siempre malo.

Por supuesto que le permite a la lectura no confirmada valores (que pueden revertirse y, por tanto, lógicamente nunca existió) así como permitir a fenómenos tales como la lectura de los valores varias veces o no en absoluto.

El único de los niveles de aislamiento que garanticen que no encuentro ninguna tales anomalías son serializables/instantánea.En virtud de lectura repetible valores puede ser omitida si una fila se mueve (debido a una actualización de la clave) antes de la exploración llega a esta fila, en virtud de lectura confirmada valores se pueden leer dos veces si una actualización de la clave de causas previamente leer fila para seguir adelante.

Estos problemas son más propensos a surgir bajo nolock sin embargo, debido a que, por defecto, en este nivel de aislamiento será de uso una asignación ordenada de exploración cuando se estima que hay más de 64 páginas para leer.Así como la categoría de los problemas que surgen cuando las filas se mueven entre las páginas debido a la clave de índice actualizaciones de estos asignación ordenada de los escaneos son también vulnerables a problemas con la división de la página (donde las filas se pueden perder si el recién asignado de la página anterior en el archivo que el punto ya escaneadas o leer dos veces si ya escaneada de la página está dividida para una página posterior en el archivo).

Al menos para los simples (una sola tabla) consultas es posible para desalentar el uso de estas exploraciones y obtener una clave ordenó análisis en nolock mediante la adición de un ORDER BY index_key a la consulta, de modo que la Ordered la propiedad de la IndexScan es true.

Pero si su aplicación de informes no necesita absolutamente de cifras exactas y pueden tolerar la mayor probabilidad de tales inconsistencias que podrían ser aceptables.

Pero sin duda que no debe ser sujeción en todas las consultas en la esperanza de que es una magia "turbo" botón.Así como la mayor probabilidad de encontrar resultados anómalos en que el nivel de aislamiento o ningún resultado en absoluto ("no se Pudo continuar la exploración con NOLOCK debido al movimiento de datos de error") incluso hay casos donde el rendimiento con nolock puede ser mucho peor.

¿A tus clientes tolerar resultados inconsistentes en los informes?Si la respuesta es no, usted no debe usar NOLOCK - usted puede obtener malos resultados en la concurrencia.He escrito un par de ejemplos aquí, aquí, y aquí.Estos ejemplos muestran inconsistentes de salida bajo de LECTURA confirmada y LECTURA REPETIBLE, pero usted puede ajustar y obtener resultados equivocados con NOLOCK así.

La mayoría de los informes que crear no se ejecutan en los datos actuales.La mayoría de clientes son de la ejecución de informes son datos de ayer.Sería su respuesta cambio si ese era el caso?

Si ese es el caso, entonces usted tiene uno más opción posible:
En lugar de ejecutar las consultas en la base de datos de producción y cachondeo con cerraduras y NOLOCK, puede ejecutar los informes a partir de una copia de la base de datos de producción.

Usted puede configurarlo para automáticamente se restaura desde una copia de seguridad cada noche.
Al parecer, los informes se ejecutan en los servidores del cliente de los sitios, así que no sé si esto sería una solución viable para usted.
(pero, de nuevo...que debe tener copias de seguridad de todos modos, así que todo lo que necesitas es un poco de espacio en el servidor para restaurar)

Estoy en la casa de desarrollador, así que esto es más fácil para mí porque tengo control total sobre los servidores y bases de datos.

Usted puede hacer esto al menos para los informes que sólo necesita los datos de ayer y mayores.Tal vez algunos informes tendrá que permanecer en la base de datos de producción, pero al menos se mueve una parte de la carga a otra base de datos (o incluso mejor, de otro servidor).

Tengo la misma situación en el trabajo así:
Estamos utilizando una base de datos de producción de la copia como esta para casi todos los informes de cosas, pero hay un par de consultas que requieren datos de hoy.

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