sql >> Base de Datos >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() en SQL Server:¿Cuál es la diferencia?

En SQL Server, tanto el NEWSEQUENTIALID() función y el NEWID() crea un GUID (Globally Unique IDentifier), también conocido como UUID (Universally Unique IDentifier).

Se puede usar un GUID como identificador único en columnas de tipo identificador único , por lo que ambas funciones se pueden usar para ese propósito.

Sin embargo, existen diferencias entre estas dos funciones que pueden influir en su decisión de usar una sobre la otra.

Las diferencias

Estas son las principales diferencias entre estas dos funciones.

NUEVO() NEWSEQUENTIALID()
GUID Crea un GUID aleatorio. Crea un GUID secuencial.
Enfoque El GUID cumple con RFC 4122 versión 4, que especifica que el GUID se genera de forma aleatoria o pseudoaleatoria. Crea un GUID mayor que cualquier GUID generado previamente por esta función en una computadora específica desde que se inició Windows. Después de reiniciar Windows, el GUID puede comenzar de nuevo desde un rango más bajo, pero aún es globalmente único.
Tipo de devolución identificador único identificador único
Uso Se puede usar en consultas ad-hoc, tablas, variables, etc. Solo se puede usar con DEFAULT restricciones en las columnas de la tabla de tipo uniqueidentifier .
Rendimiento Puede ser más lento que NEWSEQUENTIALID() , porque NEWID() provoca actividad aleatoria y utiliza menos páginas de datos en caché. Puede ser más rápido que NEWID() , porque NEWID provoca actividad aleatoria y utiliza menos páginas de datos en caché. Usando NEWSEQUENTIALID() también ayuda a llenar completamente los datos y las páginas de índice.
Seguridad Más seguro, ya que el GUID se genera aleatoriamente y es más difícil de adivinar. Menos seguro. Es posible adivinar el valor del siguiente GUID generado y, por lo tanto, acceder a los datos asociados con ese GUID.

Estoy seguro de que hay muchas otras diferencias bajo el capó, pero estas son las principales diferencias desde la perspectiva del usuario.

Ejemplo 1:comparación de los GUID

Aquí hay un ejemplo rápido para demostrar la diferencia en el GUID que produce cada una de estas funciones.

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 el NEWSEQUENTIALID() columna se incrementa de forma secuencial, mientras que NEWID() la columna parece ser aleatoria.

Ambas columnas contienen GUID y son identificadores únicos válidos tipos.

En el NEWID() columna, podemos ver que todos los valores son RFC 4122 versión/(subtipo) 4, que especifica que el GUID se genera aleatoriamente o pseudoaleatoriamente. Sabemos que es la versión 4 porque el 4 está en el lugar correspondiente (todas las filas tienen la forma: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Ejemplo 2:uso en consultas

Como se mencionó, solo NEWID() se puede utilizar en las consultas.

Por ejemplo, puedes hacer esto:

SELECT NEWID() AS [NEWID()];

Resultado:

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

Pero no puedes hacer esto:

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.