Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

NEWID() vs. NEWSEQUENTIALID() in SQL Server:Was ist der Unterschied?

In SQL Server sind sowohl die NEWSEQUENTIALID() Funktion und die NEWID() Funktion erstellt eine GUID (Globally Unique IDentifier), auch bekannt als UUID (Universally Unique IDentifier).

Eine GUID kann als eindeutiger Bezeichner in Spalten vom Typ uniqueidentifier verwendet werden , also können beide Funktionen für diesen Zweck verwendet werden.

Es gibt jedoch Unterschiede zwischen diesen beiden Funktionen, die Ihre Entscheidung beeinflussen können, eine Funktion gegenüber der anderen zu verwenden.

Die Unterschiede

Hier sind die Hauptunterschiede zwischen diesen beiden Funktionen.

NEWID() NEWSEQUENTIALID()
GUID Erzeugt eine zufällige GUID. Erzeugt eine fortlaufende GUID.
Ansatz Die GUID entspricht RFC 4122 Version 4, die angibt, dass die GUID zufällig oder pseudozufällig generiert wird. Erzeugt eine GUID, die größer ist als jede GUID, die zuvor von dieser Funktion auf einem angegebenen Computer seit dem Start von Windows generiert wurde. Nach dem Neustart von Windows kann die GUID wieder aus einem niedrigeren Bereich starten, ist aber immer noch global eindeutig.
Rückgabetyp eindeutige Kennung eindeutige Kennung
Nutzung Kann in Ad-hoc-Abfragen, Tabellen, Variablen usw. verwendet werden Kann nur mit DEFAULT verwendet werden Einschränkungen für Tabellenspalten vom Typ uniqueidentifier .
Leistung Kann langsamer sein als NEWSEQUENTIALID() , weil NEWID() verursacht zufällige Aktivitäten und verwendet weniger zwischengespeicherte Datenseiten. Kann schneller sein als NEWID() , weil NEWID verursacht zufällige Aktivitäten und verwendet weniger zwischengespeicherte Datenseiten. Verwenden von NEWSEQUENTIALID() hilft auch, die Daten- und Indexseiten vollständig zu füllen.
Sicherheit Sicherer, da die GUID zufällig generiert wird und schwerer zu erraten ist. Weniger sicher. Es ist möglich, den Wert der nächsten generierten GUID zu erraten und daher auf Daten zuzugreifen, die dieser GUID zugeordnet sind.

Ich bin sicher, dass es viele andere Unterschiede unter der Haube gibt, aber dies sind die Hauptunterschiede aus der Sicht eines Benutzers.

Beispiel 1 – Vergleich der GUIDs

Hier ist ein kurzes Beispiel, um den Unterschied in der GUID zu demonstrieren, die jede dieser Funktionen erzeugt.

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

Ergebnis:

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

Wir können sehen, dass die NEWSEQUENTIALID() Spalte wird sequentiell erhöht, wohingegen die NEWID() Spalte scheint zufällig zu sein.

Beide Spalten enthalten GUIDs und sind gültige uniqueidentifier Typen.

Auf der NEWID() Spalte sehen wir, dass alle Werte RFC 4122 Version/(Untertyp) 4 sind, was angibt, dass die GUID zufällig oder pseudozufällig generiert wird. Wir wissen, dass es Version 4 ist, weil die 4 an der entsprechenden Stelle steht (alle Zeilen haben die Form: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Beispiel 2 – Verwendung in Abfragen

Wie gesagt, nur NEWID() kann in Abfragen verwendet werden.

Sie können beispielsweise Folgendes tun:

SELECT NEWID() AS [NEWID()];

Ergebnis:

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

Aber das geht nicht:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Ergebnis:

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.