SQLite: la expresión de selección es muy lenta

Estoy experimentando algunos problemas de performance pesados ​​con una consulta en SQLite. Actualmente hay alnetworkingedor de 20000 inputs en la tabla activity_tbl y alnetworkingedor de 40 en la tabla activity_data_tbl . Tengo un índice para las dos columnas utilizadas en la consulta a continuación, pero no parece tener ningún efecto en el performance en absoluto.

SELECT a._id, a.start_time + b.length AS time FROM activity_tbl a INNER JOIN activity_data_tbl b ON a.activity_data_id = b._data_id WHERE time > ? ORDER BY 2 LIMIT 1 

Como puede ver, selecciono una columna y un valor creado al agregar dos columnas juntas. Supongo que esto es lo que está causando el bajo performance, ya que la consulta es muy rápida si selecciono a.start_time o b.length.

¿Tienen alguna sugerencia de cómo podría optimizar esto?

Intenta poner un índice en la columna de time. Esto debería acelerar la consulta

Esta consulta no es optimizable utilizando índices para la parte del filter, ya que está filtrando y orderando en un valor calculado. Para optimizar la consulta, tendrá que filtrar en una de las columnas de la tabla real (hora de inicio o duración) o precomputar los valores de time antes de consultar.

El único lugar donde un índice ayudará, y supongo que tiene uno, está en b.data_id.

Un índice compuesto puede ayudar. De acuerdo con sus documentos, SQLite intenta evitar acceder a la tabla, si el índice tiene suficiente información. Entonces, si el motor hizo su tarea, reconocerá que el índice es suficiente para calcular el valor de la cláusula where y ahorrar algo de time. Si no funciona, solo lo hará el precálculo.

Si se enfrenta con más frecuencia a tareas similares, lea esto: http://www.sqlite.org/rtree.html