No hay nada malo con GUID como claves y clústeres en un sistema OLTP (a menos que tenga MUCHOS índices en la tabla que sufran el aumento del tamaño del clúster). De hecho, son mucho más escalables que las columnas IDENTITY.
Existe una creencia generalizada de que los GUID son un gran problema en SQL Server; en gran medida, esto es simplemente incorrecto. De hecho, el GUID puede ser significativamente más escalable en cajas con más de aproximadamente 8 núcleos:
Lo siento, pero sus desarrolladores tienen razón. Preocúpese por otras cosas antes de preocuparse por GUID.
Ah, y finalmente: ¿por qué quieres un índice de clúster en primer lugar? Si su preocupación es un sistema OLTP con muchos índices pequeños, probablemente sea mejor con un montón.
Consideremos ahora qué fragmentación (que introducirá el GUID) hace a sus lecturas. Hay tres problemas principales con la fragmentación:
- Las divisiones de página cuestan E / S de disco
- Las páginas a la mitad no son tan eficientes en memoria como las páginas completas
- Hace que las páginas se almacenen fuera de servicio, lo que hace menos probable la E / S secuencial
Dado que su preocupación en la pregunta es sobre la escalabilidad, que podemos definir como "Agregar más hardware hace que el sistema vaya más rápido", estos son sus problemas menores. Para abordar cada uno a su vez
Anuncio 1) Si desea escalar, puede comprar E / S. Incluso un SSD Samsung / Intel 512GB barato (a unos pocos USD / GB) te dará más de 100K IOPS. No lo consumirá pronto en un sistema de 2 sockets. Y si te encuentras con eso, compra uno más y listo
Anuncio 2) Si elimina en su tabla, tendrá páginas semillenas de todos modos. E incluso si no lo hace, la memoria es barata y para todos menos los sistemas OLTP más grandes: los datos activos deberían encajar allí. Buscar empacar más datos en páginas es una suboptimización cuando busca escala.
Anuncio 3) Una tabla construida a partir de datos divididos en páginas con frecuencia altamente fragmentados realiza E / S aleatorias exactamente a la misma velocidad que las tablas llenas secuencialmente
Con respecto a la unión, hay dos tipos principales de unión que probablemente verá en una OLTP como la carga de trabajo: Hash y loop. Veamos cada uno a su vez:
Hash join: una combinación hash supone que la tabla pequeña se escanea y la más grande normalmente se busca. Es muy probable que las tablas pequeñas estén en la memoria, por lo que la E / S no es su preocupación aquí. Ya hemos mencionado el hecho de que las búsquedas tienen el mismo costo en un índice fragmentado que en un índice no fragmentado.
Unión de bucle: se buscará la tabla externa. Mismo costo
Es posible que también tenga muchos escaneos de tablas incorrectos, pero luego GUID nuevamente no es su preocupación, la indexación adecuada sí lo es.
Ahora, puede tener algunos escaneos de rango legítimos (especialmente cuando se une a claves externas) y en este caso, los datos fragmentados están menos "empaquetados" en comparación con los datos no fragmentados. Pero consideremos qué combinaciones es probable que vea en datos bien indexados de 3NF:
Una combinación de una tabla que tiene una referencia de clave externa a la clave principal de la tabla a la que hace referencia
Al revés
Anuncio 1) En este caso, irá por una sola búsqueda a la clave principal: unir n a 1. Fragmentación o no, el mismo costo (una búsqueda)
Anuncio 2) En este caso, se está uniendo a la misma clave, pero puede recuperar más de una fila (búsqueda de rango). La unión en este caso es de 1 a n. Sin embargo, en la tabla extranjera que busca, está buscando la misma clave, que es probable que esté en la misma página en un índice fragmentado que en una no fragmentada.
Considere esas claves foráneas por un momento. Incluso si hubiera colocado "perfectamente" secuencialmente nuestras claves principales, cualquier cosa que apunte a esa clave seguirá siendo no secuencial.
Por supuesto, es posible que se esté ejecutando en una máquina virtual en alguna SAN en algún banco que tenga poco dinero y mucho proceso. Entonces todos estos consejos se perderán. Pero si ese es su mundo, la escalabilidad probablemente no sea lo que está buscando: busca rendimiento y alta velocidad / costo, que son dos cosas diferentes.