Uso de GUID como claves principales / índices agrupados
-
16-09-2019 - |
Pregunta
Estoy bastante bien versado en performace servidor SQL pero constanly que argumentar por la idea de que los GUID deben utilizarse como el tipo predeterminado para Clusterd claves principales.
Si se asume que la tabla tiene una cantidad bastante baja de insertos por día (5.000 +/- filas / día), qué tipo de problemas performace podríamos ejecutar en? ¿Cómo van a divisiones de página afectar a nuestra búsqueda de la rentabilidad? ¿Con qué frecuencia debería indexar (o debería desfragmentar)? ¿Qué debería establecer los factores de relleno a (100, 90, 80, etc.)?
¿Qué pasa si insertaban 1.000.000 de filas por día?
Me disculpo beforhand para todas las preguntas, pero estoy buscando a conseguir un poco de copia de seguridad para no usar GUID como nuestro defecto para PK. Sin embargo, estoy totalmente abierto a tener mi mente cambió por el conocimiento overwehlming de la base de usuarios stackoverflow.
Solución
Si usted está haciendo cualquier tipo de volumen, los GUID son extremadamente malo como PK mal a menos que utilice GUID secuenciales , por las razones exactas que usted describe. Página fragmentación es severa :
Average Average
Fragmentation Fragment Fragment Page Average
Type in Percent Count Size Count Space Used
id 4.35 7 16.43 115 99.89
newidguid 98.77 162 1 162 70.90
newsequentualid 4.35 7 16.43 115 99.89
Y como esta comparación entre GUID y enteros muestra:
Test1 causado una enorme cantidad de divisiones de página, y tenía una densidad de escaneado alrededor 12% cuando me encontré con un DBCC SHOWCONTIG después de que los insertos se habían completado. La tabla Test2 tenía una densidad de exploración alrededor de 98%
Si su volumen es muy bajo, sin embargo, simplemente no importa mucho.
Si realmente necesita una identificación única a nivel mundial, pero tienen alto volumen (y no se puede utilizar identificaciones consecutivas), sólo hay que poner los GUID en una columna indexada.
Otros consejos
Los inconvenientes del uso de GUID como clave principal:
- No hay pedido significativa, significa la indexación no da aumento de rendimiento como lo hace con un entero.
- tamaño de un GUID de 16 bytes, frente a 2, 4 u 8 bytes para un entero.
- muy difícil para los seres humanos a tener en cuenta, por lo que no es bueno como un identificador de referencia.
Ventajas:
- Permita que no adivinar las claves primarias, por tanto, que pueden ser menos peligroso cuando se muestra en una cadena de consulta la página web o en la aplicación.
- Útil en bases de datos que no proporcionan un tipo de datos incremento automático o identidad.
- útil cuando se necesita para unir datos entre dos fuentes de datos dispares a través de plataformas o entornos.
pensé que la decisión en cuanto a si se debe utilizar GUID era bastante simple, pero tal vez soy consciente de otras cuestiones.
la mínima insertos tales por día, dudo que la división de la página debe ser un factor significativo. La verdadera pregunta es ¿cómo se compara 5000 con el número de filas existentes, ya que esto sería la principal información necesaria para decidir sobre un factor de llenado inicial apropiada a deffer divisiones.
Una vez dicho esto, yo personalmente no soy un gran fan de los GUID. Entiendo que pueden servir bien en algunos contextos, pero en muchos casos no son más que "en el camino" [de la eficiencia, de la facilidad de uso, de ...]
Encuentro las siguientes preguntas útil para reducir el GUID de decidir si se debe utilizar o no.
- ¿El PK ser compartida / publicado? (Es decir Va a ser utilizado más allá de su uso interno dentro de SQL, se necesitan aplicaciones de estas teclas de una manera algo persistente? ¿Se usuarios de alguna manera ven estas llaves?
- Podría ser utilizado para ayudar a la PK combinar diferentes fuentes de datos?
- ¿La mesa tiene una -posiblemente con compuesto de primaria a partir de la columna (s) en los datos? ¿Cuál es el tamaño de este posible esta tecla
- ¿Cómo se clasifican las claves primarias? Si compuesto, son las primeras columnas Selectivo?
El uso de un GUID (a menos que sea un GUID secuencial) como un índice agrupado se va a matar rendimiento de las inserciones. Puesto que el diseño de la mesa física está alineado de acuerdo con el índice agrupado, utilizando un GUID que tiene un orden de secuenciación aleatoria causará grave fragmentación tabla. Si desea utilizar un GUID como un índice PK / clúster debe ser un GUID secuenciales usando la función newsequentialid () en SQL Server. Esto garantizará que los GUID generados se ordenan secuencialmente y evitar la fragmentación.