¿Cuál es la forma más eficiente de contar filas en una tabla en SQLite?

Siempre acabo de utilizar "SELECT COUNT (1) FROM X", pero quizás este no sea el más eficiente. ¿Alguna idea? Otras opciones incluyen SELECT COUNT (*) o quizás get la última identificación insertada si se incrementa automáticamente (y nunca se elimina).

¿Qué tal si solo quiero saber si hay algo en la table? (por ejemplo, count> 0?)

La mejor manera es asegurarse de ejecutar SELECT COUNT en una sola columna ( SELECT COUNT(*) es más lento), pero SELECT COUNT siempre será la manera más rápida de contar las cosas (la database optimiza la consulta internamente).

Si revisa los comentarios a continuación, puede ver arguments sobre por qué SELECT COUNT(1) es probablemente su mejor opción.

Si está seguro (realmente seguro) de que nunca ha eliminado ninguna fila de esa tabla y su tabla no se ha definido con la optimization SIN ROWID, puede tener el número de filas llamando:

 select max(RowId) from table; 

O si su tabla es una queue circular, podría usar algo como

 select MaxRowId - MinRowId + 1 from (select max(RowId) as MaxRowId from table) JOIN (select min(RowId) as MinRowId from table); 

Esto es realmente muy rápido (milisegundos), pero debe prestar atención porque sqlite dice que el Id. De fila es único entre todas las filas en la misma tabla. SQLite no declara que los Id. De fila son y serán siempre numbers consecutivos.

No creo que encuentres un método especial para esto. Sin embargo, puede hacer que su recuento selectivo en la key principal sea un poco más rápido.

La manera más rápida de get recuentos de filas es directamente de los metadatos de la tabla, si los hay. Lamentablemente, no puedo encontrar una reference para que este tipo de datos esté disponible en SQLite.

En su defecto, cualquier consulta del tipo

SELECT COUNT (valor constante no NULO) FROM table

debe optimizar para evitar la necesidad de una tabla, o incluso un índice, escaneo. Idealmente, el motor simplemente devolverá el número actual de filas que se sabe están en la tabla de los metadatos internos. En su defecto, simplemente necesita saber el número de inputs en el índice de cualquier columna que no sea NULL (el primer índice que se busca es el índice de key principal).

Tan pronto como introduzca una columna en SELECT COUNT le está pidiendo al motor que realice al less un escaneo de índice y posiblemente un escaneo de tabla, y eso será más lento.

Para dar seguimiento a la respuesta de girasquid, como un punto de datos, tengo una tabla sqlite con 2.3 millones de filas. Usando select count(*) from table , tardó más de 3 segundos en contar las filas. También intenté usar SELECT rowid FROM table , (pensando que rowid es una key indexada primaria pnetworkingeterminada) pero eso no fue más rápido. Luego hice un índice en uno de los campos en la database (solo un campo arbitrario, pero elegí un campo integer porque sabía por experiencia que los índices en campos cortos pueden ser muy rápidos, creo que debido a que el índice se almacena una copy del valor en el índice mismo). SELECT my_short_field FROM table networkingujo el time a less de un segundo.

sp_spaceused 'table_name' (excluir comillas simples)

esto devolverá el número de filas en la tabla anterior, esta es la forma más eficiente que he encontrado hasta ahora.

es más eficiente que select Count(1) from 'table_name' (excluir comillas simples)

sp_spaceused se puede usar para cualquier tabla, es muy útil cuando la tabla es excepcionalmente grande (cientos de millones de filas), devuelve el número de filas de la misma manera, mientras que 'select Count(1)' puede tomar más de 10 segundos. Además, no necesita ningún nombre de columna / campo key para considerar.