2010-08-19 16 views
14

Estoy trabajando con una base de datos que almacena legado valores GUID como un tipo VARCHAR (36) de datos:GUID: varchar (36) frente a uniqueidentifier

CREATE TABLE T_Rows (
    RowID VARCHAR(36) NOT NULL PRIMARY KEY, 
    RowValue INT   NOT NULL 
) 

INSERT T_Rows (RowID, RowValue) VALUES (NEWID(), 1) 

Yo asumiría que almacenar un GUID uniqueidentifier como lo haría ser preferible ya que solo tiene 16 bytes de tamaño en comparación con 36.

¿Tiene alguna ventaja guardar un GUID como varchar?

+0

¡Lo dudo seriamente! –

Respuesta

12

Quizás solo el hecho de que pueda 'leerlos' desde una instrucción SELECT (aunque no creo que sea particularmente útil ya que puede usar una función en una selección para hacer que los identificadores únicos se puedan visualizar).

Si la tabla es grande, ahorrar 20 bytes por fila es considerable.

+6

Ganará más que eso, este es el PK, por lo que si hay mesas secundarias, también tendrán ahorros en los costos. Si hay otros índices en la tabla y este es el índice agrupado, el tamaño de todos los índices (y posiblemente la velocidad, pero la prueba es segura) será menor. Of coursre e INT es mejor como PK por muchas razones, pero ese es un gran cambio en una base de datos heredada. – HLGEM

+2

¿por qué entidad-framework usa 'nvarchar (128)' para sus GUID entonces? ¿Puedo cambiar eso por 'uniqueidentifier'? – Zapnologica

0

Absolutamente no, ya que estoy seguro de que sabe que las bases de datos heredadas a menudo adolecen de defectos de diseño: P Dado que el GUID tiene 16 bytes, podría ocupar también 16 bytes en la base de datos. Obtendrá esos 20 bytes por entrada

1

Creo que se agregó UNIQUEIDENTIFIER en SQL Server 2000, por lo que es posible que esta aplicación se haya escrito originalmente para SQL Server 7, que no la admite. Pero eso es sólo una suposición, por supuesto ...

4

Me gustaría ir con uniqueidentifier por muchas razones, tales como,

que tendrá menos espacio; es único, por lo que no se puede duplicar. Es mucho mejor para comparaciones y problemas relacionados con el rendimiento, así como para obtener un valor predeterminado único, etc.

Usaría el identificador único a menos que necesite usar varchar por una razón muy específica.

+1

Si puedo agregar. También es mejor cuando se trabaja con bases de datos federadas. Me gustaría ir guids, como se dijo. – code5

2

Si su base de datos es Oracle, el rendimiento de los índices de datos sin formato en la versión anterior de Oracle (9) fue mucho, mucho más bajo que la indexación de un campo varchar (36). Afortunadamente esto ha cambiado en Oracle 10 y 11.

Cuestiones relacionadas