I SQL Server er både NEWSEQUENTIALID()
funktionen og NEWID()
funktion opret en GUID (Globally Unique IDentifier), også kendt som UUID (Universally Unique IDentifier).
En GUID kan bruges som en unik identifikator i kolonner af typen uniqueidentifier , så begge funktioner kan bruges til det formål.
Der er dog forskelle mellem disse to funktioner, som kan påvirke din beslutning om at bruge den ene frem for den anden.
Forskellene
Her er de vigtigste forskelle mellem disse to funktioner.
NEWID() | NEWSEQUENTIALID() | |
---|---|---|
GUID | Opretter en tilfældig GUID. | Opretter en sekventiel GUID. |
Tilgang | GUID'et overholder RFC 4122 version 4, som specificerer, at GUID'et er tilfældigt eller pseudo-tilfældigt genereret. | Opretter et GUID, der er større end nogen GUID, der tidligere er genereret af denne funktion på en specificeret computer, siden Windows blev startet. Efter genstart af Windows kan GUID'en starte igen fra et lavere område, men er stadig globalt unikt. |
Returtype | uniqueidentifier | uniqueidentifier |
Brug | Kan bruges i ad hoc-forespørgsler, tabeller, variabler osv. | Kan kun bruges med DEFAULT begrænsninger på tabelkolonner af typen uniqueidentifier . |
Ydeevne | Kan være langsommere end NEWSEQUENTIALID() , fordi NEWID() forårsager tilfældig aktivitet og bruger færre cachelagrede datasider. | Kan være hurtigere end NEWID() , fordi NEWID forårsager tilfældig aktivitet og bruger færre cachelagrede datasider. Brug af NEWSEQUENTIALID() hjælper også med at fylde data og indekssider fuldstændigt. |
Sikkerhed | Mere sikkert, da GUID'et er tilfældigt genereret og sværere at gætte. | Mindre sikker. Det er muligt at gætte værdien af det næste genererede GUID og derfor få adgang til data, der er knyttet til det GUID. |
Jeg er sikker på, at der er masser af andre forskelle under motorhjelmen, men disse er de vigtigste forskelle fra en brugers perspektiv.
Eksempel 1 – Sammenligning af GUID'erne
Her er et hurtigt eksempel for at demonstrere forskellen i den GUID, som hver af disse funktioner producerer.
CREATE TABLE GUIDTest ( NewIdCol uniqueidentifier NOT NULL DEFAULT NEWID(), NewSequentialIdCol uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(), ); GO INSERT GUIDTest (NewIdCol, NewSequentialIdCol) VALUES (DEFAULT, DEFAULT); GO 20 SELECT NewIdCol AS [NEWID()], NewSequentialIdCol AS [NEWSEQUENTIALID()] FROM GUIDTest; GO
Resultat:
+--------------------------------------+--------------------------------------+ | NEWID() | NEWSEQUENTIALID() | |--------------------------------------+--------------------------------------| | 965320de-8997-4e37-8fe9-a7daa52b04aa | 246f433e-f36b-1410-8a80-007d2b533547 | | 5c038bef-c2e1-4558-bd91-49b98fde5c71 | 266f433e-f36b-1410-8a80-007d2b533547 | | e7cfba90-78b6-4360-87a8-0b392fd227e5 | 286f433e-f36b-1410-8a80-007d2b533547 | | 9bf5b052-7023-4f52-939e-b5fb8f8ea27a | 2a6f433e-f36b-1410-8a80-007d2b533547 | | ccb38891-3689-42ed-91f2-79ddf0abeb2f | 2c6f433e-f36b-1410-8a80-007d2b533547 | | 8646ab08-6e4b-4cd6-9b25-ec0440c0f7f3 | 2e6f433e-f36b-1410-8a80-007d2b533547 | | f14e18a5-669a-4a2d-8793-42b705fc134f | 306f433e-f36b-1410-8a80-007d2b533547 | | 09ec2418-cfa0-4c8b-9b08-78e6f7946488 | 326f433e-f36b-1410-8a80-007d2b533547 | | 3ca2b71c-5f84-4db9-aa0f-fb9f215ceb09 | 346f433e-f36b-1410-8a80-007d2b533547 | | ccaed0a6-5851-472d-8b6a-db29581f2a43 | 366f433e-f36b-1410-8a80-007d2b533547 | | be6f9d97-7c86-4e43-9127-1aaa0c75d8b5 | 386f433e-f36b-1410-8a80-007d2b533547 | | b4c7b9e9-6f0c-44fc-904b-1aae2dfd20f9 | 3a6f433e-f36b-1410-8a80-007d2b533547 | | 378b2be8-b368-462f-ad30-896b67974b11 | 3c6f433e-f36b-1410-8a80-007d2b533547 | | 390c58ce-8d5c-454b-8c80-e0a690f113b9 | 3e6f433e-f36b-1410-8a80-007d2b533547 | | 4d2d9c64-bf04-44d2-bee3-4a2a33da05bd | 406f433e-f36b-1410-8a80-007d2b533547 | | 87e73722-bc1c-43f1-b94d-c89053bdc408 | 426f433e-f36b-1410-8a80-007d2b533547 | | 2caf72a0-4a19-4743-b299-99610d44aab2 | 446f433e-f36b-1410-8a80-007d2b533547 | | 3ed0dd28-19d5-44f5-90dc-6ded08269b37 | 466f433e-f36b-1410-8a80-007d2b533547 | | ce768fd8-df02-4d8f-afd4-a62d04571713 | 486f433e-f36b-1410-8a80-007d2b533547 | | 6ca41865-bbee-418a-aa6d-582a4541119d | 4a6f433e-f36b-1410-8a80-007d2b533547 | +--------------------------------------+--------------------------------------+
Vi kan se, at NEWSEQUENTIALID()
kolonne øges på en sekventiel måde, mens NEWID()
kolonne ser ud til at være tilfældig.
Begge kolonner indeholder GUID'er, og de er gyldige uniqueidentifier typer.
På NEWID()
kolonne, kan vi se, at alle værdier er RFC 4122 version/(sub-type) 4, som specificerer, at GUID er tilfældigt eller pseudo-tilfældigt genereret. Vi ved, at det er version 4, fordi 4'eren er på det relevante sted (alle rækker har formen:
xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx
).
Eksempel 2 – Brug i forespørgsler
Som nævnt kun NEWID()
kan bruges i forespørgsler.
Du kan f.eks. gøre dette:
SELECT NEWID() AS [NEWID()];
Resultat:
+--------------------------------------+ | NEWID() | |--------------------------------------| | ba07340c-6308-44d0-8c4b-52ed5e4a1601 | +--------------------------------------+
Men du kan ikke gøre dette:
SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];
Resultat:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.