Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() no SQL Server:Qual é a diferença?


No SQL Server, tanto o NEWSEQUENTIALID() função e o NEWID() A função cria um GUID (Globally Unique IDentifier), também conhecido como UUID (Universal Unique IDentifier).

Um GUID pode ser usado como um identificador exclusivo em colunas do tipo identificador único , portanto, ambas as funções podem ser usadas para essa finalidade.

No entanto, existem diferenças entre essas duas funções que podem influenciar sua decisão de usar uma em detrimento da outra.


As diferenças


Aqui estão as principais diferenças entre essas duas funções.
NOVO() NEWSEQUENTIALID()
GUID Cria um GUID aleatório. Cria um GUID sequencial.
Abordagem O GUID está em conformidade com a RFC 4122 versão 4, que especifica que o GUID é gerado aleatoriamente ou pseudoaleatoriamente. Cria um GUID maior do que qualquer GUID gerado anteriormente por esta função em um computador especificado desde que o Windows foi iniciado. Após reiniciar o Windows, o GUID pode ser reiniciado a partir de um intervalo inferior, mas ainda é globalmente exclusivo.
Tipo de retorno identificador exclusivo identificador exclusivo
Uso Pode usar em consultas ad-hoc, tabelas, variáveis, etc Só pode ser usado com DEFAULT restrições nas colunas da tabela do tipo identificador exclusivo .
Desempenho Pode ser mais lento que NEWSEQUENTIALID() , porque NEWID() causa atividade aleatória e usa menos páginas de dados em cache. Pode ser mais rápido que NEWID() , porque NEWID causa atividade aleatória e usa menos páginas de dados em cache. Usando NEWSEQUENTIALID() também ajuda a preencher completamente os dados e as páginas de índice.
Segurança Mais seguro, pois o GUID é gerado aleatoriamente e mais difícil de adivinhar. Menos seguro. É possível adivinhar o valor do próximo GUID gerado e, portanto, acessar os dados associados a esse GUID.

Tenho certeza de que há muitas outras diferenças sob o capô, mas essas são as principais diferenças da perspectiva do usuário.

Exemplo 1 – Comparando os GUIDs


Aqui está um exemplo rápido para demonstrar a diferença no GUID que cada uma dessas funções produz.
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

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

Podemos ver que o NEWSEQUENTIALID() coluna está incrementando de forma sequencial, enquanto o NEWID() coluna parece ser aleatória.

Ambas as colunas contêm GUIDs e são uniqueidentifier válidos tipos.

No NEWID() coluna, podemos ver que todos os valores são RFC 4122 versão/(subtipo) 4, que especifica que o GUID é gerado aleatoriamente ou pseudo-aleatoriamente. Sabemos que é a versão 4 porque o 4 está no local relevante (todas as linhas têm o formato: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Exemplo 2 – Uso em consultas


Como mencionado, apenas NEWID() pode ser usado em consultas.

Por exemplo, você pode fazer isso:
SELECT NEWID() AS [NEWID()];

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

Mas você não pode fazer isso:
SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Resultado:
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.