INT vs Unique-Identificador para el campo ID en la base de datos


Estoy creando una nueva base de datos para un sitio web usando SQL Server 2005 (posiblemente SQL Server 2008 en un futuro próximo). Como desarrollador de aplicaciones, he visto muchas bases de datos que utilizan un integer (o bigint, etc.) para un campo ID de una tabla que se utilizará para las relaciones. Pero últimamente también he visto bases de datos que utilizan el unique identifier (GUID) para un campo de identificación.

Mi pregunta es si uno tiene una ventaja sobre el otro? Los campos integer serán más rápidos para consultar y unirse, sucesivamente.?

UPDATE: Para que quede claro, esto es para una clave primaria en las tablas.

Author: abatishchev, 2009-07-20

6 answers

Los GUID son problemáticos como claves agrupadas debido a la alta aleatoriedad. Este problema fue abordado por Paul Randal en la última columna de Preguntas y respuestas de la revista Technet: Me gustaría usar un GUID como clave de índice agrupada, pero los otros argumentan que puede conducir a problemas de rendimiento con los índices. ¿Es esto cierto y, si es así, puede explicar por qué?

Ahora tenga en cuenta que la discusión se trata específicamente de índices agrupados. Dices que quieres usar la columna como 'ID', es decir no está claro si lo quiere decir como clave agrupada o solo clave primaria. Por lo general, los dos se superponen, por lo que asumiré que desea usarlo como índice agrupado. Las razones por las que es una mala elección se explican en el enlace al artículo que mencioné anteriormente.

Para los índices no agrupados, los GUID todavía tienen algunos problemas, pero no tan grandes como cuando son la clave agrupada más a la izquierda de la tabla. Una vez más, la aleatoriedad de los GUID introduce divisiones de página y fragmentación, ya sea en el nivel de índice no agrupado solo (un problema mucho menor).

Hay muchas leyendas urbanas que rodean el uso de GUID que los condenan en función de su tamaño (16 bytes) en comparación con un int (4 bytes) y prometen una horrible condena de rendimiento si se utilizan. Esto es un poco exagerado. Una clave de tamaño 16 puede ser una clave muy peformant todavía, en un modelo de datos correctamente diseñado. Si bien es cierto que ser 4 veces más grande que un int da como resultado más páginas no foliares de menor densidad en índices, esto no es una preocupación real para la gran mayoría de las mesas. La estructura del árbol b es un árbol naturalmente bien equilibrado y la profundidad del recorrido del árbol rara vez es un problema, por lo que buscar un valor basado en la clave GUID en lugar de una clave INT es similar en rendimiento. Un recorrido hoja-página (ie. un escaneo de tabla) no mira las páginas que no son hojas, y el impacto del tamaño del GUID en el tamaño de la página es típicamente bastante pequeño, ya que el registro en sí es significativamente más grande que los 12 bytes adicionales introducidos por el GUID. Así que tomaría el escuchar-decir consejo basado en 'es 16 bytes vs. 4' con un, bastante grande, grano de sal. Analice caso por caso y decida si el impacto del tamaño hace una diferencia real: cuántas otras columnas están en la tabla (es decir. cuánto impacto tiene el tamaño del GUID en las páginas de la hoja) y cuántas referencias lo están usando(es decir. cuántas otras tablas aumentarán debido al hecho de que necesitan almacenar una clave externa más grande).

Estoy llamando todos estos detalles en una especie de defensa improvisada de los GUID porque han estado recibiendo mucha mala prensa últimamente y algunos son inmerecidos. Tienen sus méritos y son indispensables en cualquier sistema distribuido (en el momento en que se habla de movimiento de datos, ya sea a través de replicación o marco de sincronización o lo que sea). He visto que se toman malas decisiones basadas en la mala reputación del GUID cuando eran rechazadas sin la debida consideración. Pero es cierto, si tiene que usar un GUID como clave agrupada, asegúrese de abordar el problema de aleatoriedad: utilice guid secuenciales cuando sea posible.

Y finalmente, para responder a tu pregunta: si no tienes una razón específica para usar GUIDs, usa INTs.

 49
Author: Remus Rusanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-24 20:03:37

El GUID va a ocupar más espacio y ser más lento que un int - incluso si usas la función newsequentialid (). Si va a hacer replicación o usar el marco de sincronización, prácticamente tiene que usar un guid.

 8
Author: JBrooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-20 04:11:21

Los INTs son 4 bytes, los BIGINTs ar 8 bytes, y los GUID son 16 bytes. Cuanto más espacio se requiera para representar los datos, más recursos se requerirán para procesarlos space espacio en disco, memoria, etc. Así que (a) son más lentos, pero (b) esto probablemente solo importa si el volumen es un problema (millones de filas o miles de transacciones en muy, muy poco tiempo.)

La ventaja de los GUID es que son (prácticamente) únicos a nivel mundial. Generar un guid utilizando el algoritmo adecuado (y SQL Server xxxx utilizará el algoritmo adecuado), y no hay dos guid nunca serán iguales no no importa cuántas computadoras tenga generándolas, no importa con qué frecuencia. (Esto no se aplica después de 72 años de uso forget Me olvido de los detalles.)

Si necesita identificadores únicos generados en varios servidores, los GUID pueden ser útiles. Si necesita mondo perforance y menos de 2 mil millones de valores, los ints probablemente estén bien. Por último, y quizás lo más importante, si sus datos tienen claves naturales, quédese con ellos y olvídese de la sustituta valor.

 6
Author: Philip Kelley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-20 04:19:55

Si usted positivamente, absolutamente tiene que tener un ID único, entonces GUID. Lo que significa que si alguna vez vas a fusionar, sincronizar, replicar, probablemente deberías usar un GUID.

Para cosas menos robustas, un int, debería ser suficiente dependiendo del tamaño de la tabla.

Como en la mayoría de los casos, la respuesta correcta es, depende.

 4
Author: Jack Marchetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-20 04:13:34

Utilícelos para la replicación, etc, no como claves principales.

Artículo de Kimberly L Tripp

  • Contra: Espacio, no estrictamente monótono, divisiones de página, marcadores/separaciones, etc
  • Para: er...
 3
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-20 04:28:52

Totalmente de acuerdo con JBrooks. Quiero decir que cuando su tabla es grande, y utiliza selects con JOINS, especialmente con tablas derivadas, el uso de GUID puede disminuir significativamente el rendimiento.

 2
Author: Alex_L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-20 04:17:59