Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() w SQL Server:jaka jest różnica?

W SQL Server, zarówno NEWSEQUENTIALID() funkcja i NEWID() funkcja tworzy identyfikator GUID (Globally Unique IDentifier), znany również jako UUID (Universally Unique IDentifier).

Identyfikator GUID może być używany jako unikalny identyfikator w kolumnach typu uniqueidentifier , więc obie funkcje mogą być użyte do tego celu.

Istnieją jednak różnice między tymi dwiema funkcjami, które mogą wpłynąć na decyzję o użyciu jednej z drugiej.

Różnice

Oto główne różnice między tymi dwiema funkcjami.

NEWID() IDNESEKWENCJA()
GUID Tworzy losowy identyfikator GUID. Tworzy sekwencyjny identyfikator GUID.
Podejście Identyfikator GUID jest zgodny z RFC 4122 wersja 4, która określa, że ​​identyfikator GUID jest generowany losowo lub pseudolosowo. Tworzy identyfikator GUID, który jest większy niż dowolny identyfikator GUID wygenerowany wcześniej przez tę funkcję na określonym komputerze od momentu uruchomienia systemu Windows. Po ponownym uruchomieniu systemu Windows, identyfikator GUID może rozpocząć się ponownie z niższego zakresu, ale nadal jest globalnie unikalny.
Typ zwrotu unikalny identyfikator unikalny identyfikator
Użycie Może być używany w zapytaniach ad hoc, tabelach, zmiennych itp. Można używać tylko z DEFAULT ograniczenia dotyczące kolumn tabeli typu unikalny identyfikator .
Wydajność Może być wolniejszy niż NEWSEQUENTIALID() , ponieważ NEWID() powoduje losową aktywność i wykorzystuje mniej stron danych w pamięci podręcznej. Może być szybszy niż NEWID() , ponieważ NEWID powoduje losową aktywność i wykorzystuje mniej stron danych w pamięci podręcznej. Używanie NEWSEQUENTIALID() pomaga również całkowicie wypełnić dane i strony indeksowe.
Bezpieczeństwo Bardziej bezpieczne, ponieważ identyfikator GUID jest generowany losowo i trudniejszy do odgadnięcia. Mniej bezpieczne. Możliwe jest odgadnięcie wartości następnego wygenerowanego identyfikatora GUID, a tym samym uzyskanie dostępu do danych powiązanych z tym identyfikatorem GUID.

Jestem pewien, że pod maską jest wiele innych różnic, ale są to główne różnice z perspektywy użytkownika.

Przykład 1 – Porównanie identyfikatorów GUID

Oto krótki przykład pokazujący różnicę w identyfikatorze GUID, który tworzy każda z tych funkcji.

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

Wynik:

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

Widzimy, że NEWSEQUENTIALID() kolumna zwiększa się w sposób sekwencyjny, podczas gdy NEWID() kolumna wydaje się być losowa.

Obie kolumny zawierają identyfikatory GUID i mają prawidłowy unikalny identyfikator typy.

W NEWID() widzimy, że wszystkie wartości to RFC 4122 wersja/(podtyp) 4, co określa, że ​​identyfikator GUID jest generowany losowo lub pseudolosowo. Wiemy, że to wersja 4, ponieważ 4 jest w odpowiednim miejscu (wszystkie wiersze mają postać: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Przykład 2 – Użycie w zapytaniach

Jak wspomniano, tylko NEWID() mogą być używane w zapytaniach.

Na przykład możesz to zrobić:

SELECT NEWID() AS [NEWID()];

Wynik:

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

Ale nie możesz tego zrobić:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Wynik:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kopiuj dane z Salesforce do SQL Server za pomocą Spectral Core

  2. Bazy danych systemu SQL Server – Konserwacja MSDB

  3. IDENTITY() vs IDENTITY() w SQL Server:jaka jest różnica?

  4. Jak TRY_CONVERT() działa w SQL Server

  5. Czy wszyscy migrują do chmury?