unico new generar sql-server-2005 primary-key identity

sql server 2005 - generar - newid() vs newsequentialid() ¿Cuáles son las diferencias/los pros y los contras?



unique identifier sql server 2012 (4)

En una base de datos donde todas sus claves principales son GUID, ¿cuáles son las diferencias / implicaciones y / o las ventajas y desventajas de usar newid () frente a newsequentialid () como "valor predeterminado o enlace"?

La única diferencia que conozco es que newid () crea un nuevo GUID aleatorio en lugar de newsequentialid () crea un nuevo GUID basado en el último que está en la tabla de forma incrementada.


En cuanto al uso de claves secuenciales (como con identidad, secuencia y NEWSEQUENTIALID) frente a las no secuenciales (como con NEWID o un generador de claves aleatorizado personalizado), hay varios aspectos a considerar.

A partir de las claves secuenciales, todas las filas van hacia el extremo derecho del índice. Cuando una página está llena, SQL Server asigna una nueva página y la llena. Esto da como resultado una menor fragmentación en el índice, lo que es beneficioso para el rendimiento de lectura. Además, las inserciones pueden ser más rápidas cuando una sola sesión carga los datos, y los datos residen en una sola unidad o en una pequeña cantidad de unidades.

Sin embargo, con los subsistemas de almacenamiento de gama alta que tienen muchos ejes, la situación puede ser diferente. Cuando cargue datos de varias sesiones, terminará con la contención de bloqueo de página (los cierres son objetos utilizados para sincronizar el acceso a las páginas de la base de datos) contra las páginas más a la derecha de la lista vinculada del nivel de la hoja del índice. Este cuello de botella impide el uso del rendimiento total del subsistema de almacenamiento. Tenga en cuenta que si decide usar claves secuenciales y las numéricas, siempre puede comenzar con el valor más bajo del tipo para usar todo el rango. Por ejemplo, en lugar de comenzar con 1 en un tipo INT, podría comenzar con -2,147,483,648.

Considere claves no secuenciales, como las aleatorias generadas con NEWID o con una solución personalizada. Al intentar forzar una fila en una página ya llena, SQL Server realiza una división de página clásica: asigna una nueva página y mueve la mitad de las filas de la página original a la nueva. Una división de página tiene un costo, además de que resulta en la fragmentación del índice. La fragmentación del índice puede tener un impacto negativo en el rendimiento de las lecturas. Sin embargo, en términos de rendimiento de inserción, si el subsistema de almacenamiento contiene muchos ejes y está cargando datos de varias sesiones, el orden aleatorio puede ser mejor que secuencial a pesar de las divisiones.

Esto se debe a que no hay una zona activa en el extremo derecho del índice, y se utiliza mejor el rendimiento disponible del subsistema de almacenamiento. Un buen ejemplo de un punto de referencia que demuestra esta estrategia se puede encontrar en un blog de Thomas Kejser en http://blog.kejser.org/2011/10/05/boosting-insert-speed-by-generating-scalable-keys/ .

Fuente: Consulta del Kit de capacitación del examen 70-461 de Microsoft® SQL Server® 2012


Según tengo entendido, cuando la instancia de SQL se activa, el GUID NEWSEQUENTIALID se inicializa en un valor aleatorio. Luego, durante la vida útil de su operación, los GUID se incrementan en el GUID central, NO mirando el último GUID generado para la tabla.


Como lo entiendo, cuando realice una inserción en una fila de la base de datos, se insertará en orden en relación con las otras PK de la tabla. Con un guid normal, esto podría estar en cualquier lugar de la tabla. Siempre se agregará un newsequentialid () al final de la tabla.

Así se mejora el rendimiento de las inserciones.

Este sitio explica las diferencias y los puntos de referencia entre los dos métodos diferentes.

Actualización: la publicación de blog a la que se hace referencia se ha movido. El enlace ahora se refiere a un enlace web.archive.org. Aquí está la clave para llevar:

Lo más sorprendente es el número de escrituras requeridas por la función del sistema NEWID. Esto, junto con la densidad de páginas promedio del 69%, es evidencia de la división de páginas causada por la distribución aleatoria de inserciones en el nivel de la hoja. Tan pronto como una página se llena, se debe dividir en 2 páginas de 50% cada una para que se complete la inserción. La división de páginas no solo ha resultado en una densidad de páginas deficiente, sino que también ha fragmentado bastante las páginas de datos (hay un 99% de probabilidad de que la siguiente página de datos no esté al lado de la actual). En nuestras pruebas, el lugar más probable para una página gratuita requerida para la división de páginas es al final de la tabla, independientemente de dónde se inserte la fila. Por lo tanto, para leer las filas en orden, el escaneo debe seguir saltando hacia adelante y hacia atrás entre páginas divididas ampliamente distribuidas, de ahí la terrible fragmentación.

--Stefan Delmarco


Como sé, NEWID() genera el GUID en orden aleatorio y NEWSEQUENTIALID() genera el GUID en orden secuencial. NEWSEQUENTIALID() se puede usar SOLAMENTE en la cláusula predeterminada de una tabla.