- SQLite es un almacén orientado a filas que se guarda en disco con una estructura de árbol B, y ejecuta consultas usando una máquina virtual llamada VDBE. Puede ejecutarse en casi cualquier entorno, sin depender de la plataforma y en un solo hilo
- Aunque es una base de datos de propósito general, destaca en cargas OLTP. En 2015, investigadores de la Universidad de Buffalo descubrieron que la mayoría de las consultas eran búsquedas simples de clave-valor y consultas OLAP complejas
- Investigadores de la Universidad de Wisconsin-Madison trabajaron para acelerar las consultas analíticas. Compararon el rendimiento usando DuckDB y Star Schema Benchmark (SSB)
Causa
- Para identificar por qué SQLite era lento, usaron la opción
VDBE_PROFILE para medir los ciclos de CPU consumidos por cada instrucción de VDBE.
- Se descubrió que dos opcodes,
SeekRowID y Column, eran las causas principales.
Joins de base de datos
- Las bases de datos implementan los joins de varias maneras, como nested loop join, hash join y sort-merge join.
- SQLite usa el más simple, el "nested loop join". Esto se parece a una búsqueda en árbol B y resulta costoso.
La importancia de optimizar joins
- En una operación de join, el orden de las tablas importa. Cambiarlo puede reducir enormemente la cantidad de operaciones. Este es un problema NP-hard.
- Existen dos algoritmos de join mejores que el nested loop join, pero el hash join consume mucha memoria, y SQLite suele ejecutarse en entornos con restricciones de memoria.
- Los investigadores usaron filtros Bloom para mejorar la eficiencia espacial y ajustarlos a las líneas de caché de la CPU. Agregaron dos opcodes,
Filter y FilterAdd.
Resultados
- Tras la optimización, en el análisis de ciclos de CPU casi desaparecieron las grandes barras azules.
- SQLite se volvió entre 7 y 10 veces más rápido. Este resultado de investigación se aplicó a SQLite v3.38.0.
- Los filtros Bloom encajan bien con la implementación simple de SQLite y funcionan dentro del motor de consultas existente con una sobrecarga mínima de memoria
3 comentarios
Al revisar la versión actual, veo que su sistema usa 3.42.0. La más reciente al día de hoy es 3.47.2.
Supongo que tendré que revisar qué versión de SQLite estoy usando ahora mismo.
De hecho, más que esto, estoy usando openpyxl para generar archivos de Excel, pero como tarda bastante, voy a tener que buscar si hay alguna otra librería.
¿No sería bueno hacer un perfilado primero?