Pregunta

Tengo un SQL similar al siguiente, que une cuatro tablas y luego ordena los resultados por el "estado". columna de la primera:

SELECT * 
 FROM a, b, c, d 
 WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
 ORDER BY a.status

Funciona. Sin embargo, es lento. He resuelto que esto se debe a la cláusula ORDER BY y a la falta de índice en la tabla " a " ;.

Las cuatro tablas tienen las CLAVES PRIMARIAS establecidas en el " id " columna.

Entonces, sé que necesito agregar un índice a la tabla a que incluya el "estado" columna, pero ¿qué más necesita incluir? Debería " ofertar " ;, " cid " y '' hizo '' estar allí también?

He intentado preguntar esto en un sentido general de SQL pero, si es importante, el objetivo es SQLite para usar con Gears.

Gracias de antemano,

Jake (novato)

¿Fue útil?

Solución

Diría que es lento porque el motor está haciendo escaneos por todas partes en lugar de búsquedas. ¿Querías hacer SELECT a. * En su lugar? Eso también sería más rápido, SELECCIONAR * aquí es equivalente a a. *, B. *, C. *, D. *.

Probablemente obtendrá mejores resultados si coloca un índice separado en cada una de estas columnas:

  • a.did (para que a.did = 'XXX' sea una búsqueda en lugar de un escaneo, también ayuda a a.did = d.id)
  • a.cid (para a.cid = c.id)
  • b.aid (para a.id = b.aid)

Puede intentar agregar Estado al primer y segundo índice con un orden ASCENDENTE, para obtener un rendimiento adicional, no duele.

Otros consejos

Me gustaría saber cómo resolvió que el problema es 'la cláusula ORDER BY y la falta de índice en la tabla' 'a' '. Encuentro esto un poco sospechoso porque hay un índice en la tabla a, en la clave primaria, más tarde dirá.

Mirando la naturaleza de la consulta y lo que puedo adivinar sobre la naturaleza de los datos, creo que esta consulta generalmente produciría relativamente pocos resultados en comparación con el tamaño de las tablas que está usando, y que por lo tanto ORDER BY Sería extremadamente barato. Por supuesto, esto es solo una suposición.

Si un índice incluso ayudará en absoluto depende de los datos de la tabla. Los índices que utilizará su optimizador de consultas cuando realice una consulta dependen de muchos factores diferentes, uno de los cuales es el número esperado de resultados producidos a partir de una búsqueda.

Una cosa que ayudaría mucho es si publicara el resultado de EXPLICAR su consulta.

¿has intentado unirte?

seleccione * de una unión interna b en a.id = b.aid unión interna c en a.cid = c.id unión interna d en a.did = d.id donde a.did = 'XXX' ORDEN POR a.status

el uso correcto de las combinaciones (izquierda, richt, interior, exterior) depende de la estructura de las tablas

espero que esto ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top