Supongamos que mi consulta de actualización se parece a la siguiente:

UPDATE a SET 
    a.colSomething= 1
FROM tableA a WITH (NOLOCK)
INNER JOIN tableB b WITH (NOLOCK) 
        ON a.colA= b.colB
INNER JOIN tableC c WITH (NOLOCK) 
        ON c.colC= a.colA

Vamos a decir lo anterior, se une a la tablab y tableC tarda varios minutos en completarse. En términos de tabla/bloqueo de fila, no toda la tabla quedar bloqueado durante la combinación? O es sql compilador lo suficientemente inteligente como para evitar el bloqueo de toda la tabla?

Y en comparación a la consulta anterior, es menos probabilidades de obtener interbloqueos almacenando el resultado de la une en una tabla temporal en primer lugar antes de la actualización real, como el siguiente?

SELECT a, b, c
INTO    
FROM tableA 
INNER JOIN tableB b WITH (NOLOCK) 
    ON a.colA= b.colB
INNER JOIN tableC c WITH (NOLOCK) 
    ON c.colC= a.colA

UPDATE a SET a.colSomething=1 
FROM tableA a INNER JOIN #tmp t ON a.colA= t.colA

Gracias!

Es mucho más complejo de lo que estás haciendo. Usted muy probablemente tendrá que pasar algún tiempo a la lectura a través de este artículo.
Pero en el nivel superior, creo que debe haber una explicación sobre sql server enfoque de una actualización como esta? He buscado por la web pero no podía encontrar un buen recurso para ello. Pero tu link no proporciona excelentes cubierta en las cerraduras.
No use WITH (NOLOCK) aquí. Usted está pidiendo lecturas, que es el opuesto de la seguros que se está buscando.
Gracias por decírmelo. Acabo de cambiar la redacción un poco a mejor dirección de mi preocupación.

OriginalEl autor c 2 | 2013-07-18

