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.