sql >> Databasteknik >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() i SQL Server:Vad är skillnaden?

I SQL Server, både NEWSEQUENTIALID() funktionen och NEWID() funktionen skapa en GUID (Globally Unique IDentifier), även känd som UUID (Universally Unique IDentifier).

En GUID kan användas som en unik identifierare i kolumner av typen uniqueidentifier , så båda funktionerna kan användas för det ändamålet.

Det finns dock skillnader mellan dessa två funktioner som kan påverka ditt beslut att använda den ena framför den andra.

Skillnaderna

Här är de viktigaste skillnaderna mellan dessa två funktioner.

NEWID() NEWSEQUENTIALID()
GUID Skapar en slumpmässig GUID. Skapar en sekventiell GUID.
Tillvägagångssätt GUID:n överensstämmer med RFC 4122 version 4, som anger att GUID:n genereras slumpmässigt eller pseudo-slumpmässigt. Skapar ett GUID som är större än något GUID som tidigare genererats av den här funktionen på en specificerad dator sedan Windows startades. Efter omstart av Windows kan GUID:n starta om från ett lägre intervall, men är fortfarande globalt unikt.
Returtyp uniqueidentifier uniqueidentifier
Användning Kan användas i ad-hoc-frågor, tabeller, variabler, etc. Kan endast användas med DEFAULT begränsningar på tabellkolumner av typen uniqueidentifier .
Prestanda Kan vara långsammare än NEWSEQUENTIALID() , eftersom NEWID() orsakar slumpmässig aktivitet och använder färre cachade datasidor. Kan vara snabbare än NEWID() , eftersom NEWID orsakar slumpmässig aktivitet och använder färre cachade datasidor. Använder NEWSEQUENTIALID() hjälper också till att helt fylla data och indexsidor.
Säkerhet Säkrare eftersom GUID genereras slumpmässigt och svårare att gissa. Mindre säker. Det är möjligt att gissa värdet av nästa genererade GUID och därför komma åt data som är kopplade till det GUID.

Jag är säker på att det finns många andra skillnader under huven, men dessa är de viktigaste skillnaderna ur en användares perspektiv.

Exempel 1 – Jämföra GUID:erna

Här är ett snabbt exempel för att visa skillnaden i GUID som var och en av dessa funktioner producerar.

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 att NEWSEQUENTIALID() kolumnen ökar på ett sekventiellt sätt, medan NEWID() kolumnen verkar vara slumpmässig.

Båda kolumnerna innehåller GUID och de är giltiga uniqueidentifiers typer.

NEWID() kolumn, kan vi se att alla värden är RFC 4122 version/(sub-type) 4, vilket anger att GUID genereras slumpmässigt eller pseudoslumpmässigt. Vi vet att det är version 4 eftersom 4:an är på den relevanta platsen (alla rader har formen: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Exempel 2 – Användning i frågor

Som nämnts, endast NEWID() kan användas i frågor.

Du kan till exempel göra detta:

SELECT NEWID() AS [NEWID()];

Resultat:

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

Men du kan inte göra detta:

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. Jag vill återställa databasen med ett annat schema

  2. Ingen operator matchar det angivna namnet och argumenttyp(erna). Du kan behöva lägga till explicita casts. -- Netbeans, Postgresql 8.4 och Glassfish

  3. skillnaden mellan primärnyckel och unik nyckel

  4. Varför har vissa kommandon ingen effekt i psql?