Non c'è niente di sbagliato nel GUID come chiavi e cluster in un sistema OLTP (a meno che non ci siano MOLTI indici sulla tabella che soffrono della maggiore dimensione del cluster). È un dato di fatto, sono molto più scalabili delle colonne IDENTITY.
È diffusa la convinzione che i GUID rappresentino un grosso problema in SQL Server - in gran parte, è semplicemente sbagliato. È un dato di fatto, GUID può essere significativamente più scalabile su scatole con più di circa 8 core:
Mi dispiace, ma i tuoi sviluppatori hanno ragione. Preoccupati di altre cose prima di preoccuparti del GUID.
Oh, e infine: perché vuoi un indice cluster in primo luogo? Se la tua preoccupazione è un sistema OLTP con molti piccoli indici, probabilmente stai meglio con un heap.
Consideriamo ora quale frammentazione (che il GUID introdurrà) fa alle tue letture. Esistono tre problemi principali con la frammentazione:
- La pagina suddivide gli I / O del disco di costo
- Le pagine a metà intere non sono efficienti in termini di memoria delle pagine intere
- Fa sì che le pagine vengano archiviate in modo non ordinato, il che rende meno probabile l'I / O sequenziale
Poiché la tua preoccupazione in merito alla questione riguarda la scalabilità, che possiamo definire come "L'aggiunta di altro hardware rende il sistema più veloce", questi sono i minori problemi. Per affrontare ognuno a turno
Annuncio 1) Se si desidera ridimensionare, è possibile acquistare I / O. Anche un SSD Samsung / Intel da 512 GB economico (a pochi USD / GB) ti porterà ben oltre 100.000 IOPS. Non lo consumerai presto in un sistema a 2 socket. E se dovessi imbatterti in questo, comprane uno in più e sei pronto
Annuncio 2) Se cancelli nella tua tabella, avrai comunque metà pagine intere. E anche se non lo fai, la memoria è economica e per tutti tranne i più grandi sistemi OLTP - i dati caldi dovrebbero adattarsi lì. Cercare di raggruppare più dati in pagine è subottimizzato quando si cerca la scala.
Annuncio 3) Una tabella costruita con suddivisione frequente della pagina, dati altamente frammentati esegue I / O casuali esattamente alla stessa velocità di una tabella riempita in sequenza
Per quanto riguarda l'adesione, ci sono due principali tipi di join che è probabile che tu veda in un carico di lavoro come OLTP: Hash e loop. Vediamo ciascuno a turno:
Un hash join: un hash join presuppone che il tavolino venga scansionato e quello più grande venga generalmente cercato. È molto probabile che le tabelle piccole siano in memoria, quindi I / O non è un problema per te. Abbiamo già toccato il fatto che le ricerche hanno lo stesso costo in un indice frammentato che in un indice non frammentato
Loop join: verrà cercato il tavolo esterno. Stesso costo
Potresti anche avere molte scansioni di tabelle in corso, ma il GUID non è di nuovo la tua preoccupazione, l'indicizzazione è corretta.
Ora, potresti avere alcune scansioni di intervallo legittime in corso (specialmente quando si uniscono su chiavi esterne) e in questo caso, i dati frammentati sono meno "compressi" rispetto ai dati non frammentati. Ma consideriamo quali join è probabile che vedrai in dati 3NF ben indicizzati:
Un join da una tabella che ha un riferimento di chiave esterna alla chiave primaria della tabella a cui fa riferimento
Viceversa
Annuncio 1) In questo caso, stai cercando una sola ricerca nella chiave primaria - unendo n a 1. Frammentazione o no, stesso costo (una ricerca)
Annuncio 2) In questo caso, ti stai unendo alla stessa chiave, ma potresti recuperare più di una riga (ricerca intervallo). Il join in questo caso è da 1 a n. Tuttavia, nella tabella esterna che stai cercando, stai cercando la stessa chiave, che ha la stessa probabilità di trovarsi sulla stessa pagina in un indice frammentato rispetto a una non frammentata.
Considera quelle chiavi esterne per un momento. Anche se avevi posato "perfettamente" in sequenza le nostre chiavi primarie, tutto ciò che punta a quella chiave sarà comunque non sequenziale.
Ovviamente, potresti essere in esecuzione su una macchina virtuale in alcune SAN in alcune banche a basso costo e con processi elevati. Quindi tutti questi consigli andranno persi. Ma se questo è il tuo mondo, la scalabilità probabilmente non è ciò che stai cercando - stai cercando prestazioni e alta velocità / costo - che sono entrambe cose diverse.