2012-02-03 6 views
6

Al lavoro abbiamo hackerato una procedura memorizzata e abbiamo notato qualcosa.SQL Server è abbastanza intelligente da non AGGIORNARE se i valori sono uguali?

Per una delle nostre dichiarazioni di aggiornamento, abbiamo notato che se i valori sono gli stessi dei valori precedenti, abbiamo ottenuto un guadagno in termini di prestazioni.

Non dicevamo

UPDATE t1 SET A=5 

in cui la colonna è stata già è stato pari a 5. Stavamo facendo qualcosa di simile:

UPDATE t1 SET A = Qty*4.3 

In ogni caso, è SQL Server abbastanza intelligente da non fare lo operazione se i valori valutano allo stesso in un'operazione UPDATE o sto semplicemente venendo ingannato da altri fenomeni?

risposta

2

Giudicando dall'uscita TSQL, considera UPDATE eseguito anche se è lo stesso valore.

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) 

Quando si tratta di scrittura effettiva su disco, mi piacerebbe sicuramente speranza che non è necessario.

Modifica: vedere la risposta di @AbeMiessler per un'analisi più approfondita su come funziona la parte di registrazione su disco/disco.

+0

L'assenza di un disco write-to-è sicuramente un guadagno di prestazioni. – simon

+0

Ottima analisi del problema, bnw – simon

+0

Non penso che la scrittura su disco avvenga immediatamente. Penso che la domanda sia "la pagina viene contrassegnata come sporca" –

0

SQL dovrà effettivamente calcolare il risultato numerico prima di fare qualsiasi altra cosa, deve farlo in modo che sappia quale valore è necessario "fare qualcosa" con. Anche allora sarebbe necessario leggere il valore dalla tabella per fare un confronto.

Quello che sto cercando di dire è che in questo caso renderebbe meno efficiente leggere il valore, confrontarlo con quello a cui si sta tentando di aggiornarlo e quindi prendere una decisione come a se dovrebbe impegnarsi per l'operazione di aggiornamento. Nel tuo caso deve leggere Qty prima che possa capire cosa è necessario inserire nel campo A, ma anche così, nel momento in cui viene confrontato i valori potrebbe anche aver completato l'aggiornamento e averlo acceso con il resto del suo occupato giorno :)

+2

Non sono d'accordo.Per un aggiornamento deve eseguire una lettura, per confermare che in effetti vi è una riga da aggiornare e schiaffeggiare un blocco sulla/e riga/e, possibilmente anche indici, prima che possa emettere l'aggiornamento. Quindi, se la lettura viene eseguita comunque, e determina che nessun dato viene effettivamente modificato, può saltare la fase di scrittura effettiva. –

1

È possibile che si verifichino alcuni miglioramenti delle prestazioni in base allo stato specifico degli indici delle tabelle.

Se la tabella è indicizzata e l'aggiornamento non richiede che i dati vengano spostati (in cluster) o che nessun indice debba essere modificato (non in cluster), è possibile che venga visualizzato un guadagno.

Se comunichi all'SQL di aggiornarsi, verrà aggiornato. Quindi, guarderei verso il lato hardware (ad esempio, indicizzazione).

Problemi correlati