2009-10-19 21 views
20

En una base de datos donde todas sus claves principales son GUID, ¿cuáles son las diferencias/implicaciones y/o pros y contras usando newid() versus newsequentialid() como el "valor predeterminado o enlace".newid() vs newsequentialid() ¿Cuáles son las diferencias/pros y contras?

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 incremental.

Respuesta

23

Según tengo entendido, cuando realiza una inserción en una fila de la base de datos, se insertará en orden relativo a las otras PK de la tabla. Con un guid normal, esto podría estar en cualquier lugar de la mesa. Un newsequentialid() siempre se agregará al final de la tabla.

Por lo tanto, se mejora el rendimiento de las inserciones.

This site explica las diferencias y puntos de referencia entre los dos métodos diferentes.

Actualización: se ha movido la publicación de blog a la que se hace referencia. El enlace ahora se refiere a un enlace web.archive.org. Esta es la conclusión clave:

enter image description here

Lo más sorprendente es el número de escrituras requeridas por la función del sistema NEWID. Esto, junto con la densidad promedio de páginas del 69%, es evidencia de la división de páginas causada por la distribución aleatoria de insertos a nivel de hoja. Tan pronto como una página se llena, debe dividirse 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ágina deficiente, sino que ha fragmentado las páginas de datos bastante mal (hay un 99% de probabilidad de que la siguiente página de datos no esté junto a la actual). En nuestras pruebas, el lugar más probable para una página libre requerida para la división de la página es al final de la tabla, independientemente de dónde se inserte la fila. Por lo tanto, para leer las filas para que el escaneo tenga que ir y venir entre las páginas divididas ampliamente distribuidas, de ahí la fragmentación espantosa.

--Stefan Delmarco

+0

Huh? Si se generan de forma secuencial ¿Cómo se puede garantizar que el GUID generado sea realmente único, en lugar de ser algo que se parece a un GUID? – Justin

+4

@Justing: no hay * garantía * de que un GUID sea único, es muy probable que lo sea. –

+1

Los enlaces son volátiles ... Fotia ahora 404s el enlace en la respuesta. –

-2

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

+2

No agregó nada a lo que ya estaba escrito en el pregunta. –

1

Según entiendo, cuando la instancia de SQL se activa, el GUÍA NEWSEQUENTIALID se inicializa a un valor aleatorio. Luego, durante la vigencia de su operación, los GUID se incrementan en el GUID central, NO al observar el último GUID generado para la tabla.

+1

El beneficio de hacer esto está en los índices. Los GUID aleatorios completos fragmentan demasiado los índices, los GUID secuenciales son buenos para el rendimiento de inserción e indexación. – Todd

+0

[Microsoft declara] (https://msdn.microsoft.com/da-dk/library/ms189786.aspx) que es secuencial con respecto al último GUID generado desde la última vez que se inició la máquina host. –

9

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 clave aleatorio personalizado), hay varios aspectos a considerar.

Comenzando con las teclas secuenciales, todas las filas van al extremo derecho del índice. Cuando una página está llena, SQL Server asigna una página nueva y la rellena. 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 un número pequeño de unidades.

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

Considere las 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 completa, 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 da como resultado 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 un punto caliente en el extremo derecho del índice, y 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 al http://blog.kejser.org/2011/10/05/boosting-insert-speed-by-generating-scalable-keys/.

Fuente: Consulta Microsoft® SQL Server® 2012 Examen 70-461 Kit de formación

Cuestiones relacionadas