tabla simple primarias primaria naturales modificar llave foraneas externa datos crear compuesta claves clave sql-server database-design

sql-server - simple - modificar clave primaria sql server



Identificador único(guid) como clave principal en el diseño de la base de datos (6)

Nuestros datos residen en una base de datos de SQL Server 2008, habrá muchas consultas y uniones entre tablas. Tenemos este argumento dentro del equipo, algunos argumentan que el uso de la identidad entera es mejor para el rendimiento, otros argumentan el uso de guid (identificador único).

¿Sufre realmente el rendimiento al usar un GUID como clave principal?


La principal ventaja de usar GUID es que son únicos en todo el espacio y el tiempo.

La principal desventaja de usar GUID como valores clave es que son GRANDES. Con 16 bytes en un pop, son uno de los tipos de datos más grandes en SQL Server. Los índices construidos en GUIDs serán más grandes y más lentos que los índices construidos en columnas IDENTITY, que suelen ser ints (4 bytes).

Por lo tanto, son una buena solución para los casos en los que necesita combinar datos de varias fuentes

Fuente: http://www.sqlteam.com/article/uniqueidentifier-vs-identity


El gran problema con los GUID como claves principales es que causan una fragmentación masiva de la tabla, lo que puede ser un gran problema de rendimiento (cuanto más grande es la tabla, mayor es el problema). Incluso como una clave para un índice no agrupado, causarán la fragmentación del índice.

Puede mitigar parcialmente el problema estableciendo un factor de relleno apropiado, pero seguirá siendo un problema.

La diferencia de tamaño no me molesta tanto, excepto en tablas con filas por lo demás estrechas donde también se requieren exploraciones de tablas. En esos casos, ser capaz de ajustar más filas por página de base de datos es una ventaja de rendimiento.

Puede haber buenas razones para usar GUID, pero también hay un costo. En general, prefiero la IDENTIDAD INT para las claves primarias, pero no evito los GUID cuando son una mejor solución.



Personalmente uso INT IDENTITY para la mayoría de mis claves principales y de agrupamiento.

Debe mantener aparte la clave principal, que es una construcción lógica: identifica de forma única sus filas, tiene que ser única y estable y NOT NULL . Un GUID también funciona bien para una clave principal, ya que se garantiza que es único. Un GUID como su clave principal es una buena opción si utiliza la replicación de SQL Server, ya que en ese caso, de todos modos, necesita una columna GUID de identificación única.

La clave de agrupamiento en SQL Server es una construcción física que se utiliza para el ordenamiento físico de los datos, y es mucho más difícil hacerlo bien. Por lo general, la reina de la indexación en SQL Server, Kimberly Tripp, también requiere una buena clave de agrupamiento para ser uniqe, estable, lo más estrecha posible e idealmente cada vez mayor (todo lo cual es una INT IDENTITY ).

Vea sus artículos sobre indexación aquí:

y también vea The Cost of GUIDs de Jimmy Nilsson como clave principal

Un GUID es una opción terriblemente mala para una clave de agrupación, ya que es amplia, totalmente aleatoria, y por lo tanto conduce a una mala fragmentación del índice y un bajo rendimiento. Además, la (s) fila (s) clave (s) de agrupación también se almacena en todas y cada una de las entradas de cada índice no agrupado (adicional), por lo que realmente desea mantenerlo pequeño: GUID es de 16 bytes frente a INT es de 4 bytes, y con varios índices no agrupados y varios millones de filas, esto hace una gran diferencia.

En SQL Server, su clave principal es por defecto su clave de agrupación en clúster, pero no tiene que serlo. Puede utilizar fácilmente un GUID como su clave principal NO agrupada, y una INT IDENTITY como su clave de agrupación en clústeres: solo se necesita estar consciente de ello.


Si los registros de la tabla de la base de datos pueden crecer en millones de registros, creo que no es una buena idea usarla como clave principal.


Una clave GUID ( uniqueidentifier ) de 128 bits es, por supuesto, 4 veces más grande que una clave int 32 bits. Sin embargo, hay algunas ventajas clave:

  • Ningún problema de "IDENTITY INSERT" al fusionar contenido
  • Si usa un valor COMB en lugar de NEWSEQUENTIALID (), obtiene una marca de tiempo INSERT "gratuita". Incluso puede SELECT desde la clave principal en función de un intervalo de fecha / hora si lo desea con algunas llamadas CAST() sofisticadas.
  • Son únicos a nivel mundial, lo que resulta bastante útil de vez en cuando.
  • Ya que no hay necesidad de rastrear las marcas altas, su capa BL puede asignar el valor en lugar del SQL Server, eliminando así el paso de SELECT scope_identity() para obtener la clave principal después de una inserción.
  • Si es incluso remotamente posible que pueda tener más de 2 mil millones de registros, deberá usar bigint (64 bits) en lugar de int . Una vez que haces eso, el uniqueidentifier único es solo el doble de grande que un bigint .
  • El uso de GUID hace que sea más seguro exponer las claves en las direcciones URL, etc., sin exponerse a los ataques de "adivinar el ID".
  • Entre cómo SQL Server carga las páginas del disco y cómo los procesadores ahora son en su mayoría de 64 bits, solo porque un número es de 128 bits en lugar de 32, no significa que se tarde 4 veces más en comparar. La última prueba que vi mostró que los GUID son casi tan rápidos.
  • El tamaño del índice depende de cuántas columnas están incluidas. A pesar de que los GUID son más grandes, los 8 o 12 bytes adicionales pueden ser insignificantes en comparación con las otras columnas del índice.

Al final, no puede valer la pena perder algunas de las ventajas de un GUID. Prueba empíricamente y decide por ti mismo.

Personalmente, todavía uso ambos, dependiendo de la situación, pero el factor decisivo nunca se ha reducido al rendimiento en mi caso.