Domanda

Io sono abbastanza esperto in SQL server performace ma io constanly devono sostenere l'idea che il Guid deve essere utilizzato come il tipo di default per Clusterd Chiavi Primarie.

Supponendo che la tabella ha una piuttosto bassa quantità di inserti al giorno (5000 +/- righe / giorno), che tipo di performace i problemi che abbiamo incontrato?Come sarà la pagina si divide influenzare i nostri cercano di prestazioni?Quanto spesso devo indicizzare (o dovrei defrag)?Cosa devo impostare i fattori di riempimento a (100, 90, 80, ect)?

Se fossi l'inserimento di 1.000.000 di righe al giorno?

Mi scuso beforhand per tutte le domande, ma sto cercando di ottenere alcuni di backup per non usare Guid come il nostro valore di default per PKs.Sono però completamente aperto per avere la mia mente modificato dal overwehlming conoscenza da StackOverflow base di utenti.

È stato utile?

Soluzione

Se si sta facendo ogni tipo di volume, il GUID sono estremamente male come un PK male a meno che non si utilizza GUID sequenziali , per i motivi precisi che descrivi. pagina frammentazione è grave :

                 Average                    Average
                 Fragmentation  Fragment    Fragment   Page     Average 
Type             in Percent     Count       Size       Count    Space Used

id               4.35           7           16.43      115      99.89
newidguid        98.77          162         1          162      70.90 
newsequentualid  4.35           7           16.43      115      99.89

E come questo confronto tra GUID e interi mostra:

  

Test1 causato un enorme quantità di divisioni di pagina, e aveva una densità di scansione attorno 12% quando mi sono imbattuto un DBCC SHOWCONTIG dopo gli inserti avevano completato. La tabella Test2 aveva una densità di scansione circa il 98%

Se il volume è molto basso, tuttavia, semplicemente non importa più di tanto.

Se si ha realmente bisogno di un ID univoco a livello globale, ma hanno grande disponibilità (e non è possibile utilizzare gli ID sequenziali), basta mettere i GUID in una colonna indicizzata.

Altri suggerimenti

Inconvenienti di utilizzare GUID come chiave primaria:

  • Nessun ordinamento significativo, significa indicizzazione non dà incremento delle prestazioni, come fa con un numero intero.
  • dimensione di un GUID 16 byte, contro 2, 4 o 8 byte per un numero intero.
  • Molto difficile per gli esseri umani da ricordare, così non va bene come id di riferimento.

I vantaggi:

  • Lasciare che non indovinare chiavi primarie che possono quindi essere meno pericoloso quando viene visualizzata in una stringa di query pagina Web o nell'applicazione.
  • Utile nei database che non forniscono un tipo di dati di incremento automatico o identità.
  • Utile quando è necessario unire i dati tra due fonti di dati disparate attraverso piattaforme o ambienti.

Ho pensato che la decisione se utilizzare i GUID era piuttosto semplice, ma forse io sono a conoscenza di altre questioni.

Con una così bassa inserti al giorno, dubito che la suddivisione delle pagine dovrebbe essere un fattore significativo.La vera domanda è come si fa a 5.000 confronta con l'attuale numero di righe, come questo sarebbero le principali informazioni necessarie per decidere su un adeguato riempimento iniziale fattore di deffer si divide.

Detto questo, personalmente non sono un grande fan di Guid.Capisco che possono servire bene in alcuni contesti, ma in molti casi si tratta di "in cammino" [di efficienza, di facilità di uso, di ...]

Trovo le seguenti domande utili per restringere il campo a decidere se GUID deve essere utilizzato o meno.

  • Sarà il PK essere condivisa/pubblicato ?(cioèsarà utilizzato al di là del suo uso interno di SQL, le applicazioni hanno bisogno di questi tasti in un modo un po persistente di moda?Sarà gli utenti in qualche modo vedere queste chiavi?
  • Potrebbe PK essere utilizzati per aiutare a unire diverse origini dati ?
  • La tabella primaria, eventualmente, composito, fatto di colonna(s) nei dati ?Qual è la dimensione di questo possibile questa chiave
  • Come fare le chiavi primarie di ordinamento?Se compositi, sono i primi colonne selettiva ?

Utilizzando un GUID (a meno che non si tratta di un GUID sequenziale) come un indice cluster sta per uccidere le prestazioni inserto. Poiché la struttura tabella fisica è allineato secondo l'indice cluster, utilizzando un guid che ha un ordine di sequenza casuale causerà tavolo grave frammentazione. Se si desidera utilizzare un GUID come PK / indice cluster deve essere un GUID sequenziale utilizzando la funzione NEWSEQUENTIALID () in SQL Server. Ciò garantirà che i GUID generati sono ordinate in sequenza e prevenire la frammentazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top