Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Quali sono le differenze tra CHECKSUM() e BINARY_CHECKSUM() e quando/quali sono gli scenari di utilizzo appropriati?

Dai un'occhiata al seguente post del blog che mette in evidenza le differenze.

http://decipherinfosys.wordpress. com/2007/05/18/checksum-functions-in-sql-server-2005/

Aggiunta di informazioni da questo link:

L'intento principale delle funzioni CHECKSUM è creare un indice hash basato su un'espressione o un elenco di colonne. Se supponiamo di utilizzarlo per calcolare e archiviare una colonna a livello di tabella per denotare il checksum sulle colonne che rendono un record univoco in una tabella, questo può essere utile per determinare se una riga è stata modificata o meno. Questo meccanismo può quindi essere utilizzato invece di unirsi a tutte le colonne che rendono univoco il record per vedere se il record è stato aggiornato o meno. La documentazione in linea di SQL Server contiene molti esempi su questa funzionalità.

Un paio di cose a cui prestare attenzione quando si utilizzano queste funzioni:

Devi assicurarti che le colonne o l'ordine delle espressioni siano gli stessi tra i due checksum che vengono confrontati, altrimenti il ​​valore sarebbe diverso e causerebbe problemi.

Non consigliamo di utilizzare il checksum(*) poiché il valore che verrà generato in questo modo sarà basato sull'ordine delle colonne della definizione della tabella in fase di esecuzione, che può facilmente cambiare in un periodo di tempo. Quindi, definisci esplicitamente l'elenco delle colonne.

Fai attenzione quando includi le colonne del tipo di dati datetime poiché la granularità è 1/300 di secondo e anche una piccola variazione risulterà in un valore di checksum diverso. Quindi, se devi utilizzare una colonna del tipo di dati datetime, assicurati di ottenere la data esatta + ora/min. ovvero il livello di granularità che desideri.

Sono disponibili tre funzioni di checksum:

CHECKSUM:Questo è stato descritto sopra.

CHECKSUM_AGG:restituisce il checksum dei valori in un gruppo e in questo caso i valori Null vengono ignorati. Funziona anche con la clausola OVER della nuova funzione analitica in SQL Server 2005.

BINARY_CHECKSUM:come dice il nome, restituisce il valore di checksum binario calcolato su una riga o un elenco di espressioni. La differenza tra CHECKSUM e BINARY_CHECKSUM è nel valore generato per i tipi di dati stringa. Un esempio di tale differenza è che i valori generati per "DECIPHER" e "decipher" saranno diversi nel caso di un BINARY_CHECKSUM ma saranno gli stessi per la funzione CHECKSUM (supponendo che abbiamo un'installazione senza distinzione tra maiuscole e minuscole dell'istanza). Un'altra differenza è nel confronto delle espressioni. BINARY_CHECKSUM() restituisce lo stesso valore se gli elementi di due espressioni hanno lo stesso tipo e la stessa rappresentazione di byte. Quindi, "2Volvo Director 20" e "3Volvo Director 30" produrranno lo stesso valore, tuttavia la funzione CHECKSUM() valuta il tipo e confronta le due stringhe e se sono uguali, viene restituito solo lo stesso valore.

Example:
STRING              BINARY_CHECKSUM_USAGE    CHECKSUM_USAGE
------------------- ----------------------    -----------
2Volvo Director 20  -1356512636                -341465450
3Volvo Director 30  -1356512636                -341453853
4Volvo Director 40  -1356512636                -341455363