Pregunta

Hasta ahora i He estado usando el C # "Guid = Guid.NewGuid ();" método para generar un identificador único que se puede almacenar como el campo ID en algunos de mis tablas de bases de datos SQL Server utilizando LINQ a SQL. He sido informado de que por razones de indexación, utilizando un GUID es una mala idea y que debería usar un incremento automático de largo en su lugar. ¿El uso de una velocidad mucho mis transacciones de bases de datos? Si es así, ¿cómo hago para la generación de identificación únicos que son de tipo Long?

Saludos,

¿Fue útil?

Solución

Ambos tienen pros y contras, que depende totalmente de la forma de usarlos lo que importa.

De buenas a primeras, si necesita identificadores que pueden trabajar a través de varias bases de datos, es necesario GUID. Hay algunos trucos con larga (la asignación manual de cada base de datos una semilla / incremento diferente), pero éstos no se escalan bien.

En cuanto a la indexación va, Long dará un rendimiento mucho mejor inserción si está agrupado el índice (mediante claves primarias por defecto se agrupan, pero esto puede ser modificado para su mesa), ya que la mesa no tiene que ser reorganizado después de cada insertar.

En lo que se refiere inserciones concurrentes sin embargo, Long (identidad) columnas será más lento que GUID - generación de columnas de identidad requiere una serie de bloqueos exclusivos para asegurarse de que sólo una fila obtiene el siguiente número secuencial. En un entorno con muchos usuarios insertar tantas filas todo el tiempo, esto puede ser un impacto en el rendimiento. generación de GUID en esta situación es más rápido.

De almacenamiento inteligente, un GUID ocupa el doble de espacio de un largo (8 bytes vs 16). Sin embargo, depende del tamaño total de su fila 8 bytes si se va a hacer una diferencia notable en el número de registros caber en una hoja, y por lo tanto el número de hojas sacadas de disco durante un promedio de peticiones.

Otros consejos

Una larga (int grande en SQL Server) es de 8 bytes y un GUID es de 16 bytes, por lo que están reduciendo a la mitad el número de bytes que el servidor SQL tiene que comparar cuando se hace una mirada hacia arriba.

Para la generación de una identidad uso a largo (1,1) cuando se crea el campo en la base de datos.

usando Así que, o crear la tabla o alterar tabla:

Field_NAME BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1)

Vea los comentarios para su publicación LINQ a SQL

La "Reina de Indexación" - Kim Tripp - básicamente lo dice todo en su indexación de publicaciones en el blog:

Básicamente, sus mejores prácticas son: una clave de agrupación óptima debe ser:

  • único
  • pequeño
  • estable (sin cambiar nunca)
  • cada vez mayor

El GUID violan el "pequeño" y "cada vez mayor" y por lo tanto no son óptimas.

PLUS: todas sus claves de agrupación se añadirán a cada entrada individual en cada uno y cada índice no agrupado único (como las operaciones de búsqueda en realidad encontrar el registro en la base de datos), por lo que quieres que sean tan pequeños como posible (INT = 4 byte vs. GUID = 16 byte). Si usted tiene cientos de millones de filas y varios índices no agrupados en clúster, la elección de un INT BIGINT o más de un GUID puede hacer una diferencia importante -. Incluso sólo en cuanto al espacio

Marc

Utilice guids cuando es necesario considerar la importación / exportación a múltiples bases de datos. Guids suelen ser más fáciles de usar que las columnas que especifican el atributo de identidad cuando se trabaja con un conjunto de datos de múltiples relaciones del niño. esto es porque se puede generar de forma aleatoria GUID en el código en un estado desconectado de la base de datos, y luego presentar todos los cambios a la vez. Cuando GUID se generan correctamente, son insainely difícil de duplicar por casualidad. Con las columnas de identidad, que a menudo tienen que hacer una inserción intial de una fila primaria y consulta por su nueva identidad antes de añadir los datos del niño. A continuación, tiene que actualizar todos los registros secundarios con la nueva identidad de los padres antes de comprometerse a la base de datos. Lo mismo ocurre con los nietos y así sucesivamente en la jerarquía. Se acumula a una gran cantidad de trabajo que parece innecesario y mundanas. Usted puede hacer algo similar al GUID por comming con números enteros aleatorios sin la especificación IDENTIDAD, pero la posibilidad de colisión aumenta considerablemente a medida que inserta más registros en el tiempo. (Guid.NewGuid () es similar a un Int128 azar - que no existe todavía).

utilizo Byte (TinyInt), Int16 (SmallInt), Int32 / UInt16 (Int), Int64 / UInt32 (Bigint) para las pequeñas listas de búsqueda que no cambian o los datos que no se replica entre múltiples bases de datos. (permisos, configuración de la aplicación, los nombres de colores, etc.)

Me imagino la indexación toma el tiempo justo para consultar en contra sin importar si usted está utilizando un GUID o mucho. Por lo general hay otros campos en las tablas que están indexados que son mayores que 128 bits de todos modos (nombres de usuario en una tabla de usuario, por ejemplo). La diferencia entre el GUID y enteros es el tamaño del índice en la memoria, así como el tiempo y poblar la reconstrucción de índices. La mayoría de las transacciones de bases de datos es a menudo leyendo. La escritura es mínima. Concentrarse en la optimización de la lectura de la primera base de datos, ya que son generalmente hechas de tablas combinadas que no fueron bien optimizado, paginación inadecuada o índices que faltan.

Como con cualquier cosa, lo mejor que puede hacer es probar su punto. crear una base de datos de prueba con dos tablas. Uno con una clave principal de enteros / anhela, y el otro con un GUID. Rellenar cada uno con N-Million filas. MONITER el rendimiento de cada uno durante las operaciones CRUD (crear, leer, actualizar, eliminar). Usted puede descubrir que tiene un impacto en el rendimiento, pero insignificante.

Los servidores funcionan a menudo en las cajas sin depurar ambientes y otras aplicaciones ocupar la CPU, memoria y E / S de disco duro (especialmente con RAID). Un entorno de desarrollo sólo le da una idea del rendimiento.

Se puede debatir GUID o identidad de todo el día. Yo prefiero la base de datos para generar el valor único con una identidad. Si combina datos de múltiples bases de datos, añadir otra columna (para identificar la base de datos fuente, posiblemente un tinyint o SMALLINT) y forman una clave principal compuesta.

Si tienes que ir con una identidad, asegúrese de escoger el tipo de datos correcto, basado en el número de llaves que se espera que va a generar:

bigint - 8 Bytes - max positive value: 9,223,372,036,854,775,807  
int    - 4 Bytes - max positive value:             2,147,483,647

Nota "número de claves que se espera" es diferente al número de filas. Si se agrega filas y mantener sobre todo, es posible que un INT es suficiente con más de 2 mil millones claves únicas. Apuesto a su mesa no conseguirá tan grande. Sin embargo, si usted tiene una mesa de alto volumen donde guardas añadir y eliminar filas, la fila recuento puede ser baja, pero vas a ir a través de teclas rápidas. Usted debe hacer algunos cálculos para ver cómo iniciar la sesión que se necesitaría para ir a través de las intercepciones de 2 mil millones de claves. Si no va a utilizar para arriba en el corto plazo ir con INT, de lo contrario el doble del tamaño de la clave e ir con BIGINT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top