Para el servidor SQL ¿es mejor usar un identificador único (GUID) o un bigint para una columna de identidad?¿Es mejor usar un identificador único (GUID) o un bigint para una columna de identidad?
Respuesta
Eso depende de lo que está haciendo:
- Si la velocidad es la principal preocupación entonces una llanura de edad
int
es probablemente lo suficientemente grande. - Si realmente va a tener más de 2 billones (con un B;)) registros, entonces use
bigint
o un guid secuencial. - Si necesita poder sincronizar fácilmente con registros creados de forma remota, entonces
Guid
es realmente genial.
actualización
Algunos adicional (menos evidente) señala el GUID:
- Pueden ser difíciles de índices, y que lleva al centro de rendimiento de la base
- Se puede utilizar guías secuenciales para recuperar parte del rendimiento de indexación, pero renunciar a algo de la aleatoriedad utilizada en el punto dos.
- Las guías pueden ser difíciles de depurar a mano (
where id='xxx-xxx-xxxxx'
), pero también se recupera a través de guías secuenciales (where id='xxx-xxx' + '123'
). - Por la misma razón, los Guids pueden hacer que los ataques de seguridad basados en ID sean más difíciles, pero no imposibles. (No puede simplemente escribir
'http://example.com?userid=xxxx'
y esperar obtener un resultado para la cuenta de otra persona).
¿No serían eso 2 mil millones de filas? INT está firmado. –
;) Bueno ... Voy a tomar mi -1 –
Incluso si el id es un entero, yo utilizo una columna GUID adicional para proporcionar una búsqueda para su uso con las direcciones URL ... O eso, o un parámetro adicional para correlacionar prevenir ese tipo de ataque. –
En general lo recomiendo un BIGINT
durante un GUID
(como guids son grandes y lento), pero la pregunta es, ¿Por lo menos necesita eso? (Es decir, ¿está haciendo la replicación?) Si está esperando menos de 2 mil millones de filas, la tradicional INT
estará bien.
Realmente depende de si la información entrante es de alguna manera secuencial o no. Recomiendo encarecidamente a los usuarios que un GUID sea mejor. Sin embargo, para datos secuenciales, como pedidos u otras cosas que deben ser fácilmente clasificables, un bigint puede ser una mejor solución, ya que será indexado y proporcionará una clasificación rápida sin el costo de otro índice.
Puede usar NEWSEQUENTIALID() para crear un campo GUID secuencial que optimice el índice y mejore el rendimiento. – Craig
Depende no lo que necesita. DB El rendimiento ganaría a partir del número entero mientras que los GUID son útiles para replicación y no es necesario escuchar de DB qué identidad se ha creado, es decir, el código podría crear una identidad GUID antes de insertar en la fila.
Realmente depende de si esperas tener una réplica en la imagen. La replicación requiere un UUID de fila, por lo que si planea hacer eso, puede hacerlo desde el principio.
Si planea utilizar la duplicación de mezcla, un ROWGUIDCOL
es beneficioso para el rendimiento (see here for info). De lo contrario, necesitamos más información acerca de cuál es su definición de "mejor"; mejor para qué?
¿Está haciendo la replicación o tiene vendedores que ejecutan databses desconectados que deben combinarse, use un GUID? De lo contrario, iría por un int o bigint. Son mucho más fáciles de tratar a largo plazo.
Jeff Atwood ya ha respondido todo in this comprehensive post.
A menos que tenga una necesidad real de un GUID, como poder generar claves en cualquier lugar y no solo en el servidor, entonces me quedaré con el uso de claves basadas en INTEGER. Los GUID son caros de crear y hacen que sea más difícil mirar los datos. Además, ¿alguna vez ha tratado de escribir un GUID en una consulta SQL? ¡Es doloroso!
Nadie intenta escribir un GUID. Estoy seguro de que copiar/pegar se inventó el día después de que se inventaran GUID ;-) – Craig
estoy con Andrew Rollings.
Ahora se podría argumentar la eficiencia del espacio. Un int es lo que, 8 bytes max? Un guid va a ser mucho más largo.
Pero tengo dos razones principales de preferencia: legibilidad y tiempo de acceso. Los números son más fáciles para mí que los GUID (ya que siempre puedo encontrar el registro siguiente/anterior fácilmente).
En cuanto al tiempo de acceso, tenga en cuenta que algunos DB pueden comenzar a tener GRANDES problemas con los GUID. Sé que este es el caso con MySQL (MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance). Esto puede no ser un gran problema con SQL Server, pero es algo de lo que hay que tener cuidado.
diría palo con INT o BIGINT. La única vez que pensaría que querría el GUID es cuando va a darlos y no quiere que las personas puedan adivinar las ID de otros registros por razones de seguridad.
No puede haber unos cuantos aspectos o requisitos para utilizar GUID.
- Si la clave principal es de cualquier tipo numérico (Int, Bigint o cualquier otro), entonces o bien que necesita para hacer que la columna de identidad, o es necesario comprobar el último valor guardado en la tabla.
- Y en ese caso, si el registro de la tabla externa se guarda como transacción, entonces sería difícil obtener el último valor de identidad de la clave primaria. Al igual que si se utiliza IDENT_CURRENT, se volverá a ejecutar el efecto mientras se guarda el registro en clave externa.
- Entonces, en caso de guardar los registros en cuanto a las transacciones, entonces sería conveniente generar primero Guid para la clave principal, y luego guardar la clave generada (Guid) en la (s) tabla (s) primaria (s) y extranjera (s).
- 1. ¿El hash de un GUID es único?
- 2. Cuál es el identificador único para un elemento DOM/nodo
- 3. ¿Qué es un buen identificador de PC único?
- 4. ¿Crees un identificador único para dispositivos iOS?
- 5. Identificador único para NSManagedObject
- 6. identificador singular o plural para un diccionario?
- 7. GUID vs INT IDENTIDAD
- 8. localmente único identificador
- 9. Identificador único de una Mac?
- 10. ¿Existe un identificador único de computadora que se pueda usar confiablemente incluso en una máquina virtual?
- 11. Identificador único para una aplicación de iPhone
- 12. Generando un identificador global único en Java
- 13. Identificador único para elementos HTML
- 14. ¿Es seguro asumir que un GUID siempre será único?
- 15. Uso del tipo de columna SQL de identificador único con el marco Entidad
- 16. Identificador único para teléfono Android
- 17. ¿Cómo obtener un identificador de JVM único?
- 18. DB: ¿Para utilizar la columna de identidad o no?
- 19. Rendimiento MySQL del campo varchar único frente a bigint único
- 20. ¿Es mejor usar un calificador no codicioso o un lookahead?
- 21. Vista de búsqueda fluida NHibernate sin identificador único
- 22. En SQL Server, ¿debería crear un índice para una columna de identidad o se crea automáticamente?
- 23. Cómo validar GUID es un GUID
- 24. identificador único de php para clientes
- 25. ¿Cómo asegurarnos de que un guid generado sea único globalmente?
- 26. MySQL identificador único o valor de id combinado
- 27. ¿La manera correcta de tener un identificador único en Python?
- 28. Método para alterar clave principal de GUID a BigInt en tablas relacionadas con SQL Server
- 29. Obtenga el identificador único de un subproceso en Java 1.4
- 30. qué tipo de identificación de registro de base de datos usar: ¿largo o guid?
¿Quisces decir clave primaria? No puede tener una columna de identidad GUID. –