Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/11/2012, 15:05
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, 4 meses
Puntos: 2658
Respuesta: Lentitud en consulta con select 1

Francamente, Pelirr, pocas veces he visto una consulta escrita de una forma más ineficiente, enredada, y con tanto desperdicio de recursos.
Me llevó casi media hora limpiarle todo lo que tiene de más, y no me puse a analizar completamente la lógica de algunas partes, que estimo son completamente inútiles, pero luego de simplificarla quedó así:
Código MySQL:
Ver original
  1.     IFNULL(SC.idArrival, NULL, SC.idArrival) idArrival,
  2.     IFNULL(SC.idDeparture, NULL, SC.idDeparture) idDeparture,
  3.     IFNULL(SC.estadoL, 'IBK', SC.estadoL) estadoL,
  4.     IFNULL(SC.estadoS, 'OBK', SC.estadoL) estadoS,
  5.     IFNULL(SC.aeronave, '- -', SC.aeronave) aeronave,
  6.     IFNULL(SC.matricula, '- -', SC.matricula) matricula,
  7.     IFNULL(SC.inBlockTime, '- -', cast(DATE_FORMAT(SC.inBlockTime, '%d/%m/%Y %H:%i') as CHAR)) inBlockTime,
  8.     IFNULL(SC.aeropuertoL, '- -', SC.aeropuertoL) aeropuertoL,
  9.     IFNULL(SC.companiaL, '- -', SC.companiaL) companiaL,
  10.     IFNULL(SC.numVueloL, '- -', SC.numVueloL) numVueloL,
  11.     IFNULL(SC.paxL, '- -', cast(SC.paxL as CHAR)) paxL,
  12.     IFNULL(SC.offBlockTime, '- -', cast(DATE_FORMAT(SC.offBlockTime, '%d/%m/%Y %H:%i') as CHAR)) offBlockTime,
  13.     IFNULL(SC.aeropuertoS, '- -', SC.aeropuertoS) aeropuertoS,
  14.     IFNULL(SC.companiaS, '- -', SC.companiaS) companiaS,
  15.     IFNULL(SC.numVueloS, '- -', SC.numVueloS) numVueloS,
  16.     IFNULL(SC.paxS, '- -', cast(SC.paxS as CHAR)) paxS,
  17.     IFNULL(SC.airbridgeUse, 'NO', if (SC.airbridgeUse='- -', '- -', 'SI')) airbridgeUse
  18.     (SELECT
  19.         a.idArrivalFlight idArrival,
  20.         a.idDepartureFlight idDeparture,
  21.         a.statusCode estadoL,
  22.         d.statusCode estadoS,
  23.         ac.iataAircraft aeronave,
  24.         a.tailNumber matricula,
  25.         a.estimatedTime inBlockTime,
  26.         a.originAirport aeropuertoL,
  27.         a.iataCompanyCode companiaL,
  28.         a.flightNumber numVueloL,
  29.         pm.pax paxL,
  30.         d.estimatedTime offBlockTime,
  31.         d.iataAirportCode aeropuertoS,
  32.         d.iataCompanyCode companiaS,
  33.         d.flightNumber numVueloS,
  34.         d.idDepartureFlight paxS,
  35.         fs.idFingerService airbridgeUse
  36.     FROM `arrivalflight` a
  37.         INNER JOIN `departureflight` d ON a.idDepartureFlight = d.idDepartureFlight
  38.         INNER JOIN `aircraft` ac ON a.tailNumber = ac.tailNumber
  39.         INNER JOIN `subtypeiataaircraft` stc ON ac.subtypeIataCode = ac.idSubtypeIata
  40.         INNER JOIN `paxmerchandisepost` pm INNER JOIN pm.idArrivalFlight = a.idArrivalFlight
  41.         INNER JOIN (SELECT * FROM `fingerservice` GROUP BY e.idArrivalFlight) fs ON e.idArrivalFlight = a.idArrivalFlight
  42.     WHERE
  43.         a.estimatedTime BETWEEN '2012-10-16 00:00:00' AND '2012-10-16 23:59:59'
  44.         AND a.idSituation = '2'
  45.      UNION
  46.     (SELECT
  47.         a.idArrivalFlight idArrival,
  48.         e.idDepartureFlight idDeparture,
  49.         a.statusCode estadoL,
  50.         e.statusCode estadoS,
  51.         c.iataAircraft aeronave,
  52.         e.tailNumber matricula,
  53.         a.estimatedTime inBlockTime,
  54.         a.originAirport aeropuertoL,
  55.         a.iataCompanyCode companiaL,
  56.         a.flightNumber numVueloL,
  57.         c.pax paxL,
  58.         e.estimatedTime offBlockTime,
  59.         e.iataAirportCode aeropuertoS,
  60.         e.iataCompanyCode companiaS,
  61.         e.flightNumber numVueloS,
  62.         d.pax paxS,
  63.         '- -' airbridgeUse
  64.     FROM `departureflight` e
  65.         INNER JOIN `arrivalflight` a ON e.idDepartureFlight = a.idDepartureFlight
  66.         INNER JOIN `aircraft` b ON e.tailNumber = b.tailNumber
  67.         INNER JOIN `subtypeiataaircraft` c ON b.subtypeIataCode = c.idSubtypeIata
  68.         INNER JOIN `paxmerchandisepost` d ON a.idArrivalFlight = d.idArrivalFlight
  69.     WHERE
  70.             (a.estimatedTime BETWEEN '2012-10-16 00:00:00' AND '2012-10-16 23:59:59')
  71.         AND (e.estimatedTime BETWEEN '2012-10-16 00:00:00' AND '2012-10-16 23:59:59')
  72.         AND e.idSituation = '2'
  73.      ORDER BY inBlockTime desc, offBlockTime desc
  74.      ) SC2;
- Eliminé todos los AS, que son completamente innecesarios.
- Cambié el enorme IF de los campos por el más eficiente ISNULL(), que cubre casi toda la necesidad.
- Eliminé esas subconsultas sobre el SELECT, que generan un enorme despedicio de recursos (un subselect de ese tipo se ejecuta una vez por cada registro devuelto, y tu los estás poniendo en la mayoría de los campos... haz la cuenta del costo).
- Simplifiqué las subconsultas en los INNER JOIN que de todos modos son lo que en realida estarías haciendo, pero más eficiente.

No puedo probarlo, porque no tengo los datos para hacerlo, pero en esencia ese sería el modo de hacerlo.
El refinamiento de la consulta te lo dejo a ti.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)