2009-08-09 12 views
7

¿Cuáles son las desventajas de usar GUID? ¿Por qué no usarlos siempre por defecto?¿Por qué no siempre usar GUID en lugar de ID enteros?

+0

@Jonathan: Bueno, se necesitan 5, ¿eh? – Eric

+0

¿De qué estás hablando? – Mitch

+0

Su pregunta ha sido votada para que la cierre alguien de la comunidad. No te preocupes, se necesitan 5 personas para votar una pregunta cerrada. –

Respuesta

15

Los enteros se unen mucho más rápido, por ejemplo. Esto es especialmente importante cuando se trata de millones de filas.

Para dos, los GUID ocupan más espacio que los enteros. De nuevo, muy importante cuando se trata de millones de filas.

En tercer lugar, los GUID a veces toman diferentes formatos que pueden causar interrupciones en las aplicaciones, etc. Un entero es un número entero, de principio a fin.

Se puede encontrar un aspecto más en profundidad here, y en Jeff's blog.

+1

Tarde en el juego que sé. Todavía vale la pena señalar que un GUID está guardado de 16 bytes o es incorrecto. Un entero en SQL Server tiene 4 bytes, pero no todos los enteros. Esto varía una cantidad justa por idioma y plataforma. –

9
  1. Los GUID son cuatro veces más grandes que un int, y dos veces más grandes que un bigint.

  2. Los GUID son realmente difíciles de observar si está intentando solucionar problemas de tablas.

1

GUID son grandes y lentos en comparación con enteros - por lo que usarlos cuando se necesitan, evitan ellos cuando no son necesarios, es tan simple como eso!

4

GUIDS puede simplificar la generación de claves con anticipación, o generar claves fuera de línea, o en un clúster, sin riesgo de colisión. También puede haber un pequeño beneficio de seguridad, con todas las claves siendo indescifrable.

La desventaja es que es más difícil de leer/escribir y en muchas de sus tablas puede que luego se dé cuenta de la necesidad de volver y generar claves para todos. También distribuirán uniformemente sus registros en una tabla, lo que puede hacer que sea más lento consultar múltiples registros que se insertaron más o menos al mismo tiempo que tener una clave de autonumeración donde los registros estén en orden de tiempo insertado.

0

El mayor golpe de rendimiento que verá con los GUID ya que una clave principal/en clúster es la inserción de registros en tablas grandes. Puede ser una tarea pesada para indexar desde su clave caerá en algún punto intermedio

11

Los GUID son geniales desde el punto de vista de un programador: tienen la garantía de ser (casi) únicos, así que ¿por qué no usarlos en todas partes?

Si se mira desde la perspectiva de DBA y desde el punto de vista de la base de datos, al menos para SQL Server, hay algunas cosas a considerar:

  • GUID como clave primaria (que es responsable de identificar de forma única una sola fila en su tabla) podría estar bien, después de todo, son únicos, ¿verdad?
  • sin embargo, SQL Server también tiene el concepto de la clave de agrupamiento, que ordena físicamente los datos en su tabla; Si no sabe nada de esto y no hace nada explícitamente, su clave principal se convierte en su clave de agrupamiento.

Kimberly Tripp - experto mundialmente conocido en la indexación de SQL Server y el rendimiento - tiene un gran número de publicaciones en el blog acerca de por qué un GUID como clave de agrupación es una muy mala idea - echa un vistazo a su blog on indexes.

En particular, sus mejores prácticas para una clave de agrupación son:

  • estrecha
  • estática
  • única
  • cada vez mayor

GUID son normalmente estática y única - pero no son ni estrechos (16 byte vs. 4 byte para INT) ni nunca aumentan. Debido a su naturaleza, son únicos y (pseudo) aleatorios.

La parte estrecha es importante porque la clave de agrupamiento se agregará a todas y cada una de las páginas de índice para cada índice no agrupado de su tabla, y si tiene algunas de ellas, y unas pocas filas en su tabla, esto equivale a una pérdida masiva de espacio, y no solo en su disco, sino también en la RAM de su SQL Server.

La parte cada vez mayor es importante, porque la aleatoriedad de los GUID provoca una gran fragmentación en los índices, lo que afecta negativamente a su rendimiento. Incluso el newsequentialid() de SQL Server 2005 y versiones posteriores en realidad no crean GUID secuenciales por todos lados: son secuenciales por un tiempo y luego hay un salto de nuevo, lo que provoca fragmentación (menos que GUID totalmente aleatorios, pero aún así).

Así que en general, si realmente está preocupado con el rendimiento de su servidor SQL, using GUIDs as a clustering key es una muy mala idea: use INT IDENTITY() en su lugar, posiblemente usando un GUID como la clave principal (no agrupada) si realmente tiene que hacerlo

Marc

+1

Acepto que nunca se debe usar un GUID como clave principal. Sin embargo, los GUID son esenciales y deben usarse cuando los objetos de entidad (en el mismo dominio) se diseminan a través de múltiples instancias. –

0

El uso de GUID como clave primaria el tiempo dará lugar a su base de datos de estrellarse debido a que la unidad se vuelve demasiado fragmentado. Esta es una condición conocida como golpeteo.

1

Esta respuesta NO excluye la idea de utilizar INT como clave principal. Está destinado principalmente a señalar CUÁNDO es útil una guía.

Aquí hay una gran (corto) ARTICULO:
http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html

Explicado ...
utilizo guids DB para cualquier entidad de tipo (común) que puede necesitar ser exportado o compartida con otro Instancia de DB De esta forma, tengo un marcador de ADN (es decir, el guid) que se puede utilizar para diferenciar entre objetos "similares" del mismo tipo de entidad.

Por ejemplo, imaginemos que dos instancias de base de datos tienen una tabla llamada PROJECT. Si los dos proyectos comparten el mismo nombre o número, es difícil distinguir cuál es cuál. Sin embargo, al usar GUID puedes distinguir fácilmente entre 2 proyectos y de dónde vienen ... incluso cuando tienen muchos valores similares entre ellos. Esto parece imposible ... pero en realidad puede ocurrir y sucede.

Cuestiones relacionadas