Quali sono le differenze tra CHECKSUM () e BINARY_CHECKSUM () e quando/quali sono gli scenari di utilizzo appropriati?
Controlla il seguente post sul blog che evidenzia le differenze.
CHECKSUM Functions in SQL Server 2005
Aggiunta di informazioni da questo link:
L’intento chiave delle funzioni di CHECKSUM è quello di costruire un indice hash basato su un’espressione o un elenco di colonne. Se diciamo che lo usi per calcolare e memorizzare una colonna a livello di tabella per indicare il checksum sulle colonne che rendono un record unico in una tabella, questo può essere utile per determinare se una riga è cambiata o meno. Questo meccanismo può quindi essere utilizzato invece di unirsi a tutte le colonne che rendono il record unico per vedere se il record è stato aggiornato o meno. SQL Server Books Online ha molti esempi su questo pezzo di funzionalità.
Un paio di cose a cui prestare attenzione quando si utilizzano queste funzioni:
È necessario assicurarsi che le colonne o l’ordine delle espressioni siano gli stessi tra i due checksum che vengono confrontati altrimenti il valore sarebbe diverso e porterà a problemi.
Non consigliamo di utilizzare 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 per un periodo di tempo. Quindi, definisci esplicitamente l’elenco delle colonne.
Fai attenzione quando includi le colonne di tipo dati datetime poiché la granularità è 1/300th di secondo e anche una piccola variazione risulterà in un valore di checksum diverso. Quindi, se devi utilizzare una colonna di tipo dati datetime, assicurati di ottenere la data esatta + ora/min. cioè il livello di granularità che vuoi.
Ci sono tre funzioni di checksum disponibili:
CHECKSUM: Questo è stato descritto sopra.
CHECKSUM_AGG: Restituisce il checksum dei valori in un gruppo e i valori Null vengono ignorati in questo caso. Questo funziona anche con la clausola OVER della nuova funzione analitica in SQL Server 2005.
BINARY_CHECKSUM: come indica il nome, restituisce il valore del 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 case insensitive 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 rappresentazione 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 -3414654503Volvo Director 30 -1356512636 -3414538534Volvo Director 40 -1356512636 -341455363