sql >> Databáze >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() v SQL Server:Jaký je rozdíl?

V SQL Server obě NEWSEQUENTIALID() funkce a NEWID() vytvořit GUID (globálně jedinečný identifikátor), také známý jako UUID (univerzálně jedinečný identifikátor).

GUID lze použít jako jedinečný identifikátor ve sloupcích typu uniqueidentifier , takže k tomuto účelu lze použít obě funkce.

Mezi těmito dvěma funkcemi však existují rozdíly, které mohou ovlivnit vaše rozhodnutí používat jednu přes druhou.

Rozdíly

Zde jsou hlavní rozdíly mezi těmito dvěma funkcemi.

NEWID() NEWSEQUENTIALID()
GUID Vytváří náhodné GUID. Vytváří sekvenční GUID.
Přístup Identifikátor GUID odpovídá RFC 4122 verze 4, která uvádí, že je GUID generováno náhodně nebo pseudonáhodně. Vytváří identifikátor GUID, který je větší než kterýkoli identifikátor GUID vygenerovaný touto funkcí na určeném počítači od spuštění systému Windows. Po restartování Windows může GUID začít znovu z nižšího rozsahu, ale je stále celosvětově jedinečné.
Typ návratu jedinečný identifikátor jedinečný identifikátor
Použití Lze použít v ad-hoc dotazech, tabulkách, proměnných atd. Lze použít pouze s DEFAULT omezení na sloupce tabulky typu uniqueidentifier .
Výkon Může být pomalejší než NEWSEQUENTIALID() , protože NEWID() způsobuje náhodnou aktivitu a používá méně datových stránek uložených v mezipaměti. Může být rychlejší než NEWID() , protože NEWID způsobuje náhodnou aktivitu a používá méně datových stránek uložených v mezipaměti. Pomocí NEWSEQUENTIALID() také pomáhá zcela vyplnit data a indexové stránky.
Zabezpečení Bezpečnější, protože GUID je generováno náhodně a je obtížnější jej uhodnout. Méně bezpečné. Je možné uhodnout hodnotu dalšího vygenerovaného GUID, a tudíž získat přístup k datům spojeným s tímto GUID.

Jsem si jistý, že pod kapotou je spousta dalších rozdílů, ale toto jsou hlavní rozdíly z pohledu uživatele.

Příklad 1 – Porovnání identifikátorů GUID

Zde je rychlý příklad, který demonstruje rozdíl v GUID, který každá z těchto funkcí vytváří.

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

Výsledek:

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

Vidíme, že NEWSEQUENTIALID() sloupec se zvyšuje postupně, zatímco NEWID() sloupec se zdá být náhodný.

Oba sloupce obsahují GUID a jsou platným jednoznačným identifikátorem typy.

Na NEWID() můžeme vidět, že všechny hodnoty jsou RFC 4122 verze/(podtyp) 4, což určuje, že GUID je generováno náhodně nebo pseudonáhodně. Víme, že je to verze 4, protože 4 je na příslušném místě (všechny řádky mají tvar: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Příklad 2 – Použití v dotazech

Jak již bylo zmíněno, pouze NEWID() lze použít v dotazech.

Můžete to udělat například takto:

SELECT NEWID() AS [NEWID()];

Výsledek:

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

Ale nemůžete to udělat:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Výsledek:

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. Sloučení dvou řádků do jednoho při nahrazení hodnot null

  2. Multi-Cloud Deployment pro replikaci MySQL

  3. Počítání počtu spojených řádků v levém spojení

  4. Jak vytvořit formulář z tabulky v Accessu 2016