3 Comentarios

  1. 5

    El bloqueo de frente muerto de bloqueo

    Creo que puede ser confuso bloqueo y el bloqueo con INTERBLOQUEOS.

    Sobre cualquier consulta de actualización de SQL server se bloqueará los datos involucrados. Mientras que este bloqueo está activo, otros procesos serán bloqueados ( con retraso ) a partir de la edición de los datos. Si la actualización original tarda mucho tiempo ( desde la perspectiva del usuario’ como un par de segundos), a continuación del extremo delantero sistema puede parecer a ‘colgar’ o, incluso tiempo de espera de los usuarios de extremo delantero del proceso y el informe de un error.

    Esto no es un interbloqueo. Este bloqueo se resuelve por sí mismo, básicamente no destructivamente por retrasar el usuario ligeramente o en algunos casos obligando a front-end a ser inteligentes sobre el tiempo de espera. En el problema es el bloqueo porque de larga ejecución de actualizaciones, se podría arreglar los usuarios tener que volver a presentar por el aumento de la parte delantera de tiempo de espera.

    Un interbloqueo sin embargo no se puede resolver, no importa cuánto aumentar el tiempo de espera. Uno o los procesos que se dará por terminado, con perjuicio ( perdiendo la actualización ).

    Interbloqueos tienen diferentes causas de bloqueo. Interbloqueos son causados generalmente por la incoherencia lógica secuencial en la parte delantera, que los accesos y bloquea los datos de dos tablas en los diferentes órdenes en dos partes diferentes de la parte delantera. Cuando estas dos partes que operan al mismo tiempo en un entorno multiusuario pueden, básicamente, no determinista , producir interbloqueos, y esencialmente sin solución de pérdida de datos ( hasta que la causa de los interbloqueos se ha resuelto ), en oposición al bloqueo de la cual generalmente puede tratarse.

    La gestión de bloqueo

    Le SQL server elegir los bloqueos de fila o toda la tabla de bloqueo?

    Por lo general , depende y puede ser diferente en cada momento. Dependiendo de la cantidad de filas que el optimizador de consultas determina que serán afectados, la cerradura puede ser o fila de la tabla. Si su encima de un cierto umbral, se va a ir de la tabla, porque será más rápido.

    ¿Cómo puedo reducir el bloqueo, mientras que la adhesión a los principios básicos de integridad transaccional?

    De SQL server se va a intentar bloquear las tablas que se están uniendo a debido a que su contenido es material para generar el conjunto de resultados que se actualiza. Usted debe ser capaz de demostrar un plan de ejecución estimado para la actualización, a ver lo que va a ser bloqueado basado en el día de hoy del tamaño de las tablas. Si la predicción de bloqueo de tabla, puede invalidar tal vez con bloqueo de fila sugerencia, pero esto no garantiza la inexistencia de bloqueo. Puede reducir la probabilidad de bloqueo accidental de la posibilidad de que los datos no relacionados en la tabla. Usted esencialmente siempre obtener el bloqueo de los datos directamente de material para la actualización.

    Tenga en cuenta, sin embargo;

    Tener en cuenta también los bloqueos tomados en la tabla combinada será bloqueos Compartidos. Lo que significa que otros procesos pueden leer datos desde las tablas, simplemente no se puede actualizar a ellos, hasta que SU actualización se realiza utilizando como referencia. En contraste, otros procesos activamente bloque simplemente tratando de LEER los datos que usted actualización tiene un bloqueo exclusivo en ( el principal de la tabla que se actualiza ).

    Así, se unió a la mesa todavía se pueden leer. Datos actualizados será bloqueado exclusivamente como un grupo de registros hasta que las actualizaciones se completa o se produce un error y se deshace como un grupo.

    Gracias por la explicación. Sí yo estaba buscando en cómo la anterior actualización de la declaración de causar el bloqueo innecesario…me preguntaba si sql server se utilizan fila de bloqueo o bloqueo de tabla para arriba unirse escenario?
    Todo está en ese artículo, pero en general , depende y puede ser diferente en cada momento. Dependiendo de la cantidad de filas que el optimizador de consultas determina que serán afectados, la cerradura puede ser o fila de la tabla. Si su encima de un cierto umbral, se va a ir de la tabla, porque será más rápido.
    Además, al poner todos los datos en una tabla externa está derrotando el propósito del bloqueo motor. Usted está haciendo su propia concurrencia de decisiones, en un muy ad hoc tipo de camino. Un camino que sin duda es mejor representada por las sugerencias de bloqueo y de los niveles de aislamiento.
    Lo que yo veo. Pero si no tengo la mente sucia lee, entonces es más seguro poner los datos en la tabla externa, así como para evitar el bloqueo de la derecha?
    SQL server se va a intentar bloquear las tablas que se están uniendo a debido a que su contenido es material para generar el conjunto de resultados que se actualiza. Usted debe ser capaz de demostrar un plan de ejecución estimado para la actualización, a ver lo que va a ser bloqueado basado en el día de hoy del tamaño de las tablas. Si la predicción de bloqueo de tabla, puede invalidar tal vez con bloqueo de fila sugerencia, pero esto no garantiza la inexistencia de bloqueo. Puede reducir la probabilidad de bloqueo accidental de la posibilidad de que los datos no relacionados en la tabla. Usted esencialmente siempre obtener el bloqueo de los datos directamente de material para la actualización.

    OriginalEl autor Andyz Smith

  2. 0

    Yo pondría los índices en el extranjero teclas, se puede acelerar la eliminación y actualización de las operaciones, así como aliviar la situación de interbloqueo.

    OriginalEl autor jymbo

  3. 0

    Tuve el mismo problema al intentar actualizar una tabla con 800K registros unido a otro de la tabla con 10 condiciones de combinación. Esta actualización se llevó más de 30 minutos.

    He reducido a 8 segundos mediante la creación de una tabla temporal que contenía SÓLO las filas que necesita ser actualizado. Luego he actualizado el primer lugar de la tabla con los resultados, sólo 20.000 filas real tenía que ser actualizado. El comando seleccionar por defecto no se registran, y creo (pero no estoy seguro), cuando se crea una tabla temporal con un SELECT INTO , también no se registran (alguien por favor confirmar).

    Cuando se emite una actualización en una tabla grande se unió con otro gran mesa, que son el registro de cada campo actualizado para el registro de transacciones, entonces la búsqueda de la siguiente candidato, luego de registrar el cambio de nuevo, y la búsqueda. Si usted puede aceptar una lectura, a continuación, crear una tabla temporal con SÓLO los registros que será actualizada, se reduce drásticamente su tiempo de actualización, y por lo tanto sus posibilidades de un interbloqueo.

    También es importante para eliminar cualquiera de las funciones en la que, como ISNULL o incluso calcular las comparaciones de cadenas. Estos pueden aumentar radicalmente su tiempo de actualización.

    OriginalEl autor Clark Vera

Dejar respuesta

Please enter your comment!
Please enter your name here