Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/11/2012, 02:22
Pelirr
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Lentitud en consulta con select 1

Buenos días, necesito ayuda con una consulta que estoy realizando sobre unas cuantas tablas. El problema es que cuando hay muchos registros, la consulta puede durar hasta 5 minutos, y eso es demasiado, me gustaría optimizar la consulta, pero no sé como hacerlo. He estado mirando por internet, pero igual dicen que hay que utilizar 'inner join' que dicen que es lo mismo utilizar la cláusula 'where', así que estoy hecha un lío. Mi consulta es la siguiente:
Código MySQL:
Ver original
  1.     a.idArrivalFlight as idArrival,
  2.     a.idDepartureFlight as idDeparture,
  3.     a.statusCode as estadoL,
  4.     if ((select d.statusCode from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight) is null, 'OBK', (select d.statusCode from departureflight` d where d.idDepartureFlight = a.idDepartureFlight)) as estadoS,
  5.    if ((select c.iataAircraft from `subtypeiataaircraft` c,`aircraft` b where b.subtypeIataCode = c.idSubtypeIata and a.tailNumber = b.tailNumber) is null, '- -', (select c.iataAircraft from `subtypeiataaircraft` c,`aircraft` b where b.subtypeIataCode = c.idSubtypeIata and a.tailNumber = b.tailNumber)) as aeronave,
  6.    if (a.tailNumber is null, '- -', a.tailNumber) as matricula,
  7.    cast(DATE_FORMAT(a.estimatedTime, '%d/%m/%Y %H:%i') as char) as inBlockTime,
  8.    a.originAirport as aeropuertoL,
  9.    a.iataCompanyCode as companiaL,
  10.    a.flightNumber as numVueloL,
  11.    if ((select c.pax from `paxmerchandisepost` c where c.idArrivalFlight = a.idArrivalFlight) is null, '- -', cast((select c.pax from `paxmerchandisepost` c where c.idArrivalFlight = a.idArrivalFlight) as char)) as paxL,
  12.    if ((select d.estimatedTime from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight) is null, '- -', cast(DATE_FORMAT((select d.estimatedTime from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight),'%d/%m/%Y %H:%i') as char)) as offBlockTime,
  13.    if ((select d.iataAirportCode from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight) is null, '- -', (select d.iataAirportCode from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight)) as aeropuertoS,
  14.    if ((select d.iataCompanyCode from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight) is null, '- -', (select d.iataCompanyCode from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight)) as companiaS,
  15.    if ((select d.flightNumber from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight) is null, '- -', (select d.flightNumber from `departureflight` d where d.idDepartureFlight = a.idDepartureFlight)) as numVueloS,
  16.    if( (select d.idDepartureFlight from `departureflight` d where a.idDepartureFlight = d.idDepartureFlight) is null,  '- -',
  17.        if ((select c.pax from `paxmerchandisepost` c where c.idDepartureFlight = a.idDepartureFlight) is null, '- -',cast((select c.pax from `paxmerchandisepost` c where c.idDepartureFlight = a.idDepartureFlight) as char)))  as paxS,
  18.    if ((select e.idFingerService from `fingerservice` e where e.idArrivalFlight = a.idArrivalFlight group by e.idArrivalFlight) is null, 'NO', 'YES') as airbridgeUse
  19.    from `arrivalflight` a where a.estimatedTime >= '2012-10-16 00:00:00' and a.estimatedTime < '2012-10-17 00:00:00' and a.idSituation = '2'
  20.  
  21.    union
  22.    (select
  23.        if ((select a.idArrivalFlight from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight) is null, null, (select a.idArrivalFlight from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) as idArrival,
  24.        e.idDepartureFlight as idDeparture,
  25.        if ((select a.statusCode from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight) is null, 'IBK', (select a.statusCode from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) as estadoL,
  26.        e.statusCode as estadoS,
  27.        if ((select c.iataAircraft from `aircraft` b, `subtypeiataaircraft` c where b.tailNumber = e.tailNumber and b.subtypeIataCode = c.idSubtypeIata) is null, '- -', (select c.iataAircraft from `aircraft` b, `subtypeiataaircraft` c where b.tailNumber = e.tailNumber and b.subtypeIataCode = c.idSubtypeIata)) as aeronave,
  28. if (e.tailNumber is null, '- -', e.tailNumber) as matricula,
  29. if ((select a.estimatedTime from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight) is null, '- -',
  30.    cast(DATE_FORMAT((select a.estimatedTime from `arrivalflight` a where  a.idDepartureFlight = e.idDepartureFlight), '%d/%m/%Y %H:%i') as char) ) as inBlockTime,
  31. if ((select a.originAirport from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight) is null, '- -',
  32.    (select a.originAirport from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) as aeropuertoL,
  33. if ((select a.iataCompanyCode from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight) is null, '- -',
  34.    (select a.iataCompanyCode from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) as companiaL,
  35. if ((select a.flightNumber from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight) is null, '- -',
  36.    (select a.flightNumber from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) as numVueloL,
  37. if ((select c.pax from `paxmerchandisepost` c where c.idArrivalFlight in (select a.idArrivalFlight from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) is null, '- -', cast((select c.pax from `paxmerchandisepost` c where c.idArrivalFlight in (select a.idArrivalFlight from `arrivalflight` a where a.idDepartureFlight = e.idDepartureFlight)) as char)) as paxL,
  38.        cast(DATE_FORMAT(e.estimatedTime,'%d/%m/%Y %H:%i') as char) as offBlockTime,
  39.        e.iataAirportCode as aeropuertoS,
  40.        e.iataCompanyCode as companiaS,
  41.        e.flightNumber as numVueloS,
  42.        if ((select c.pax from `paxmerchandisepost` c where c.idDepartureFlight = e.idDepartureFlight) is null, '- -',cast((select c.pax from `paxmerchandisepost` c where c.idDepartureFlight = e.idDepartureFlight) as char)) as paxS,
  43.        '- -' as airbridgeUse
  44.            from `departureflight` e where
  45.                e.idDepartureFlight not in (select a.idDepartureFlight from `arrivalflight` a where a.idDepartureFlight is not null and a.estimatedTime >= '2012-10-16 00:00:00' and a.estimatedTime < '2012-10-17 00:00:00')
  46.                and e.estimatedTime >= '2012-10-16 00:00:00' and e.estimatedTime < '2012-10-17 00:00:00' and e.idSituation = '2')
  47.  
  48.    order by inBlockTime desc, offBlockTime desc;
he intentado optimizarla haciendo una subconsulta, porque me parece que elimino algunos select, pero parece que sólo quito unos pocos segundos de consulta, necesito reducir mucho más el tiempo. Os pongo lo que hice en el siguiente mensaje porque no me cabe todo en éste.

No os fijéis en las fechas, son sólo para probar.

Me gustaría saber qué puedo hacer para que vaya más rápido.

Muchas gracias de antemano, un saludo

Última edición por gnzsoloyo; 26/11/2012 a las 07:24 Razón: Mal etiquetado