PREGUNTAS Y RESPUESTAS-NOLOCK

PREGUNTA: Tengo un select con varios join el cual me devuelve mas de 24 mil registros pero es lento y bloquea muchas veces, estuve leyendo en la web sobre NOLOCK que es una solución, pero tambien no es recomendable su uso. También leí sobre READUNCOMMITED, que me recomiendas para acelerar y evitar bloqueos en mis consultas y procedimientos.

RESPUESTA:
Son muchas las razones por la cual un query puede estar lento. En mi experiencia, el diseño de la BD y el diseño de indices son las principales razones. Recomiendo analizar los planes de ejecución para entender mejor que es lo que está haciendo tu query. Allí también obtienes recomendaciones de us uso de índices.

Aquí encuentras mayor informacion sobre planes de ejecución: http://msdn.microsoft.com/es-es/library/ms178071(v=sql.105).aspx

Sobre el uso de NOLOCK y READUNCOMMITED, pienso que es lo mismo. NOLOCK es un Query Hint que se usa como parte del query. READUNCOMMITED es un nivel de aislamiento que se define a nivel de transacción o conexión. Yo  recomiendo usar NOLOCK, por que es más simple de implementar.

Lo importante es entender que en ambos casos se le está diciendo a SQL Server que lea datos que aun no han sido comprometidos, es decir, que están siendo modificados (INSERT, UPDATE o DELETE) y que la transacción aun no ha hecho COMMIT, por lo que los querys pueden mostrar datos que están en pleno proceso de cambio y que después se pueden ser descartados (ROLLBACK). A esto se le llama Lecturas Sucias (Dirty Read). En este caso, si se repite el query el resultado puede variar, llevando a cometer errores en base a información que aun no está confirmada en el sistema.

Aquí encontrarán más información:
http://msdn.microsoft.com/es-es/library/ms173763(v=sql.105).aspx
http://msdn.microsoft.com/es-es/library/ms187373(v=sql.105).aspx

2 comentarios en “PREGUNTAS Y RESPUESTAS-NOLOCK

  • Consulta :uso de Indices

    Hola Alberto.

    se puede establecer con seguridad que al hacer esta consulta:

    SELECT OBJECT_NAME(ius.object_id) AS TableName,
    idx.name AS IndexName, ius.*
    FROM SYS.DM_DB_INDEX_USAGE_STATS AS ius
    INNER JOIN SYS.INDEXES AS idx
    ON (idx.object_id = ius.object_id AND idx.index_id = ius.index_id)
    WHERE OBJECTPROPERTY(ius.object_id,’IsUserTable’) = 1
    and (user_scans +user_seeks +user_lookups )=0

    a todos esos indices, se les podría eliminar o habría que tener alguna otra consideración?.

    Gracias

     

Deja un comentario

Tu dirección de correo electrónico no será publicada.