En general, los algoritmos HiLo mapean dos enteros a una ID entera. Garantiza que el par de números será único por base de datos. Normalmente, el siguiente paso es garantizar que un par único de números se correlacione con una ID entera única.
Una buena explicación de cómo funciona NiHo conceptualmente se da en this previous SO answer
Cambio de la max_lo conservará la propiedad de que su par de números será único. Sin embargo, ¿se asegurará de que la identificación mapeada sea única y libre de colisiones?
Veamos la implementación de HiLo de Hibernate. El algoritmo que aparecen a utilizar (a partir de lo que he reunido) es: (y que podría estar fuera por un detalle técnico)
h = high sequence (starting at 0)
l_size = size of low block
l = low sequence (starting at 1)
ID = h*l_size + l
tanto, si su baja bloque es, digamos, 100, los bloques de identificación reservados iría 1-100, 101-200, 201-300, 301-400 ...
Su secuencia alta ahora es 3. Ahora, ¿qué pasaría si de repente cambió su l_size a 10? Su siguiente bloque, su nivel alto se incrementa, y obtendría 4*10+1 = 41
Vaya. Este nuevo valor definitivamente se encuentra dentro del "bloque reservado" de 1-100
. Una persona con una secuencia alta de 0 pensaría: "Bueno, tengo el rango 1-100
reservado solo para mí, así que dejaré uno en 41
, porque sé que es seguro".
Definitivamente hay una probabilidad muy, muy alta de colisión cuando bajando su l_max.
¿Qué pasa con el caso opuesto, criarlo?
Volviendo a nuestro ejemplo, aumentemos nuestro l_size a 500, convirtiendo la siguiente clave en 4*500+1 = 2001
, reservando el rango 2001-2501.
Parece que se evitará una colisión, en esta implementación particular de HiLo, cuando aumente su l_max.
Por supuesto, debe realizar algunas pruebas por su cuenta para asegurarse de que esta es la implementación real, o cerca de ella. Una forma sería establecer l_max en 100 y encontrar las primeras pocas claves, luego configurarlo en 500 y encontrar el siguiente.Si hay un gran salto como se menciona aquí, podría estar seguro.
Sin embargo, no estoy de ninguna manera sugiriendo que es una buena práctica aumentar su l_max en una base de datos existente.
Use su propio criterio; el algoritmo HiLo no es exactamente uno hecho con la variable l_max en mente, y sus resultados pueden ser impredecibles al final dependiendo de su implementación exacta. Tal vez alguien que haya tenido experiencia levantando su l_max y encontrando problemas puede probar que este conteo sea correcto.
Por lo tanto, en conclusión, a pesar de que, en teoría, la implementación HiLo de Hibernate probablemente evite colisiones cuando se sube l_max, probablemente todavía no sea una buena práctica. Debería codificar como si l_max no fuera a cambiar con el tiempo.
Pero si te sientes con suerte ...
Muy completo, gracias! –