El motor
Una base de datos seria en un solo fichero — todo lo que se afirma aquí abajo se entrega hoy en el crate open source.
cabecera páginas#v126 páginas#v127 páginas#v128 añadir →
SQL y esquema
- Dialecto amplio
- JOIN, GROUP BY/HAVING, DISTINCT, agregados (incl. GROUP_CONCAT), subconsultas, CTEs (WITH), UNION, CASE, CAST, BETWEEN, ||, más una biblioteca de funciones escalares y de fecha/hora.
- Vistas y triggers
- CREATE VIEW; triggers a nivel de fila BEFORE/AFTER sobre INSERT/UPDATE/DELETE con OLD/NEW.
- Integridad
- Claves foráneas con ON DELETE RESTRICT, CASCADE y SET NULL.
- ALTER TABLE lógico
- ADD, DROP, RENAME, MOVE y REORDER COLUMN sin reescribir una sola fila — y seguro para el viaje en el tiempo.
- Índices secundarios
- CREATE [UNIQUE] INDEX sobre B-tree; el planificador los usa para igualdades, rangos y búsquedas multicolumna, con pushdown determinista de predicados en los JOIN.
Búsqueda
- Texto completo, nativo
- MATCH con ranking BM25, snippet() y highlight(), acelerado por índice. Las posting lists comprimidas por prefijo mantienen el índice por debajo de SQLite FTS5.
- Vectorial / semántica
- Columnas vectoriales f32 e int8; KNN exacto más ANN vía CREATE VECTOR INDEX … USING cosine|l2 (IVF / IVF-PQ); el RRF híbrido combina BM25 y vectores. El índice es ≈10–20× más pequeño que HNSW.
- Búsqueda con viaje en el tiempo
- MATCH … AS OF consulta el pasado — algo que ningún motor de búsqueda dedicado ofrece.
- Construcción de índices que escala
- Paralela (k-means, asignación y PQ en todos los núcleos) y en streaming — el dataset nunca se materializa, así que decenas de millones de filas caben en una máquina modesta.
Almacenamiento y velocidad
- El fichero es el WAL
- B-tree append-only con copy-on-write. Un fichero por tenant: el backup es cp, la restauración es cp.
- Durabilidad
- ACID con recuperación por tail-scan y un solo fsync por commit. El group commit agrupa a los committers concurrentes — en torno a 4.6× de throughput durable con 16 hilos.
- Cargas masivas
- bulk_insert ejecuta todo el lote en una única transacción sin ejecutor por fila — 2.5M filas/s en nuestros benches.
- Lecturas en streaming
- Los SELECT simples fluyen con decodificación perezosa: solo las columnas proyectadas, directamente desde la página. La API tipada del motor sirve búsquedas puntuales ~3.7× más rápido que la vía SQL.
- Concurrencia
- Lectores concurrentes sin lock global — cada lectura es un snapshot inmutable.
Integridad y criptografía
- Historia encadenada por hash
- Cada commit se encadena con SHA-256; manipular el pasado es detectable. verify() con anclas demuestra que el fichero está intacto.
- Cifrado en reposo
- AES-256-GCM por página (opcional) — la PII nunca toca el disco en claro.
- Autorreparación
- Reed–Solomon por página (opcional) corrige el bit-rot en lugar de limitarse a detectarlo; scrub() recorre el fichero.
- Compresión y mantenimiento
- LZSS en Rust puro por página; vacuum con retención y rotación de claves, renombrado atómico.
Tiempo y ramas
- AS OF
- SELECT … AS OF <versión o timestamp> — más history(), diff_versions() y changes().
- Ramifica y fusiona datos
- Ramas de datos con diff y merge a tres bandas, sobre el modelo conceptual de Git. Prueba una migración en una rama; fusiónala cuando se demuestre sólida.