Benchmarks, con honestidad
Mediana de N ejecuciones, ambos motores en caliente, sentencias preparadas en los dos lados, fsync a un disco real. Donde gana SQLite, lo enseñamos: la gráfica solo sirve si puedes fiarte de ella.
AMD Ryzen 7 3700X · 32 GiB · ext4 en SATA SSD · rustc 1.95.0 · SQLite 3.50.2 · un solo hilo
El marcador
Cada operación CRUD, como ratio de velocidad. A la derecha de la línea, Arkeion es más rápido; a la izquierda, lo es SQLite — y sí, el escaneo completo sigue siendo suyo.
Escrituras durables — el caso de uso central
Cada transacción confirmada paga el fsync. El commit append-only de Arkeion necesita un fdatasync; SQLite con synchronous=FULL paga dos. En disco real eso le da la vuelta a la mesa — y es lo que un motor auditado hace constantemente.
Las mismas garantías — la pelea justa
El marcador de arriba compite contra SQLite a secas. Pero Arkeion siempre lleva encima versionado, una cadena de hashes por commit, AS OF y verify(). Dale a SQLite el mismo trabajo — una tabla de histórico completa más una cadena de hashes por escritura, en una sola transacción — y la diferencia se agranda: este es el coste de un rastro de auditoría que SQLite tiene que añadir a posteriori y que Arkeion simplemente es.
La emulación en SQLite no reproduce ni el hash de contenido por commit ni una instantánea consultable, así que estos ratios son una cota inferior del coste real de igualar a Arkeion — que además trae AS OF, verify() y ramificación por encima.
Texto completo vs FTS5 — decisión dividida
El índice acabó siendo más pequeño que el de FTS5; la velocidad de construcción y de consulta siguen siendo terreno de FTS5. El intercambio compra algo que FTS5 no puede ofrecer: búsqueda versionada, demostrable y con viaje en el tiempo.
Posting lists comprimidas por prefijo — y, a diferencia de FTS5, cada posting está versionado, encadenado por hash y se puede buscar con MATCH … AS OF.
Búsqueda vectorial frente al resto del campo
SIFT 1M, 128 dimensiones, L2, ground truth real de top-100, consulta única con recall ≈ 0,99. Bajo carga concurrente sostiene ~700 qps en 8 núcleos; con recall ≈ 0,88 una consulta única hace ~590 qps.
14–21× más pequeño que los índices HNSW — cabe en una fracción de la RAM. Qdrant no reporta un tamaño de fichero comparable.
Paralela y en streaming (186 s → 64 s): el conjunto de datos nunca se materializa, así que escala a decenas de millones de filas en una máquina modesta.
Léelo con justicia: pgvector y Qdrant responden por TCP en localhost, así que un round trip de 0,05–0,2 ms infla sus latencias; y IVF escanea O(N) candidatos a recall fijo mientras que HNSW es O(log N), de modo que los motores de grafo dedicados se adelantan a partir de decenas de millones de vectores. HNSW queda excluido aquí por diseño: su grafo de acceso aleatorio es incompatible con el versionado copy-on-write y el viaje en el tiempo. Arkeion es el único fichero donde los vectores viven junto a SQL, texto completo, ramas y AS OF.
El precio de la durabilidad — v0.13 vs FAISS
La comparación más dura que podemos hacer: FAISS es la biblioteca ANN de referencia — RAM pura, sin durabilidad, sin transacciones, sin versionado, sin SQL. La misma máquina (una VM de 4 núcleos, así que las barras de arriba y las de abajo no son comparables entre sí), el mismo SIFT-1M, configuración idéntica en ambos lados: IVF de 1000 listas, PQ16, rerank exacto ×32. Recall@10 ≈ 0,99 en los dos, una consulta cada vez, un solo hilo.
A menos de 2× de la referencia en RAM — desde un fichero cifrado, versionado y durable. Antes de v0.13 la diferencia era de 7–10×. El modo por lotes de FAISS con 8 hilos alcanza ~5.000 qps frente a los 1.381 concurrentes de Arkeion.
Más pequeño en disco
El mismo conjunto de datos comprimible, escrito por los dos motores. Empaquetado de páginas más LZSS en Rust puro — Arkeion empezó este trabajo en 4,0 MB.
Ejecútalos tú mismo
# CRUD vs SQLite (apunta a un disco real, no a tmpfs)
ARKEION_BENCH_DIR=/path/on/real/disk cargo bench --features bench-sqlite
# espacio en disco
cargo run --release --example dbsize --features bench-sqliteUna lección que aprendimos por las malas: en tmpfs los fsync salen gratis y SQLite gana las escrituras durables. En un disco real la cosa se da la vuelta. Haz siempre los benchmarks en el disco en el que vas a ejecutar.