INT vs Identificatore univoco per il campo ID nel database

Sto creando un nuovo database per un sito Web utilizzando SQL Server 2005 (probabilmente SQL Server 2008 nel prossimo futuro). Come sviluppatore di applicazioni, ho visto molti database che utilizzano un integer (o bigint , ecc.) Per un campo ID di una tabella che verrà utilizzato per le relazioni. Ma ultimamente ho visto anche database che usano l’ unique identifier ( GUID ) per un campo ID.

La mia domanda è se uno ha un vantaggio rispetto all’altro? I campi integer saranno più veloci per le query e le iscrizioni, ecc.?

AGGIORNAMENTO: per rendere chiaro, questo è per una chiave primaria nelle tabelle.

I GUID sono problematici come chiavi in ​​cluster a causa dell’elevata casualità. Questo problema è stato affrontato da Paul Randal nell’ultima colonna delle domande e risposte di Technet Magazine: mi piacerebbe utilizzare un GUID come chiave di indice cluster, ma gli altri stanno sostenendo che può portare a problemi di prestazioni con gli indici. È vero e, in caso affermativo, puoi spiegare perché?

Ora tieni presente che la discussione riguarda specificamente gli indici cluster . Si dice che si desidera utilizzare la colonna come ‘ID’, che non è chiaro se si intende come chiave di gruppo o solo chiave primaria. In genere i due si sovrappongono, quindi presumo che tu voglia usarlo come indice cluster. I motivi per cui questa è una scelta sbagliata sono spiegati nel link all’articolo che ho citato sopra.

Per gli indici non cluster, i GUID presentano ancora alcuni problemi, ma non così grandi come quando sono la chiave cluster di sinistra della tabella. Di nuovo, la casualità dei GUID introduce divisioni di pagina e frammentazione, sia a livello di indice non cluster (un problema molto più piccolo).

Ci sono molte leggende metropolitane che circondano l’uso GUID che le condannano in base alla loro dimensione (16 byte) rispetto a un int (4 byte) e promettono un destino di prestazioni orribile se vengono utilizzate. Questo è un po ‘esagerato. Una chiave di dimensione 16 può essere ancora una chiave molto efficace, su un modello di dati correttamente progettato. Se è vero che essere 4 volte più grande di un int si traduce in più pagine non fogliate a bassa densità negli indici, questa non è una vera preoccupazione per la stragrande maggioranza delle tabelle. La struttura ad albero b è un albero naturalmente ben bilanciato e la profondità di attraversamento dell’albero è raramente un problema, quindi la ricerca di un valore basato su chiave GUID rispetto a un tasto INT è simile nelle prestazioni. Un attraversamento della pagina foglia (cioè una scansione della tabella) non esamina le pagine non foglia e l’impatto delle dimensioni GUID sulle dimensioni della pagina è in genere piuttosto ridotto, poiché il record stesso è significativamente più grande rispetto ai 12 byte aggiuntivi introdotti dal GUID. Quindi prendo il consiglio di dire-sentito basato su ‘è 16 byte contro 4’ con un granello di sale piuttosto grande. Analizza caso per caso e decidi se l’impatto delle dimensioni fa la differenza: quante altre colonne sono nella tabella (cioè quanto impatto ha la dimensione GUID nelle pagine foglia) e quanti riferimenti stanno usando (es. quante altre tabelle aumenteranno a causa del fatto che devono memorizzare una chiave esterna più grande).

Sto chiamando tutti questi dettagli in una sorta di difesa improvvisata dei GUID perché ultimamente hanno ricevuto molta ctriggers stampa e alcuni sono immeritati. Hanno i loro meriti e sono indispensabili in qualsiasi sistema distribuito (nel momento in cui stai parlando di movimento dei dati, sia attraverso la replica o il quadro di sincronizzazione o qualsiasi altra cosa). Ho visto che le cattive decisioni venivano prese in base alla ctriggers reputazione del GUID quando venivano evitate senza un’adeguata considerazione. Ma è vero, se devi usare un GUID come chiave di cluster, assicurati di affrontare il problema della casualità: usa i jumper sequenziali quando ansible.

Infine, per rispondere alla tua domanda: se non hai una ragione specifica per usare GUID, usa INT.

Il GUID occuperà più spazio e sarà più lento di un int, anche se si utilizza la funzione newsequentialid (). Se stai per eseguire la replica o utilizzare il framework di sincronizzazione, è necessario utilizzare un guid.

INTs sono 4 byte, BIGINT ar 8 byte e GUID sono 16 byte. Più spazio è richiesto per rappresentare i dati, più risorse sono necessarie per elaborarli – spazio su disco, memoria, ecc. Quindi (a) sono più lenti, ma (b) questo probabilmente conta solo se il volume è un problema (milioni di righe o migliaia di transazioni in pochissimo tempo.)

Il vantaggio dei GUID è che sono (praticamente) Globalmente Unici. Genera un guid utilizzando l’algoritmo corretto (e SQL Server xxxx utilizzerà l’algoritmo corretto) e non ci saranno mai due guidi uguali, indipendentemente dal numero di computer che li hai generati, indipendentemente dalla frequenza. (Questo non si applica dopo 72 anni di utilizzo – ho dimenticato i dettagli.)

Se sono necessari identificatori univoci generati su più server, i GUID potrebbero essere utili. Se hai bisogno di Mondo Forza e meno di 2 miliardi di valori, gli Ints probabilmente stanno bene. Infine, e forse la cosa più importante, se i tuoi dati hanno delle chiavi naturali, rimani con loro e dimentica i valori surrogati.

se in positivo, devi assolutamente avere un ID univoco, quindi GUID. Significato se ti unirai mai, sincronizzarti, replicare, probabilmente dovresti usare un GUID.

Per cose meno robuste, un int, dovrebbe essere sufficiente a seconda di quanto grande sarà la tabella.

Come nella maggior parte dei casi, la risposta corretta è, dipende.

Usali per la replica ecc., Non come chiavi primarie.

Articolo di Kimberly L Tripp

  • Contro: Spazio, non strettamente monotonico, divisioni di pagine, segnalibri / RID ecc
  • Per: er …

Pienamente d’accordo con JBrooks. Voglio dire che quando la tua tabella è grande e usi selettivi con JOINS, specialmente con le tabelle derivate, l’utilizzo dei GUID può ridurre significativamente le prestazioni.