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

NEWID() vs NEWSEQUENTIALID() in SQL Server:qual è la differenza?

In SQL Server, entrambi NEWSEQUENTIALID() funzione e il NEWID() la funzione crea un GUID (Globally Unique IDentifier), noto anche come UUID (Universaly Unique IDentifier).

Un GUID può essere utilizzato come identificatore univoco nelle colonne di tipo identificatore univoco , quindi entrambe le funzioni possono essere utilizzate a tale scopo.

Tuttavia, ci sono differenze tra queste due funzioni che possono influenzare la tua decisione di utilizzarne una rispetto all'altra.

Le differenze

Ecco le principali differenze tra queste due funzioni.

NEWID() NEWSEQUENTIALID()
GUID Crea un GUID casuale. Crea un GUID sequenziale.
Approccio Il GUID è conforme alla RFC 4122 versione 4, che specifica che il GUID viene generato in modo casuale o pseudo-casuale. Crea un GUID maggiore di qualsiasi GUID precedentemente generato da questa funzione su un computer specificato dall'avvio di Windows. Dopo aver riavviato Windows, il GUID può ricominciare da un intervallo inferiore, ma è ancora univoco a livello globale.
Tipo di reso identificatore univoco identificatore univoco
Utilizzo Può essere utilizzato in query ad hoc, tabelle, variabili, ecc Utilizzabile solo con DEFAULT vincoli sulle colonne della tabella di tipo identificatore univoco .
Prestazioni Può essere più lento di NEWSEQUENTIALID() , perché NEWID() provoca attività casuali e utilizza meno pagine di dati memorizzate nella cache. Può essere più veloce di NEWID() , perché NEWID provoca un'attività casuale e utilizza un minor numero di pagine di dati memorizzate nella cache. Usando NEWSEQUENTIALID() aiuta anche a riempire completamente i dati e le pagine di indice.
Sicurezza Più sicuro, poiché il GUID è generato casualmente e più difficile da indovinare. Meno sicuro. È possibile indovinare il valore del GUID successivo generato e, quindi, accedere ai dati associati a quel GUID.

Sono sicuro che ci sono molte altre differenze sotto il cofano, ma queste sono le differenze principali dal punto di vista di un utente.

Esempio 1 – Confronto dei GUID

Ecco un rapido esempio per dimostrare la differenza nel GUID prodotto da ciascuna di queste funzioni.

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

Risultato:

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

Possiamo vedere che il NEWSEQUENTIALID() la colonna viene incrementata in modo sequenziale, mentre NEWID() la colonna sembra essere casuale.

Entrambe le colonne contengono GUID e sono un identificatore univoco valido tipi.

Sul NEWID() colonna, possiamo vedere che tutti i valori sono RFC 4122 versione/(sottotipo) 4, che specifica che il GUID viene generato in modo casuale o pseudo-casuale. Sappiamo che è la versione 4 perché la 4 è nel punto pertinente (tutte le righe assumono la forma: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Esempio 2 – Utilizzo nelle query

Come accennato, solo NEWID() può essere utilizzato nelle query.

Ad esempio, puoi farlo:

SELECT NEWID() AS [NEWID()];

Risultato:

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

Ma non puoi farlo:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Risultato:

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.