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.

0.5×paridadSELECT by PK3.13×DELETE durable2.5×INSERT durable2.42×UPDATE durable2.06×SELECT by index1.98×API de carga masiva1.17×Inserción por lotes (SQL)1.02×Escaneo completo0.48×
Cada punto lleva el color del ganador. Pasa el ratón por encima para ver las cifras; el eje es logarítmico, así que 2× y ½× quedan a la misma distancia de la paridad.

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.

INSERT, durable 2.42×× 656 vs 271 ops/s
UPDATE, durable 2.06×× 572 vs 278 ops/s
DELETE, durable 2.50×× 657 vs 263 ops/s

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.

Inserción durable, mismas garantías, durable 2.51×× 656 vs 261 ops/s
Inserción por lotes, mismas garantías, durable 2.19×× 1.99M vs 906k ops/s

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.

Tamaño del índice, mismo corpus
Arkeion
Arkeion: 26.2 MB
26.2 MB
SQLite
SQLite: 27.2 MB
27.2 MB

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.

Construcción del índice (5,5M postings) FTS5 18× más rápido
Arkeion
Arkeion: 11 s
11 s
SQLite
SQLite: 0.6 s
0.6 s
Consulta, término común FTS5 2,3× más rápido
Arkeion
Arkeion: 2.5 ms
2.5 ms
SQLite
SQLite: 1.1 ms
1.1 ms

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.

Rendimiento con recall ≈ 0,99
Qdrant (HNSW)
Qdrant (HNSW): 508 qps
508 qps
Arkeion (IVF-PQ)
Arkeion (IVF-PQ): 356 qps
356 qps
pgvector HNSW
pgvector HNSW: 188 qps
188 qps
pgvector IVFFlat
pgvector IVFFlat: 63 qps
63 qps
Tamaño del índice
pgvector HNSW
pgvector HNSW: 820 MB
820 MB
pgvector IVFFlat
pgvector IVFFlat: 551 MB
551 MB
Arkeion (IVF-PQ)
Arkeion (IVF-PQ): ~39 MB
~39 MB

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.

Construcción del índice
pgvector HNSW
pgvector HNSW: 324 s
324 s
Arkeion (IVF-PQ)
Arkeion (IVF-PQ): 64 s
64 s
Qdrant (HNSW)
Qdrant (HNSW): 49 s
49 s
pgvector IVFFlat
pgvector IVFFlat: 23 s
23 s

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.

Rendimiento con recall ≈ 0,99, un solo hilo
FAISS (biblioteca en RAM)
FAISS (biblioteca en RAM): 756 qps
756 qps
Arkeion v0.13 (en el fichero)
Arkeion v0.13 (en el fichero): 404 qps
404 qps
Arkeion v0.12
Arkeion v0.12: 110 qps
110 qps

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-sqlite

Una 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.

¿Convencido? Está a un comando de distancia

Lee el código del bench