Cómo detectar consultas con escaneo completo de tabla en SQLite

Fuentes: Detecting Full Table Scans With SQLite

SQLite ofrece, a través de su API de estado de sentencias preparadas, una forma directa de saber si una consulta ha realizado un escaneo completo de tabla ("full table scan") sin necesidad de recurrir a EXPLAIN. El programador Aaron Patterson, conocido en la comunidad Ruby por su trabajo en Rails y asiduo a RubyConf, explica cómo aprovechar esta capacidad en una prueba para detectar regresiones de rendimiento. La idea surgió a raíz de la migración de lobste.rs a SQLite, donde el equipo deseaba poder fallar automáticamente en un test cuando se produjera un escaneo completo de tabla, un patrón que causó problemas de rendimiento durante el primer despliegue.

El mecanismo se basa en la función sqlite3_stmt_status, accesible en Ruby mediante stmt.stat(:fullscan_steps). Tras ejecutar una consulta, basta con consultar esa métrica: si el valor es mayor que cero, la sentencia habrá recorrido la tabla entera. Patterson ilustra el uso con un programa de ejemplo en Ruby: crea una tabla "users" con 1.000 registros, prepara una consulta filtrada por edad sin índice y observa cómo fullscan_steps refleja el escaneo completo. A continuación, añade un índice sobre la columna age, repite la misma consulta y comprueba que el contador pasa a cero.

El autor sugiere integrar esta comprobación en Rails para lanzar avisos o errores en entornos de test y desarrollo. No obstante, matiza que monitorizar cada sentencia en producción podría ser excesivo, aunque no descarta su utilidad. En conjunto, se trata de una técnica sencilla y de bajo coste para reforzar las pruebas de rendimiento y evitar regresiones en bases de datos SQLite.