Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Optimizar un query

Estas en el tema de Optimizar un query en el foro de Mysql en Foros del Web. Hola a todos. ¿Cómo puede optimizar este query? @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original select c.interno , c.mercado , p.total , CASE WHEN ( ( ...
  #1 (permalink)  
Antiguo 02/01/2015, 16:14
 
Fecha de Ingreso: noviembre-2010
Mensajes: 25
Antigüedad: 14 años
Puntos: 0
Información Optimizar un query

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";

Última edición por gnzsoloyo; 02/01/2015 a las 17:46
  #2 (permalink)  
Antiguo 02/01/2015, 17:43
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años, 6 meses
Puntos: 7
Pregunta Respuesta: Optimizar un query

Creo que deberías agregar una descripción de lo que quiere hacer este query.
Si las tablas pk, fk y si el mismo está funcionando o no.


Cita:
Iniciado por anayazti Ver Mensaje
Hola a todos.

¿Cómo puede optimizar este query?
select c.interno, c.mercado, p.total,
CASE WHEN (
(select max(mov.final) from movimientos mov where mov.interno= p.interno and mov.fechai = "2014-12-11") is null )
THEN
p.total
ELSE (select max(mov.final) from movimientos mov where mov.interno= p.interno and mov.fechai = "2014-12-11")
END as tt
from paciente p
inner join calificacion c
on p.interno = c.interno
where p.fecha = "2014-12-11";
__________________
Todos somos iguales. NO! a la violencia de género.
  #3 (permalink)  
Antiguo 02/01/2015, 17:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
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
  #4 (permalink)  
Antiguo 08/01/2015, 12:25
Avatar de dorde  
Fecha de Ingreso: diciembre-2003
Mensajes: 145
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Optimizar un query

has esto en tu consulta
SELECT SQL_big_RESULT
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;
__________________
Pero si alguno de vosotros se ve falto de sabiduría, que la pida a Dios, el cual da a todos abundantemente y sin reproche, y le será dada. Pero que pida con fe, sin dudar

Santiago 1.5-6

Etiquetas: optimización
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:23.