sql >> Database teknologi >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() i SQL Server:Hvad er forskellen?

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.

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.

  1. Logisk replikationspartitionering med PostgreSQL 13

  2. Annoncering af MariaDB 10.2 Support - ClusterControl 1.5

  3. 4 grunde til at du bør prioritere databaseovervågning i din 2020-planlægning

  4. Ret "SQL-server blokerede adgang til ERKLÆRING 'OpenRowset/OpenDatasource' for komponenten 'Ad Hoc Distributed Queries'