2009-07-20 8 views
30

Estoy creando una nueva base de datos para un sitio web usando SQL Server 2005 (posiblemente SQL Server 2008 en el futuro cercano). Como desarrollador de aplicaciones, he visto muchas bases de datos que usan un integer (o bigint, etc.) para un campo ID de una tabla que se usará para las relaciones. Pero últimamente también he visto bases de datos que usan el unique identifier (GUID) para un campo ID.INT vs identificador único para el campo ID en la base de datos

Mi pregunta es si uno tiene una ventaja sobre el otro? ¿Serán más rápidos los campos integer para consultar y unir, etc.?

ACTUALIZACIÓN: Para que quede claro, esto es para una clave principal en las tablas.

+5

Si el rendimiento de int frente a GUID es una importante fuente de preocupación para su cuello de botella de datos, considérese ** muy ** afortunado. La mayoría de las otras aplicaciones se topan con otros problemas más urgentes antes de que esto se convierta en un factor. –

+4

Además, los GUID pueden ser útiles al hacer declaraciones Insert, ya que puede crear su GUID en C# per se, luego simplemente haga la inserción y no tenga que esperar a que la base de datos le devuelva el nuevo identificador. –

+0

@Joe Chung No hay ningún problema de rendimiento en este momento, porque la base de datos todavía se está diseñando. – mkchandler

Respuesta

48

GUID son problemáticos como teclas agrupadas a causa de la alta aleatoriedad.Este tema fue abordado por Paul Randal en el último TechNet Magazine Q & Una columna: I'd like to use a GUID as the clustered index key, but the others are arguing that it can lead to performance issues with indexes. Is this true and, if so, can you explain why?

Ahora tener en cuenta que la discusión es específicamente sobre agrupados índices. Usted dice que quiere usar la columna como 'ID', no está claro si la quiere decir como clave agrupada o solo como clave principal. Por lo general, los dos se superponen, así que supongo que desea usarlo como índice agrupado. Las razones por las cuales esa es una mala elección se explican en el enlace al artículo que mencioné anteriormente.

Para í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. De nuevo, la aleatoriedad de los GUID introduce divisiones de páginas y fragmentación, ya sea en el nivel de índice no agrupado (un problema mucho más pequeño).

Hay muchas leyendas urbanas que rodean el uso de GUID que las condenan en función de su tamaño (16 bytes) en comparación con un int (4 bytes) y prometen una fatalidad de rendimiento horrible si se usan. Esto es ligeramente exagerado. Una clave de tamaño 16 puede ser una clave muy relevante aún, en un modelo de datos diseñado correctamente. Si bien es cierto que ser 4 veces más grande que un int resulta en más páginas no hojas de menor densidad en índices, esto no es una preocupación real para la gran mayoría de las tablas. La estructura b-tree es un árbol naturalmente equilibrado y la profundidad del recorrido del árbol es rara vez un problema, por lo que buscar un valor basado en la clave GUID en comparación con una clave INT es similar en rendimiento. Un recorrido de hoja de página (es decir, un escaneo de tabla) no mira las páginas que no son hojas, y el impacto del tamaño de GUID en el tamaño de página suele ser bastante pequeño, ya que el registro es significativamente mayor que los 12 bytes adicionales introducidos por el GUID. Así que tomaría el consejo de escuchar y decir basado en "16 bytes vs. 4" con un grano de sal bastante grande. Analice caso por caso y decida si el impacto del tamaño hace una diferencia real: cuántas columnas otras están en la tabla (es decir, cuánto impacto tiene el tamaño GUID en las páginas hoja) y cuántas referencias la 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 a todos estos detalles en una especie de defensa improvisada de GUID porque últimamente han recibido mucha mala prensa y algunos no se merecen. Tienen sus ventajas y son indispensables en cualquier sistema distribuido (en el momento en que se habla de movimiento de datos, ya sea a través de la replicación o el marco de sincronización o lo que sea). He visto malas decisiones basadas en la mala reputación del GUID cuando fueron rechazadas sin la consideración adecuada. Pero es cierto, si tiene que usar un GUID como clave agrupada, asegúrese de abordar el problema de la aleatoriedad: use las guías secuenciales cuando sea posible.

Y, por último, para responder a su pregunta: si usted no tiene una razón específicautilizar GUID, utilice intercepciones.

+0

Esto es para usar como clave principal en las tablas que mencioné. – mkchandler

+0

+1. una respuesta muy bien explicada y razonada. Buena esa. –

+1

Use NEWSEQUENTIALID() si tiene un índice agrupado. –

7

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

4

si positivamente, absolutamente tiene que tener una ID única, luego GUID. Es decir, si alguna vez vas a fusionar, sincronizar, replicar, probablemente deberías usar un GUID.

Para cosas menos robustas, una int, debería ser suficiente dependiendo de qué tan grande crecerá la tabla.

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

2

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.

6

INTs son 4 bytes, BIGINTs 8 bytes y GUIDS 16 bytes. Cuanto más espacio se necesita para representar los datos, más recursos se requieren para procesarlo: espacio en disco, memoria, etc. Por lo tanto, (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 (más o menos) globalmente únicos. Genere un guid utilizando el algoritmo adecuado (y SQL Server xxxx usará el algoritmo adecuado), y no habrá dos guías iguales, sin importar cuántas computadoras las haya generado, sin importar la frecuencia. (Esto no se aplica después de 72 años de uso. Olvidé los detalles).

Si necesita identificadores únicos generados en varios servidores, los GUID pueden ser útiles. Si necesita una perforación mondo y menos de 2 mil millones de valores, es probable que 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 los valores sustitutos.

+0

Philip, ¿qué es una clave natrual aquí? – johnny

+0

Las claves naturales son específicas de los datos que se modelan. La pregunta original no contiene detalles sobre estos datos, por lo que no podemos determinar qué podría ser aquí. –

3

Úselos para la replicación, etc., no como claves principales.

Kimberly L Tripp article

  • contra: Espacio, no estrictamente monótona, divisiones de página, marcador/RID etc
  • Por: er ...
Cuestiones relacionadas