Primary Key als GUID, ihhh


Viele Entwickler haben eine Vorliebe für GUIDs (Globally Unique IDentifier), denn Objekte müssen schließlich eine eindeutige Identität besitzen. Im falle einer Benutzung der GUID wird eine eindeutige und universell gültige ID generiert (es kann trotzdem zu Duplikaten kommen). Als Konsequenz sind in der ein oder anderen Datenbank Primärschlüsselspalten des Typs GUID vorhanden, was nicht optimal ist aber dazu später mehr. Entwickler bevorzugen meist somit auch den Uniqueidentifier für Tabellen in denen keine global eindeutige Identifizierung nötig ist. In SQL Server wird dieser Typ als “uniqueidentifier”
bezeichnet. Der Datentyp benötigt 16-Byte Speicher und besteht aus folgender Struktur:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, jedes x steht für eine hexadezimale Ziffer.


Der Datentyp alleine beschert aber noch keine gültige GUID.

Declare @test uniqueidentifier
 
Select @test


Ergebnis schaut wie folgt aus:

Null

Uniqueidentifier ist lediglich in der Lage diese Art von Wert abzuspeichern, für die Beladung der Variable wird die Funktion “newid()” benötigt.

Declare @test uniqueidentifier
 
select @test = newid()
 
select @test

 

Ergebnis:

GUID


Nun zur Problematik:

Der Uniqueidentifier ermöglich die eindeutige Identifizierung des Datensatzes im (ganzen Universum), dass sollte überdacht werden da der uniqueidentifier doch 16-Byte Speicher frisst. Der Int hingegen lediglich 4 Byte. Nun klingt der Unterschied von 12 Bytes nicht gerade dramatisch.

Rechenbeispiel:
Uniqueidentifier
Bei 1.000.000 Datensätzen ergäbe das 15,25 MB

Int hingegen kommt ein bisschen besser weg.
Bei 1.000.000 Datensätzen ergäbe das 3,81 MB

Wenn nun in mehreren Tabellen dieser Fehler gemacht wurde wirkt sich das in der Regel erheblich auf die Datenbankgröße aus.

Allerdings sollte die Kalkulation nicht ohne Indizes gemacht werden. Wird jetzt der Primärschlüsselspalte von Typ uniqueidentifier noch ein gruppierter Index hinzugefügt, wird der Schlüsselwert des gruppierten Indexes in jedem nicht gruppierten Index gespeichert. Der Größenunterschied zwischen uniqueidentifier und Int liegt mit miteingerechneten Indizes nun bei 4:1. Das ist durchaus ein Thema was sich vermeiden lässt…
Deshalb bitte liebe Entwickler, verwendet den Uniqueidentifier nur wenn ihr das Objekt wirklich global eindeutig braucht.

Kommentare sind geschlossen