Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/01/2015, 17:49
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Optimizar un query

Cita:
Iniciado por anayazti Ver Mensaje
Hola a todos.

¿Cómo puede optimizar este query?
Código MySQL:
Ver original
  1. select c.interno, c.mercado, p.total,
  2. (select max(mov.final) from movimientos mov where mov.interno= p.interno and mov.fechai = "2014-12-11") is null )
  3. p.total
  4. ELSE (select max(mov.final) from movimientos mov where mov.interno= p.interno and mov.fechai = "2014-12-11")
  5. END as tt
  6. from paciente p
  7. inner join calificacion c
  8. on p.interno = c.interno
  9. where p.fecha = "2014-12-11";
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 original
  1. SELECT
  2.     c.interno, c.mercado, p.total, IFNULL(mov.final, p.total) tt
  3. FROM paciente p
  4.     INNER JOIN calificacion c ON p.interno = c.interno
  5.     LEFT JOIN
  6.         (SELECT  fechai, interno, MAX(final) final
  7.         FROM movimientos
  8.         WHERE interno = p.interno AND fechai = '2014-12-11'
  9.         GROUP BY fechai , interno) mov ON mov.interno = p.interno
  10. WHERE p.fecha = '2014-12-11' AND mov.fechai = p.fecha OR mov.interno IS NULL;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/01/2015 a las 19:36