2010-11-28 19 views
24

Mi aplicación para Android funciona mediante el uso de una base de datos SQLite que se genera en la PC del usuario y se transfiere al dispositivo. Todo funciona, pero no anticipé la cantidad de usuarios que tendrían realmente grandes cantidades de datos. En estos casos, la IU es muy lenta ya que espera a que se obtengan los datos.Android SQLite Performance con índices

He intentado una serie de trucos que estaba "seguro" que acelerarían las cosas, pero nada parece tener un efecto notable. Mis consultas son casi todas muy simples, usualmente son un solo "col = val" para la cláusula WHERE, y datos INTEGER en la columna. Entonces no puedo hacer mucho con las consultas.

Lo último, y no soy un experto en SQL de ninguna manera, fue usar comandos "CREATE INDEX" en la PC, creyendo que estos índices se utilizan para acelerar las búsquedas en la base de datos. ¡Los índices aumentaron significativamente el tamaño del archivo de la base de datos, por lo que me sorprendió que no pareciera tener ningún efecto en la velocidad de mi aplicación! Una pantalla que tardaba 8 segundos en completarse sin índices todavía demora unos 8 segundos incluso con ellos. Esperaba bajar las cosas a al menos la mitad.

Lo que me pregunto en este punto es si la implementación de SQLite en Android usa índices de base de datos, o si solo estoy desperdiciando espacio al generarlos. ¿Alguien puede responder esto?

¿Alguna otra cosa para tratar de acelerar el acceso?

(Por si vale la pena, los usuarios no tienen nada de qué quejarse. Mi peor usuario hasta ahora tiene datos que generan 630,000 registros (15 tablas), ¡así que hay mucho que es posible!)

Doug Gordon GHCS Sistemas

+1

publique algunas consultas lentas, junto con definiciones de tabla y definiciones de índice – Mikpa

Respuesta

4

Cada vez que se va a realizar algún tipo de acción (siendo las operaciones de búsqueda de base de datos, cálculo de larga duración, solicitud web, etc.) teniendo más de un par de cientos de milisegundos, se debería considerar envolver esto dentro de un AsyncTask.

Painless Threading es un buen artículo sobre este tema, por lo que le recomiendo que lo analice detenidamente.

En este artículo se analiza la modelo de roscar usado por las aplicaciones y Android cómo las aplicaciones pueden garantizar mejor rendimiento de la interfaz de usuario de desove subprocesos de trabajo para manejar las operaciones de larga ejecución, en lugar de manejarlos en el principal hilo.

+1

Ya lo estoy haciendo. El problema es la cantidad de tiempo que transcurre antes de que se muestren finalmente los datos solicitados (en onPostExecute). – gordonwd

+0

@gordonwd: Supongo (ya que dice que está cargando tantos datos) que muestra una larga lista. Si este es el caso, puede intentar una solución como se sugiere en esta * Pregunta de la lista * Endless de Android * (http://stackoverflow.com/questions/1080811/android-endless-list). Y como alguien señaló anteriormente, también debe publicar algún código de sus tablas y cómo obtiene datos de nosotros para poder ayudarlo mejor. – Nailuj

+0

@Nailuj parece que el enlace de su artículo ha cambiado, probablemente a esto; http://android-developers.blogspot.com.au/2009/05/painless-threading.html pero, ¿puedes verificar y corregir el 404? –

10

SQLite usará el índice si es apropiado para la consulta. Utilice EXPLAIN

EXPLAIN QUERY PLAN ... your select statement ... 

a ver qué índices SQLite está utilizando. El plan de consulta se basa en algunas suposiciones sobre el contenido de su base de datos. Puede mejorar el plan utilizando ANALYZE

11

Finalmente pude obtener enormes ganancias de rendimiento simplemente al consultar la base de datos de una manera mucho más eficiente. Por ejemplo, al construir una matriz de información, previamente estaba consultando la base de datos para cada fila que requería con un selector de tipo "WHERE _id = n". Pero al hacerlo de esta manera, estaba emitiendo una docena o más de consultas, una a la vez.

En su lugar, ahora creo una lista de ID que son necesarios, luego los obtengo todos con una sola consulta de la forma "WHERE _id IN (n1, n2, n3, ...)" y repito a través de la respuesta cursor. Al hacer esto y algunas otras optimizaciones de la estructura, la base de datos más grande ahora es casi tan rápida de ver como el caso más promedio.

+2

sí, reducir el número de consultas, si es posible, es una de las maneras más eficientes de mejorar el rendimiento. Como gran tiempo de montaje se usa para esperar la E/S lenta relativa. – pierrotlefou