Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

NEWID() срещу NEWSEQUENTIALID() в SQL Server:Каква е разликата?

В SQL Server и двата NEWSEQUENTIALID() функция и NEWID() функция създава GUID (глобално уникален идентификатор), известен също като UUID (универсален уникален идентификатор).

GUID може да се използва като уникален идентификатор в колони от тип uniqueidentifier , така че и двете функции могат да се използват за тази цел.

Въпреки това, има разлики между тези две функции, които могат да повлияят на решението ви да използвате една пред друга.

Разликите

Ето основните разлики между тези две функции.

NEWID() NEWSEQUENTIALID()
GUID Създава произволен GUID. Създава последователен GUID.
Подход GUID отговаря на RFC 4122 версия 4, който посочва, че GUID се генерира произволно или псевдослучайно. Създава GUID, който е по-голям от всеки GUID, генериран преди това от тази функция на посочен компютър от стартирането на Windows. След рестартиране на Windows, GUID може да започне отново от по-нисък диапазон, но все още е глобално уникален.
Тип връщане уникален идентификатор уникален идентификатор
Употреба Може да се използва в ad hoc заявки, таблици, променливи и т.н. Може да се използва само с DEFAULT ограничения за колоните на таблицата от тип uniqueidentifier .
Изпълнение Може да бъде по-бавно от NEWSEQUENTIALID() , защото NEWID() причинява произволна активност и използва по-малко кеширани страници с данни. Може да бъде по-бързо от NEWID() , защото NEWID причинява произволна активност и използва по-малко кеширани страници с данни. Използване на NEWSEQUENTIALID() също така помага за пълното запълване на страниците с данни и индекси.
Сигурност По-сигурно, тъй като GUID се генерира на случаен принцип и е по-труден за отгатване. По-малко сигурен. Възможно е да отгатнете стойността на следващия генериран GUID и следователно да получите достъп до данни, свързани с този GUID.

Сигурен съм, че има много други разлики под капака, но това са основните разлики от гледна точка на потребителя.

Пример 1 – Сравняване на GUID

Ето един бърз пример за демонстриране на разликата в GUID, който всяка от тези функции произвежда.

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

Резултат:

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

Можем да видим, че NEWSEQUENTIALID() колоната се увеличава по последователен начин, докато NEWID() колоната изглежда произволна.

И двете колони съдържат GUID и са валидни uniqueidentifier видове.

В NEWID() колона, можем да видим, че всички стойности са RFC 4122 версия/(подтип) 4, което указва, че GUID се генерира произволно или псевдослучайно. Знаем, че е версия 4, защото 4 е на съответното място (всички редове приемат формата: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Пример 2 – Използване в заявки

Както споменахме, само NEWID() може да се използва в заявки.

Например, можете да направите това:

SELECT NEWID() AS [NEWID()];

Резултат:

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

Но не можете да направите това:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Резултат:

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. Предоставяне на разрешения на ниво таблица в SQL Server

  2. Генериране на дати между периоди от време

  3. SQL Server 2008 разделител на хиляди за колона

  4. Проверете дали файл съществува или не в sql сървър?

  5. Управление на MDF файлове в SQL Server 2019