Requisiti: Quando si utilizzano i GUID come indici primari di aggregazione delle chiavi, si raccomanda di utilizzare GUID ordinati, poiché i GUID non ordinati causeranno spreco di spazio e la conseguente diminuzione dell'efficienza di lettura e scrittura.
Recensione:
Valore GUID del database
I tipi di dati a Identificatore Globalmente Univoco (GUID) in SQL Server sono rappresentati da tipi di datiIdentificatore unico, che memorizza un valore binario di 16 byte. Un GUID è un numero binario il cui scopo principale è fungere da identificatore che deve essere unico in una rete con molti computer su molti siti.
Sia il Guid che l'SqlGuid hanno modi per confrontare diversi valori GUID. L'implementazione di SqlGuid utilizza il comportamento di SQL Server,Gli ultimi sei byte del valore sono i più importanti。
I GUID sequenziali sono intrinsecamente indovinabili, quindi non usarli in contesti sensibili alla sicurezza。
Riferimento:Il login del link ipertestuale è visibile.
Il database è ordinato dal GUID
Il database SQL Server ne ha unaNewSequentialId()funzione per creare un GUID ordinato. Quando si crea una tabella, si può impostarla come valore predefinito di un campo di tipo GUID e creare automaticamente il valore della chiave primaria inserendo nuovi dati (questa funzione può essere usata solo come valore predefinito del campo, non chiamata direttamente in SQL).
Esempio:
La funzione NewSequentialId() può essere utilizzata solo nei database, anche se la documentazione MSDN di Microsoft afferma che NEWSEQUENTIALID è un wrapper per la funzione UuidCreateSequential di Windows.
Consiglio: Non usare la funzione se si tratta di una questione di riservatezza. PerchéÈ possibile indovinare il valore del prossimo GUID generatoper accedere ai dati associati a quel GUID.
Riferimento:Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
.NET crea un GUID ordinato
La funzione UuidCreateSequential dipende dall'hardware di calcolo del metodoGli ultimi 12 bit sono in realtà l'indirizzo MAC della scheda di rete。
Il codice è il seguente:
I risultati sono i seguenti:
Mancanza:
- Questo metodo richiede DllImport per chiamare la libreria Windows, quindi non è multipiattaforma.
- Non può essere utilizzato in un ambiente clusterizzato, dove più macchine scrivono nello stesso database perché i GUID risultanti saranno diversi tra loro (hardware informatico dipendente dalla funzione), causando frammentazione dell'indice.
- Se il tuo server Windows si riavvia, il GUID può partire da un intervallo inferiore, causando frammentazione dell'indice.
Riferimento:
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
Se stai usando un programma .NET per creare una GUID ordinata da SQL SERVER, si consiglia di utilizzare una libreria di classi di terze parti:RT. Pettine, il comando nuget è il seguente:
Il codice è il seguente:
Prodotto:
Riferimento:Il login del link ipertestuale è visibile.
Frammenti di indice di chiave primaria GUID ordinati e non ordinati
Inizia creando due tabelle con il seguente script:
Il test inserisce 100.000 dati e il codice è il seguente:
I risultati dei test sono i seguenti:
| GUID | Tempo consumato (ms) | Densità di scansione [Miglior conteggio: Conteggio reale], più alto è il valore, meglio è | Frammentazione a scansione logica, più basso è il valore, meglio è | Densità media di pagine (completa) (Media Densità di pagine (piena), più alto è il valore, meglio è | | GUID non ordinato | 13367 | 12.58% [61:485] | 98.97% | 63.66% | | Ordina GUID | 14139 | 100.00% [39:39] | 0.32% | 99.61% |
Il test inserisce nuovamente 1 milione di dati in ordine, con un GUID fuori ordine che prende 135203 ms e un GUID ordinato che ne impiega 135134 ms. L'occupazione dello spazio di stoccaggio è la seguente:
GUID non ordinato: 36,547 MB GUID ordinato: 26,609 MB
Riferimento:Il login del link ipertestuale è visibile.
(Fine)
|