Die DB muss einen B-Baum pflegen (oder eine ähnliche Struktur) mit dem Schlüssel so, dass sie geordnet sind.
Wenn der Schlüssel gehasht und im B-Tree gespeichert ist, wäre das in Ordnung, um schnell die Eindeutigkeit zu überprüfen des Schlüssels - der Schlüssel kann immer noch effizient nachgeschlagen werden. Aber Sie könnten nicht effizient nach range suchen von Daten (z.B. mit LIKE
), da der B-Baum nicht mehr nach dem String-Wert geordnet ist.
Ich denke also, dass die meisten DBs den String wirklich im B-Tree speichern, was (1) mehr Platz einnehmen kann als numerische Werte und (2) erfordern, dass der B-Baum neu ausbalanciert wird wenn Schlüssel in beliebiger Reihenfolge eingefügt werden (keine Vorstellung von steigendem Wert wie bei numerischem pk).
Die Strafe in der Praxis kann es von unbedeutend bis riesig reichen. Es hängt alles von der Verwendung, der Anzahl der Zeilen, der durchschnittlichen Größe des Zeichenfolgenschlüssels, den Abfragen, die die Tabelle verbinden, usw. ab.