android android-sqlite auto-increment

¿Cuáles son los gastos generales del uso de AUTOINCREMENT for SQLite en Android?



android-sqlite auto-increment (1)

En la documentación de SQLite, incluye lo siguiente:

La palabra clave AUTOINCREMENT impone CPU adicional, memoria, espacio en disco y sobrecarga de E / S de disco y debe evitarse si no es estrictamente necesario. Por lo general, no es necesario.

y

El comportamiento implementado por la palabra clave AUTOINCREMENT es sutilmente diferente del comportamiento predeterminado. Con AUTOINCREMENT, se garantiza que las filas con ROWID seleccionados automáticamente tengan ROWID que nunca antes hayan sido utilizados por la misma tabla en la misma base de datos. Y se garantiza que los ROWID generados automáticamente aumentarán monotónicamente. Estas son propiedades importantes en ciertas aplicaciones. Pero si su aplicación no necesita estas propiedades, probablemente debería seguir con el comportamiento predeterminado, ya que el uso de AUTOINCREMENT requiere trabajo adicional a medida que se inserta cada fila y, por lo tanto, INSERTs se ejecuta un poco más lento.

Las citas anteriores son de SQLite Autoincrement

Entonces, ¿qué tipo de impacto es de esperar y en qué medida el AUTOINCREMENTO es más lento?


Mi estimación, señalando que no soy un estadístico, es que la sobrecarga es algo así como un 8-12% más lenta.

Obtuve los resultados usando 3 tablas estructuralmente similares y simples con dos columnas TEXT, ejecutando 10,000 inserciones por cada tabla, repitiendo esto 5 veces en 4 dispositivos.

La Tabla 1 (columna Dflt) se creó con solo las dos columnas TEXT (utilizando así el ROWID predeterminado).

La Tabla 2 (columna AI) se creó usando _id INTEGER PRIMARY KEY AUTOINCREMENT además de las dos columnas TEXT.

La Tabla 3 (Sin columna AI) se creó usando _id INTEGER PRIMARY KEY además de las dos columnas TEXT.

Por lo tanto, la Tabla 2 utiliza el algoritmo de selección ROWID ligeramente diferente para las inserciones.

Los cuatro dispositivos utilizados fueron: -

  • (1) Un dispositivo emulado Genymotion (Tableta personalizada - 5.1.0 - API 22 - 1536x2048)

  • (2) Una tableta Onix de 10 "(AT101-1116)

  • (3) Un HTC 1 M8 (HTC_0PKV1)

  • (4) Una tableta Lenevo A10-30 (Lenovo TB2-X30F)

    Los resultados que obtuve fueron: -

Los resultados son más favorables cuando todo se ejecuta en solo 1 transacción (es decir, beginTransaction(); antes de cualquier inserción, con setTransactionSuccessful(); y endTransaction(); después de todas las inserciones (para todas las tablas, es decir, las 150,000 inserciones completas), por ejemplo: -

La comparación de las dos tablas resalta los beneficios que el uso de transacciones puede tener sobre el rendimiento.