2012-02-03 20 views
6

En el trabajo, hemos estado pirateando un procedimiento almacenado y notamos algo.¿Es SQL Server lo suficientemente inteligente como para NO ACTUALIZAR si los valores son los mismos?

Para una de nuestras declaraciones de actualización, notamos que si los valores son los mismos que los valores anteriores, tuvimos una ganancia en el rendimiento.

No decíamos

UPDATE t1 SET A=5 

donde la columna ya estaba era igual a 5. Estábamos haciendo algo como esto:

UPDATE t1 SET A = Qty*4.3 

De todos modos, es SQL Server lo suficientemente inteligente como para no hacer lo operación si los valores se evalúan de la misma manera en una operación de ACTUALIZACIÓN o solo estoy siendo engañado por algún otro fenómeno?

Respuesta

2

A juzgar por la salida de TSQL, considera que la ACTUALIZACIÓN se ejecutó incluso si tiene el mismo valor.

CREATE TABLE test (id INT, val int); 
GO 

INSERT INTO test VALUES(1, 1); 
GO 
(1 row(s) affected) 

UPDATE test SET val=1 WHERE id=1; 
GO 
(1 row(s) affected) 

Cuando se trata de la escritura real en el disco, ciertamente espero que no sea necesario.

Editar: Vea la respuesta de @AbeMiessler para un análisis más en profundidad de cómo funciona la escritura en el registro/parte del disco.

+0

La ausencia de una escritura en disco-a-es, seguramente, una ganancia de rendimiento. – simon

+0

Gran análisis del problema, por cierto – simon

+0

No creo que la escritura en el disco ocurra inmediatamente. Creo que la pregunta es "¿la página se marca como sucia" –

0

SQL tendrá que calcular realmente el resultado numérico antes de que haga algo más, tiene que hacer esto para que sepa con qué valor tiene que "hacer algo". Incluso entonces necesitaría leer el valor de la tabla para hacer una comparación.

Lo que estoy tratando de decir es que si este fuera el caso, en realidad sería menos eficiente leer el valor, compararlo con el que está tratando de actualizar y luego tomar una decisión como a si debe comprometerse con la operación de actualización. En su caso tiene que leer Qty antes de que pueda resolver lo que necesita poner en el campo A, pero aún así, cuando se comparan los valores, también podría haber completado la actualización y continuar con el resto de sus ocupados día :)

+2

No estoy de acuerdo.Para una actualización, debe realizar una lectura, para confirmar que, de hecho, hay una fila para actualizar y para colocar un bloqueo en la (s) fila (s), y posiblemente también en los índices, antes de poder emitir la actualización. Por lo tanto, si la lectura se realiza de todos modos, y determina que no se están cambiando realmente los datos, puede omitir la fase de escritura real. –

1

Es posible que vea algunas mejoras en el rendimiento en función del estado específico de los índices de la tabla.

Si la tabla está indexada y la actualización no requiere que se muevan datos (en clúster) o que no se modifiquen los índices (sin agrupar), es posible que vea una ganancia.

Si le dices a SQL que actualice, se va a actualizar. Entonces, miraría hacia el lado del hardware (por ejemplo, indización).

Cuestiones relacionadas