Las bases de datos basadas en árboles B+, como SQLite, están diseñadas para almacenar datos de forma ordenada. Cuando se insertan identificadores o claves aleatorias, esa organización se rompe: las páginas se reescriben, se producen divisiones de página y el árbol se reequilibra constantemente, lo que reduce el rendimiento de escritura.
Una forma sencilla de mitigar este problema consiste en ordenar los datos antes de insertarlos, aprovechando que muchas operaciones ya se realizan por lotes. El autor trabaja con identificadores de 160 bits (20 bytes) generados mediante SecureRandom, habituales en tokens de sesión o claves primarias aleatorias. Para compararlos de forma eficiente, convierte los primeros 8 bytes en un entero largo sin signo, suficiente para obtener un orden estable sin recorrer todo el array. Esta comparación imita la que SQLite realiza internamente con memcmp sobre valores BLOB.
La prueba compara la inserción de un millón de filas por iteración en una tabla WITHOUT ROWID con clave primaria BLOB. Sin ordenar, insertar diez millones de registros lleva alrededor de 11.103 ms, con un rendimiento inicial cercano a 400.000 inserciones por segundo que decae a unas 100.000 al final. Al pre-ordenar cada lote antes de insertarlo, el mismo volumen se completa en 3.835 ms, una mejora de entre 2 y 3 veces. El cuello de botella deja de estar en las escrituras aleatorias y pasa al propio proceso de ordenación.
La conclusión práctica es clara: cuando se trabaja con datos desordenados y se insertan en lotes, dedicar unos milisegundos a ordenarlos puede traducirse en un ahorro sustancial del tiempo total de escritura, sin alterar el esquema ni la estructura de la tabla.
