2010-12-17 16 views
11

Siempre he usado "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 obtener la última identificación insertada si se incrementa automáticamente (y nunca se elimina).¿Cuál es la manera más eficiente de contar filas en una tabla en SQLite?

¿Qué tal si solo quiero saber si hay algo en la tabla? (Por ejemplo, contador> 0?)

+0

Para contar (*) contra contar (algo más), echar un vistazo (aquí) [http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ 4439459 # 4439459] – Ronnis

Respuesta

11

La mejor forma de hacerlo es asegurarse de que se ejecuta SELECT COUNT en una sola columna (SELECT COUNT(*) es más lento) - pero SELECT COUNT siempre habrá la manera más rápida para obtener un recuento de las cosas (la base de datos optimiza la consulta internamente).

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

+0

Es incluso mejor si selecciona conteo (nombreColumna) en una columna que está indexada en la tabla. – DwB

+0

¿Entonces no SELECCIONAR COUNT (1) pero SELECT COUNT (id)? – tofutim

+0

Sí, como dijo dwb, lo mejor es hacerlo en una columna indexada. – girasquid

0

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

0

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

defecto, cualquier consulta del tipo

SELECT COUNT (valor constante no NULL) de la tabla

debe optimizar para evitar la necesidad de una mesa, o incluso un índice, scan. 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 entradas en el índice de cualquier columna que no sea NULL (el primer índice que se busca es el índice de clave principal).

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

-1

sp_spaceused 'table_name' (excluir comilla simple)

Esto devolverá el número de filas en la tabla anterior, esta es la manera más eficiente que he encontrado todavía.

Es más eficiente que select Count(1) from 'table_name' (excluir comilla simple)

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

+0

La pregunta es sobre SQLite, no SQL Server – dsz

1

Si está seguro (muy seguro) que nunca se haya eliminado cualquier fila de esa tabla y la tabla no se ha definido con el SIN ROWID optimización puede hacer que el número de filas llamando:

select max(RowId) from table; 

O si la tabla es una cola circular que podría utilizar 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 hay que prestar atención porque sqlite dice esa fila id es único entre todas las filas de la misma mesa. SQLite no declara que los Id. De fila son y serán siempre números consecutivos.

+0

Aquí puede leer algo sobre cómo confiar en rowid [link] (http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something- usted-realmente-necesita-saber /) – Teolazza

0

Para seguir 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 para contar las filas. También probé usando SELECT rowid FROM table, (pensando que rowid es una clave indexada primaria predeterminada) pero eso no fue más rápido. Luego hice un índice en uno de los campos en la base de datos (solo un campo arbitrario, pero elegí un campo entero 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 copia del valor en el índice mismo). SELECT my_short_field FROM table redujo el tiempo a menos de un segundo.

Cuestiones relacionadas