2010-03-16 4 views
8

Estoy tratando de diagnosticar por qué una consulta en particular es lenta contra SQLite. Parece que hay mucha información en how the query optimizer works, pero poca información sobre cómo diagnosticar realmente problemas.Explicación de la tabla sqlite_stat1

En particular, cuando analizo la base de datos obtengo la tabla sqlite_stat1 esperada, pero no sé qué me dice la columna de estadísticas. Una fila de ejemplo es:

MyTable,ix_id,25112 1 1 1 1 

¿Qué significa realmente "25112 1 1 1 1"?

Como pregunta más amplia, ¿alguien tiene algún recurso bueno sobre las mejores herramientas y técnicas para diagnosticar el rendimiento de consultas SQLite?

Gracias

+1

Acabo de encontrar que mi problema de rendimiento se debía a que faltaba un índice en una tabla de unión, pero era más intuitivo que diagnóstico. Realmente me gustaría entender más el proceso de diagnóstico del uso del índice SQLite. –

Respuesta

5

de analyze.c:

/* Store the results. 
** 
** The result is a single row of the sqlite_stmt1 table. The first 
** two columns are the names of the table and index. The third column 
** is a string composed of a list of integer statistics about the 
** index. The first integer in the list is the total number of entires 
** in the index. There is one additional integer in the list for each 
** column of the table. This additional integer is a guess of how many 
** rows of the table the index will select. If D is the count of distinct 
** values and K is the total number of rows, then the integer is computed 
** as: 
** 
**  I = (K+D-1)/D 
** 
** If K==0 then no entry is made into the sqlite_stat1 table. 
** If K>0 then it is always the case the D>0 so division by zero 
** is never possible. 
0

sólo tiene que ejecutar explicar plan de consulta + instrucción SQL, usted encontrará si los cuadros mencionados en la declaración utiliza el índice que desea, si no, intente reescribir el sql; en caso afirmativo, determine si el índice correcto que desea usar. Más información por favor refiérase a www.sqlite.org

1

También, I = (K + D-1)/D significa: K se supone número total de filas, y D es valores distintos para cada columna, así que si tabla creada con CREATE TABLE TEST (C1 INT, C2 TEXT, C3 INT, C4 INT); y crear índice como CREATE INDEX IDX on TEST(C1, C2)

a continuación, se puede insertar o dejar que sqlite actualizar automáticamente la tabla sqlite_stat1 como manualmente: "TEST" -> nombre de tabla, "IDX" -> índice de nombres " 10000 1 1000 ", AQUÍ, 10000 es su número total de filas en TABLE TEST, 1 significa, para la columna C1, todos los valores parecen ser distintos, esto parece que C1 es algo así como IDs o lo que sea, 1000 significa que C2 tiene menos diferencias valor, como usted sabe, cuanto mayor es el valor, los valores menos distintos que el índice se refiere a la columna específica.

Puede ejecutar ANALYZE o actualizar manualmente la tabla. (Mejor que lo primero).

Entonces, ¿para qué sirve el valor? sqlite utilizará estas estadísticas, para encontrar el mejor índice que quieren usar, puede considerar CREATE INDEX IDX2 ON TEST(C2)" AND the value in stat1 table is "10000 1, y CREATE INDEX IDX1 ON TEST(C1)" with value "10000 100"; Supongamos que no tenemos el índice IDX que definimos anteriormente, cuando emite SELECT * FORM TEST WHERE C1=? AND C2=?, sqlite elegirá IDX2, pero no IDX1, ¿por qué? Es simple, ya que IDX2 puede minimizar los resultados de la consulta, pero IDX1 no.

¿Borrar?

1

Recuerde que un índice puede estar compuesto por más de una columna de una tabla. Entonces, en el caso de "25112 1 1 1 1", esto se describiría como un índice compuesto que se compone de 4 columnas de una tabla. Los números significan lo siguiente:

  • 25112 es una estimación del número total de filas en el índice
  • El segundo número entero (el primer "1") es una estimación del número de filas que tienen el mismo valor en la primera columna del índice.
  • El tercer número entero (el segundo "1") es una estimación del número de filas que tienen el mismo valor para las primeras dos columnas del índice. NO es la "distinción" de la columna 2.
  • El cuarto entero (el tercero "1") es una estimación del número de filas que tienen los mismos valores para las primeras tres columnas en el índice.
  • Igual lógica para el último número entero ..

El último número entero debe ser siempre. Considere una tabla que tiene dos filas y dos columnas con un índice compuesto compuesto de columna1 + columna2. Los datos son la tabla es:

  1. manzana, rojo
  2. Apple, verde

Las estadísticas se vería como "2 2 1". Es decir, hay 2 filas en el índice. Hay dos filas que se devolverían si solo se utilizara la columna 1 del índice (Apple y Apple). Y 1 fila única que se devolvería usando column1 + column2 (Apple + Red es única de Apple + Green)