2012-03-26 14 views
8

Per le prestazioni quale opzione sarebbe meglio per i set di dati di grandi dimensioni che devono essere aggiornati?CASE vs più query UPDATE per set di dati di grandi dimensioni - Prestazioni

Utilizzo di un'istruzione CASE o di singole query di aggiornamento?

CASO Esempio:

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 

individuale Query Esempio:

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: Circa 300.000 record stanno per essere aggiornato e l'istruzione CASE avrebbe circa 10.000 quando le condizioni. Se si utilizzano le singole query, è pari a circa 10.000

+2

"Se si utilizzano le singole query sono circa 10.000" - forse un tavolo temporaneo unito sarebbe un'idea migliore .... –

+0

+1 Mitch ... non ha notato lo scope quando ho scritto la mia risposta. In linea di principio, "CASE" sarà più efficiente ma forse non in quella scala. – JNK

+0

Interessante Non avevo pensato a questo approccio, grazie –

risposta

13

La versione CASE.

Questo perché ci sono buone possibilità di modificare la stessa riga più di una volta con le singole istruzioni. Se la riga 10 ha sia condition_1 e condition_y, sarà necessario leggerlo e modificarlo due volte. Se si dispone di un indice cluster, ciò significa due aggiornamenti dell'indice cluster in cima a qualsiasi altro campo modificato.

Se è possibile farlo come singola istruzione, ogni riga verrà letta una sola volta e dovrebbe essere eseguita molto più rapidamente.

Ho modificato un processo simile circa un anno fa che utilizzava dozzine di istruzioni UPDATE in sequenza per utilizzare un dal UPDATE con CASE e il tempo di elaborazione è sceso di circa l'80%.

0

Mi sembra logico che sulla prima opzione SQL Server passerà attraverso la tabella solo una volta e per ogni riga, valuterà la condizione.

Al secondo, dovrà passare attraverso tutto tabella 4 volte

Così, per una tabella con 1000 righe, sulla prima opzione migliore dei casi stiamo parlando di 1.000 valutazioni e peggiore dei casi, 3000. Sul secondo avremo sempre 4000 valutazioni

Quindi l'opzione 1 sarebbe la più veloce.

0

Come indicato da Mitch, provare a creare una tabella temporanea che riempi tutti i dati necessari, creare una tabella temporanea diversa per ogni colonna (campo) che si desidera modificare. È inoltre necessario aggiungere un indice alle tabelle temporanee per migliorare le prestazioni.

In questo modo la vostra dichiarazione di aggiornamento diventa (più o meno):

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) 

e così via ..

Questo dovrebbe dare buone prestazioni, mentre scaling up per grandi volumi di aggiornamenti in una volta.

Problemi correlati