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.