Krav: Når man bruker GUID-er som primærnøkkelaggregationsindekser, anbefales det å bruke ordnede GUID-er, fordi uordnede GUID-er vil føre til plasssløsing og den påfølgende reduksjonen i lese- og skriveeffektivitet.
Anmeldelse:
Database GUID-verdi
Globale unike identifikatorer (GUID) datatyper i SQL Server representeres av datatyperUnikidentifikator, som lagrer en 16-byte binær verdi. En GUID er et binært tall hvis hovedformål er å være en identifikator som må være unik i et nettverk med mange datamaskiner på mange steder.
Både Guid og SqlGuid har måter å sammenligne ulike GUID-verdier på. SqlGuid-implementasjonen bruker SQL Server-oppførsel,De siste seks bytene av verdien er de viktigste。
Sekvensielle GUID-er er iboende gjettelige, så ikke bruk dem i sikkerhetssensitive sammenhenger。
Referanse:Innloggingen med hyperkoblingen er synlig.
Databasen er ordnet av GUID
SQL Server-databasen har en slikNewSequentialId()funksjon for å lage en ordnet GUID. Når du lager en tabell, kan du sette den som standardverdi for et GUID-type felt, og automatisk lage verdien av primærnøkkelen når du setter inn nye data (denne funksjonen kan kun brukes som standardverdien for feltet, ikke direkte kalles i SQL).
Eksempel:
NewSequentialId()-funksjonen kan kun brukes i databaser, selv om Microsofts MSDN-dokumentasjon oppgir at NEWSEQUENTIALID er en wrapper for Windows UuidCreateSequential-funksjonen.
Tips: Ikke bruk funksjonen hvis det gjelder konfidensialitet. FordiDet er mulig å gjette verdien av neste genererte GUIDfor å få tilgang til dataene knyttet til den GUID-en.
Referanse:Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
.NET lager en ordnet GUID
UuidCreateSequential-funksjonen avhenger av metodens beregningsmaskinvareDe siste 12 bitene er faktisk MAC-adressen til nettverkskortet。
Koden er som følger:
Resultatene er som følger:
Brist:
- Denne metoden krever at DllImport kaller Windows-biblioteket, så det er ikke plattformuavhengig.
- Den kan ikke brukes i et klyngemiljø, hvor flere maskiner skriver til samme database fordi de resulterende GUID-ene vil være forskjellige fra hverandre (funksjonsavhengig maskinvare), noe som resulterer i indeksfragmentering.
- Hvis Windows-serveren starter på nytt, kan GUID-en starte i et lavere område, noe som resulterer i indeksfragmentering.
Referanse:
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Hvis du bruker et .NET-program for å lage en SQL SERVER-ordnet GUID, anbefales det å bruke et tredjeparts klassebibliotek:RT. Kam, Nuget-kommandoen er som følger:
Koden er som følger:
Ytelse:
Referanse:Innloggingen med hyperkoblingen er synlig.
Ordnede og uordnede GUID-primærnøkkelindeksfragmenter
Start med å lage to tabeller med følgende skript:
Testen legger inn 100 000 databiter, og koden er som følger:
Testresultatene er som følger:
| GUID | Tid brukt (ms) | Skanningstetthet [Beste antall: Faktisk antall], jo høyere verdi, desto bedre | Logisk skanningsfragmentering, jo lavere verdi, desto bedre | Gjennomsnittlig sidetetthet (full) (gjennomsnittlig Sidetetthet (full), jo høyere verdi, desto bedre | | Uordnet GUID | 13367 | 12.58% [61:485] | 98.97% | 63.66% | | Ordre GUID | 14139 | 100.00% [39:39] | 0.32% | 99.61% |
Testen setter inn 1 million databiter igjen, med en GUID ute av rekkefølge som tar 135203 ms og en ordinert GUID som tar 135134 ms. Lagringsplassen er som følger:
Uordnet GUID: 36,547 MB Bestilt GUID: 26,609 MB
Referanse:Innloggingen med hyperkoblingen er synlig.
(Slutt)
|