none
solo reporte RRS feed

  • Pregunta

  • Quiero hacer un procedimiento  de solo reportes y/o consultas

    Y me aconsejan que a todas las tablas que utilice en las consultas les ponga la palabra (nolock).

    Si es un procedimiento de solo consulta; hay  forma de hacer que todo el procedimiento  lo interplete  como tal (solo lectura) para que no afecte a las demas operaciones que realice el servidor (transaccional). y no utilizar (nolock).

    ventajas...y desventajas?, utilizo sql server 2012 estandar.

    gracias por sus sugerencias


    • Editado Hacerdan lunes, 15 de abril de 2019 13:44 complentar
    lunes, 15 de abril de 2019 13:43

Respuestas

  • Si es un procedimiento de solo consulta; hay  forma de hacer que todo el procedimiento  lo interplete  como tal (solo lectura) para que no afecte a las demas operaciones que realice el servidor (transaccional). y no utilizar (nolock).

    Ojo, el (nolock) no tiene nada que ver con el hecho de que sea de solo-lectura. Lo que hace es no poner bloqueos, y por lo tanto no queda parado por otros bloqueos existentes (ya que la parada se produce al intentar poner un bloqueo que coincide con otra cosa ya bloquada).

    Hay una forma de aplicarlo a todas las sentencias que es ejecutar una sentencia como esta al principio del procedimiento:

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    Eso hace que se prescinda de los bloqueos igual que si a cada sentencia le hubieras puesto el (nolock).

    Ojo, aunque ya te lo han mencionado en otra respuesta, ten presente que esto podria dar lugar a que emitas informes con datos falsos. No solo afecta a transacciones de las que se haga un rollback (y habrias leido los datos intermedios antes del rolback), sino tambien a lecturas repetibles (por ejemplo, en una contabilidad podrias leer el cargo de una cuenta antes de que se haga el correspondiente abono en otra y te saldria un balance descuadrado en el informe a pesar de que la contabilidad estuviese perfectamente cuadrada).

    En resumidas cuentas, omitir los bloqueos es bueno para la velocidad pero es malo para la exactitud de los informes. Si ambas cosas son criticas, tendrias que pensar en aplicar otra tecnica, como por ejemplo emitir los informes desde una instantanea de base de datos o usar uno de los modos transaccionales que usan instantaneas.

    • Marcado como respuesta Hacerdan martes, 16 de abril de 2019 15:27
    martes, 16 de abril de 2019 10:55

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar a los siguientes enlaces en inglés pero donde creo puedes encontrar una posible solución para tu problema.

    https://stackoverflow.com/questions/686724/what-is-with-nolock-in-sql-server

    http://sqlserverplanet.com/tsql/using-with-nolock

    https://www.sqlshack.com/understanding-the-impact-of-nolock-and-with-nolock-table-hints-in-sql-server/

    https://www.brentozar.com/archive/2018/10/using-nolock-heres-how-youll-get-the-wrong-query-results/

    https://www.brentozar.com/archive/2016/12/nolock-ever-right-choice/

    https://hackernoon.com/how-using-nolock-can-block-your-queries-adc8611105ff

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    lunes, 15 de abril de 2019 14:35
  • segun lo que entendi...mientras NOLOCK no bloquea los datos de nivel de fila, eliminará un bloqueo de estabilidad de esquema.

    me puedes explicar, por favor

    lunes, 15 de abril de 2019 21:23
  • El comportamiento por defecto en SQL Server es que cada consulta adquiera su propio bloqueo previo a leer datos desde una tabla dada. Este comportamiento asegura que tú sólo estás leyendo datos consolidados. De todos modos, la sugerencia NOLOCK te permite instruir al optimizador de consultas para leer una tabla dada sin obtener un bloqueo exclusivo o compartido. Los beneficios de consultar datos usando la sugerencia NOLOCK es que requiere menos memoria y previene que ocurran bloqueos con otras consultas que puedan estar leyendo datos similares. La única desventaja es que usar la sugerencia NOLOCK puede accidentalmente resultar en la lectura de datos no consolidados “sucios”.

    En otras palabras la sugerencia de tabla NOLOCK (o su equivalente READUNCOMMITTED) te permite realizar lecturas de datos aunque éstos estén bloqueados por instrucciones de actualización de datos.

    Cuando se realiza una instrucción de actualización de datos (INSERT, DELETE, UPDATE) estos datos son bloqueados por SQL Server hasta que finaliza la instrucción de actualización (o la transacción si la instrucción se encuentra dentro de una). Si intentas ejecutar una instrucción de lectura ésta esperará hasta que los datos se desbloqueen y entonces realizará la lectura y devolverá los datos.

    Al utilizar NOLOCK la lectura no espera a que los datos se desbloqueen, realiza la lectura de los datos tal cual están y los devuelve. Esto aumenta la velocidad de respuesta de las consultas pero también disminuye la fiabilidad de los datos.

    La consulta podría devolver un dato actualizado por un cambio que luego se echa para atrás por una instrucción de ROLLBACK.

    Por lo tanto puedes utilizar NOLOCK cuando quieras acelerar consultas en las que no sea crítica la fiabilidad de los datos devueltos.

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.


    lunes, 15 de abril de 2019 22:59
  • Creo que basta que hagas una vista, me parece que cubre lo que pides.
    lunes, 15 de abril de 2019 23:23
  • Si es un procedimiento de solo consulta; hay  forma de hacer que todo el procedimiento  lo interplete  como tal (solo lectura) para que no afecte a las demas operaciones que realice el servidor (transaccional). y no utilizar (nolock).

    Ojo, el (nolock) no tiene nada que ver con el hecho de que sea de solo-lectura. Lo que hace es no poner bloqueos, y por lo tanto no queda parado por otros bloqueos existentes (ya que la parada se produce al intentar poner un bloqueo que coincide con otra cosa ya bloquada).

    Hay una forma de aplicarlo a todas las sentencias que es ejecutar una sentencia como esta al principio del procedimiento:

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    Eso hace que se prescinda de los bloqueos igual que si a cada sentencia le hubieras puesto el (nolock).

    Ojo, aunque ya te lo han mencionado en otra respuesta, ten presente que esto podria dar lugar a que emitas informes con datos falsos. No solo afecta a transacciones de las que se haga un rollback (y habrias leido los datos intermedios antes del rolback), sino tambien a lecturas repetibles (por ejemplo, en una contabilidad podrias leer el cargo de una cuenta antes de que se haga el correspondiente abono en otra y te saldria un balance descuadrado en el informe a pesar de que la contabilidad estuviese perfectamente cuadrada).

    En resumidas cuentas, omitir los bloqueos es bueno para la velocidad pero es malo para la exactitud de los informes. Si ambas cosas son criticas, tendrias que pensar en aplicar otra tecnica, como por ejemplo emitir los informes desde una instantanea de base de datos o usar uno de los modos transaccionales que usan instantaneas.

    • Marcado como respuesta Hacerdan martes, 16 de abril de 2019 15:27
    martes, 16 de abril de 2019 10:55