2012-03-26 13 views
8

Para el rendimiento, ¿qué opción sería mejor para los grandes conjuntos de datos que se van a actualizar?CASO frente a consultas de ACTUALIZACIÓN múltiples para grandes conjuntos de datos - Rendimiento

¿Utiliza una declaración CASE o consultas individuales de actualización?

Ejemplo de caso:

UPDATE tbl_name SET field_name = 
CASE 
    WHEN condition_1 THEN 'Blah' 
    WHEN condition_2 THEN 'Foo' 
    WHEN condition_x THEN 123 
    ELSE 'bar' 
END AS value 

individual Ejemplo de consulta:

UPDATE tbl_name SET field_name = 'Blah' WHERE field_name = condition_1 
UPDATE tbl_name SET field_name = 'Foo' WHERE field_name = condition_2 
UPDATE tbl_name SET field_name = 123 WHERE field_name = condition_x 
UPDATE tbl_name SET field_name = 'bar' WHERE field_name = condition_y 

NOTA: Cerca de 300.000 registros van a ser actualizados y la sentencia CASE tendría unos 10.000 cuando las condiciones. Si utiliza las consultas individuales, también se trata de 10.000,

+2

"Si usa las consultas individuales, también se trata de 10.000" - tal vez una tabla temporal unida sería una mejor idea ... –

+0

+1 Mitch ... no notó el alcance cuando escribí mi respuesta. En principio, 'CASE' será más eficiente, pero tal vez no a esa escala. – JNK

+0

Interesante No había pensado en este enfoque, gracias –

Respuesta

13

La versión CASE.

Esto es porque hay una buena posibilidad de que esté alterando la misma fila más de una vez con las declaraciones individuales. Si la fila 10 tiene ambos condition_1 y condition_y, deberá leerse y modificarse dos veces. Si tiene un índice agrupado, esto significa dos actualizaciones de índice agrupadas además de los demás campos que se modificaron.

Si puede hacerlo como una declaración única, cada fila se leerá solo una vez y se ejecutará mucho más rápido.

Cambié un proceso similar hace aproximadamente un año que usó docenas de UPDATE declaraciones en secuencia para usar un desde UPDATE con y el tiempo de procesamiento se redujo aproximadamente un 80%.

0

Me parece lógico que en la primera opción SQL Server recorra la tabla solo una vez y para cada fila, evaluará la condición.

En la segunda, se tendrá que ir a través de toda la tabla 4 veces

Así, para una mesa con 1000 filas, en la primera opción en el mejor de los casos estamos hablando de 1.000 evaluaciones y peor de los casos, 3000. En el segundo siempre tendremos 4000 evaluaciones

Así que la opción 1 sería la más rápida.

0

Como lo señaló Mitch, intente hacer que una tabla temporal lo llene con todos los datos que necesita, cree una tabla de temperatura diferente para cada columna (campo) que desee cambiar. También debe agregar un índice a la (s) tabla (s) temporal (es) para mejorar el rendimiento.

De esta manera su instrucción de actualización se convierte en (más o menos):

UPDATE tbl_name SET field_name = COALESCE((SELECT value FROM temp_tbl WHERE tbl_name.conditional_field = temp_tbl.condition_value), field_name), 
    field_name2 = COALESCE((SELECT value FROM temp_tbl2 WHERE tbl_name.conditional_field2 = temp_tbl2.condition_value), field_name2) 

y así sucesivamente ..

Esto debería dar un buen rendimiento, mientras que la ampliación de grandes volúmenes de cambios a la vez.

Cuestiones relacionadas