CHECKSUM (Transact-SQL)

  • 07/24/2017
  • 3 minutes to read
    • c
    • r
    • M
    • i
    • M
    • +6

Applies to: SQL Server (alle unterstützten Versionen) Azure SQL-Datenbank Verwaltete Azure SQL-Instanz Azure Synapse Analytics

Die CHECKSUM Funktion gibt den Prüfsummenwert zurück, der über eine Tabellenzeile oder über eine Ausdruckliste berechnet wird. Verwenden Sie CHECKSUM , um Hash-Indizes zu erstellen.

Transact-SQL-Syntaxkonventionen

Syntax

CHECKSUM ( * | expression ) 

Hinweis

Informationen zur Transact-SQL-Syntax für SQL Server 2014 und frühere Versionen finden Sie in der Dokumentation zu früheren Versionen.

Hinweis

Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.

Argumente

*
Dieses Argument gibt an, dass die Prüfsummenberechnung alle Tabellenspalten abdeckt. CHECKSUM gibt einen Fehler zurück, wenn eine Spalte einen nicht vergleichbaren Datentyp hat. Zu den nicht vergleichbaren Datentypen gehören:

  • cursor
  • image
  • ntext
  • text
  • XML

Ein weiterer nicht vergleichbarer Datentyp ist sql_variant mit einem der vorhergehenden Datentypen als Basistyp.

expression
Ein Ausdruck eines beliebigen Typs, mit Ausnahme eines nicht vergleichbaren Datentyps.

Rückgabetypen

int

Bemerkungen

CHECKSUM berechnet einen Hash-Wert, der als Prüfsumme bezeichnet wird, über seine Argumentliste. Verwenden Sie diesen Hash-Wert, um Hash-Indizes zu erstellen. Ein Hash-Index ergibt sich, wenn die CHECKSUM -Funktion Spaltenargumente hat und ein Index über dem berechneten CHECKSUM -Wert erstellt wird. Dies kann für die Gleichheitssuche über die Spalten verwendet werden.

Die Funktion CHECKSUM erfüllt die Eigenschaften der Hash-Funktion: CHECKSUM, die auf zwei beliebige Listen von Ausdrücken angewendet wird, gibt denselben Wert zurück, wenn die entsprechenden Elemente der beiden Listen denselben Datentyp haben und wenn diese entsprechenden Elemente beim Vergleich mit dem Operator equals (=) gleich sind. Nullwerte eines angegebenen Typs werden definiert, um für CHECKSUM -Funktionszwecke als gleich verglichen zu werden. Wenn sich mindestens einer der Werte in der Ausdruckliste ändert, ändert sich wahrscheinlich die Listenprüfsumme. Dies ist jedoch nicht garantiert.Um zu erkennen, ob sich Werte geändert haben, empfehlen wir daher die Verwendung von CHECKSUM nur, wenn Ihre Anwendung gelegentlich verpasste Änderungen tolerieren kann. Andernfalls sollten Sie stattdessen HASHBYTES . Mit einem angegebenen MD5-Hash-Algorithmus ist die Wahrscheinlichkeit, dass HASHBYTES dasselbe Ergebnis für zwei verschiedene Eingaben zurückgibt, im Vergleich zu CHECKSUM viel geringer.

Die Reihenfolge des Ausdrucks wirkt sich auf den berechneten CHECKSUM-Wert aus. Die Reihenfolge der Spalten, die für CHECKSUM(*) verwendet wird, ist die Reihenfolge der Spalten, die in der Tabellen- oder Ansichtsdefinition angegeben sind. Dies schließt berechnete Spalten ein.

Der CHECKSUM Wert hängt von der Sortierung ab. Derselbe Wert, der mit einer anderen Sortierung gespeichert wurde, gibt einen anderen CHECKSUM -Wert zurück.

CHECKSUM () garantiert keine eindeutigen Ergebnisse.

Beispiele

Diese Beispiele zeigen die Verwendung von CHECKSUM zum Erstellen von Hash-Indizes.

Um den Hash-Index zu erstellen, fügt das erste Beispiel der zu indizierenden Tabelle eine berechnete Prüfsummenspalte hinzu. Anschließend wird ein Index für die Prüfsummenspalte erstellt.

-- Create a checksum index. SET ARITHABORT ON; USE AdventureWorks2012; GO ALTER TABLE Production.Product ADD cs_Pname AS CHECKSUM(Name); GO CREATE INDEX Pname_index ON Production.Product (cs_Pname); GO 

Dieses Beispiel zeigt die Verwendung eines Prüfsummenindex als Hash-Index. Dies kann dazu beitragen, die Indizierungsgeschwindigkeit zu verbessern, wenn es sich bei der zu indizierenden Spalte um eine Langzeichenspalte handelt. Der Prüfsummenindex kann für die Gleichheitssuche verwendet werden.

/*Use the index in a SELECT query. Add a second search condition to catch stray cases where checksums match, but the values are not the same.*/ SELECT * FROM Production.Product WHERE CHECKSUM(N'Bearing Ball') = cs_Pname AND Name = N'Bearing Ball'; GO 

Die Indexerstellung für die berechnete Spalte materialisiert die Prüfsummenspalte, und alle Änderungen am ProductName -Wert werden an die Prüfsummenspalte weitergegeben. Alternativ können wir einen Index direkt auf der Spalte erstellen, die wir indizieren möchten. Bei langen Schlüsselwerten funktioniert ein regulärer Index jedoch wahrscheinlich nicht so gut wie ein Prüfsummenindex.

See also

CHECKSUM_AGG (Transact-SQL)
HASHBYTES (Transact-SQL)
BINARY_CHECKSUM (Transact-SQL)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.