En 128-bit GUID (uniqueidentifier
) nøglen er selvfølgelig 4x større end en 32-bit int
nøgle. Der er dog et par vigtige fordele:
- Intet "IDENTITY INSERT"-problem ved fletning af indhold
- Hvis du bruger en COMB-værdi i stedet for NEWSEQUENTIALID(), får du et "gratis" INSERT-tidsstempel. Du kan endda
SELECT
fra den primære nøgle baseret på et dato-/tidsinterval, hvis du vil med et par smarteCAST()
opkald. - De er globalt unikke, hvilket viser sig at være ret praktisk nu og da.
- Da der ikke er behov for at spore højvandsmærker, kan dit BL-lag tildele værdien i stedet for SQL Server, og dermed eliminere trinnet
SELECT scope_identity()
for at hente den primære nøgle efter en indsættelse. - Hvis det overhovedet er muligt, at du kan have mere end 2 milliarder poster, skal du bruge
bigint
(64 bit) i stedet forint
. Når du har gjort det,uniqueidentifier
er kun dobbelt så stor som enbigint
. - Brug af GUID'er gør det mere sikkert at afsløre nøgler i URL'er osv. uden at udsætte dig selv for "gæt-ID"-angreb.
- Mellem hvordan SQL Server indlæser sider fra disk og hvordan processorer nu for det meste er 64-bit, betyder det ikke, at det tager 4x længere tid at sammenligne, bare fordi et tal er 128 bit i stedet for 32. Den sidste test, jeg så, viste, at GUID'er er næsten lige så hurtige.
- Indeksstørrelse afhænger af hvor mange kolonner er inkluderet. Selvom GUID'erne selv er større, kan de ekstra 8 eller 12 bytes være ubetydelige sammenlignet med de andre kolonner i indekset.
I sidste ende er det måske ikke værd at presse en lille ydeevnefordel ud ved at bruge heltal at miste fordelene ved en GUID. Test det empirisk og afgør selv.
Personligt bruger jeg stadig begge dele, afhængigt af situationen, men den afgørende faktor er aldrig rigtig kommet ned til ydeevne i mit tilfælde.