Cita:
Iniciado por anayazti Hola a todos.
¿Cómo puede optimizar este query?
Hay varios consejos:
1) No uses CASE dentro del SELECT salvo que sea total y absolutamente necesario e imposible de obtener los datos de otro modo. Es ineficiente hasta la locura.
2) No uses subconsultas en el SELECT, salvo que sea totalmente imprescindibles. Son asesinas de performance porque se ejecutan una vez por cada registro devuelto en la consulta principal... y si esta devuelve demasiados registros se transforma en un desastre.
3) No uses comillas para las cadenas de texto. No todos los servidores los aceptan porque por default se toman como si fuesen acentos agudos, y darían errores impredecibles de sintaxis y ejecución. Las cadenas de texto van entre apostrofos (').
Esto por lo pronto.
Yo empezaría por tratar de resolver la condición que fuerzas como con fórceps, con una tabla derivada en el FROM. Algo como:
Código SQL:
Ver originalSELECT
c.interno, c.mercado, p.total, IFNULL(mov.final, p.total) tt
FROM paciente p
INNER JOIN calificacion c ON p.interno = c.interno
LEFT JOIN
(SELECT fechai, interno, MAX(final) final
FROM movimientos
WHERE interno = p.interno AND fechai = '2014-12-11'
GROUP BY fechai , interno) mov ON mov.interno = p.interno
WHERE p.fecha = '2014-12-11' AND mov.fechai = p.fecha OR mov.interno IS NULL;