sql >> Database >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() in SQL Server:wat is het verschil?

In SQL Server zijn zowel de NEWSEQUENTIALID() functie en de NEWID() functie maak een GUID (Globally Unique IDentifier), ook bekend als UUID (Universally Unique IDentifier).

Een GUID kan worden gebruikt als een unieke identifier in kolommen van het type uniqueidentifier , dus beide functies kunnen voor dat doel worden gebruikt.

Er zijn echter verschillen tussen deze twee functies die van invloed kunnen zijn op uw beslissing om de ene boven de andere te gebruiken.

De verschillen

Dit zijn de belangrijkste verschillen tussen deze twee functies.

NIEUWID() NEWSEQUENTIALID()
GUID Maakt een willekeurige GUID. Maakt een sequentiële GUID.
Aanpak De GUID voldoet aan RFC 4122 versie 4, die specificeert dat de GUID willekeurig of pseudo-willekeurig wordt gegenereerd. Maakt een GUID aan die groter is dan alle GUID's die eerder door deze functie op een opgegeven computer zijn gegenereerd sinds het opstarten van Windows. Na het herstarten van Windows kan de GUID opnieuw starten vanaf een lager bereik, maar is nog steeds wereldwijd uniek.
Retourtype unieke identificatie unieke identificatie
Gebruik Kan gebruiken in ad-hocquery's, tabellen, variabelen, enz. Kan alleen gebruiken met DEFAULT beperkingen op tabelkolommen van het type uniqueidentifier .
Prestaties Kan langzamer zijn dan NEWSEQUENTIALID() , omdat NEWID() veroorzaakt willekeurige activiteit en gebruikt minder gegevenspagina's in de cache. Kan sneller zijn dan NEWID() , omdat NEWID veroorzaakt willekeurige activiteit en gebruikt minder gegevenspagina's in de cache. NEWSEQUENTIALID() gebruiken helpt ook om de gegevens en indexpagina's volledig te vullen.
Beveiliging Veiliger, omdat de GUID willekeurig wordt gegenereerd en moeilijker te raden is. Minder veilig. Het is mogelijk om de waarde van de volgende gegenereerde GUID te raden en daardoor toegang te krijgen tot gegevens die aan die GUID zijn gekoppeld.

Ik weet zeker dat er nog tal van andere verschillen zijn onder de motorkap, maar dit zijn de belangrijkste verschillen vanuit het perspectief van de gebruiker.

Voorbeeld 1 – De GUID's vergelijken

Hier is een snel voorbeeld om het verschil aan te tonen in de GUID die elk van deze functies produceert.

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

Resultaat:

+--------------------------------------+--------------------------------------+
| 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 |
+--------------------------------------+--------------------------------------+

We kunnen zien dat de NEWSEQUENTIALID() kolom wordt opeenvolgend verhoogd, terwijl de NEWID() kolom lijkt willekeurig te zijn.

Beide kolommen bevatten GUID's en zijn geldige uniqueidentifier soorten.

Op de NEWID() kolom, kunnen we zien dat alle waarden RFC 4122 versie/(subtype) 4 zijn, wat aangeeft dat de GUID willekeurig of pseudo-willekeurig wordt gegenereerd. We weten dat het versie 4 is omdat de 4 op de relevante plek staat (alle rijen hebben de vorm: xxxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Voorbeeld 2 – Gebruik in zoekopdrachten

Zoals vermeld, alleen NEWID() kan worden gebruikt in query's.

U kunt dit bijvoorbeeld doen:

SELECT NEWID() AS [NEWID()];

Resultaat:

+--------------------------------------+
| NEWID()                              |
|--------------------------------------|
| ba07340c-6308-44d0-8c4b-52ed5e4a1601 |
+--------------------------------------+

Maar je kunt dit niet doen:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Resultaat:

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. SQL ORDER BY-clausule voor beginners

  2. ORDER BY ... USING-clausule in PostgreSQL

  3. Django + Psycopg2:InterfaceError:alleen protocol 3 ondersteund

  4. Hoe u uw bedrijf kunt moderniseren in 2022