[MySQL] Subqueries, dubbele max() > performance probleem

Pagina: 1
Acties:

  • Quartje
  • Registratie: Oktober 2000
  • Laatst online: 13-05 12:58
Het probleem is als volgt:

Uit de tabel ‘tblSubProgramBid’ dienen voor elke subprogram (SubProgramId) de bids per bedrijf (SubProgramCompanyBidId) geselecteerd te worden welke de meeste recente validate date (SubProgramValidateDate) moet hebben. Wanneer er meerdere bids met gelijke validate date van eenzelfde bedrijf op één bepaald subprogram zijn, dient alleen de bid geselecteerd te worden met de laatste timestamp (SubProgramBidTimeStamp). Elke bid in deze tabel wordt uniek geidentificeerd aan de hand van een SubProgramBidId.

Wat dummy data:

Afbeeldingslocatie: http://home.student.utwente.nl/r.h.m.hakvoort/subquery/example_data_input2.gif

Om dit alles voor elkaar te krijgen heb ik na dagen van gekloot, de volgende query geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT  *
FROM      tblSubProgramBid subprogbid0
WHERE   subprogbid0.SubProgramBidTimeStamp =
    (SELECT   MAX(subprogbid1 .SubProgramBidTimeStamp)
     FROM    tblSubProgramBid subprogbid1 
     WHERE  subprogbid1.SubProgramValidateDate = 
        (SELECT   MAX(subprogbid2 .SubProgramValidateDate) 
        FROM    tblSubProgramBid subprogbid2 
         WHERE  subprogbid1.SubProgramId = subprogbid2.SubProgramId AND 
                  subprogbid1.SubProgramCompanyBidId = subprogbid2.SubProgramCompanyBidId)
     AND subprogbid0.SubProgramId = subprogbid1.SubProgramId AND 
         subprogbid0.SubProgramCompanyBidId = subprogbid1.SubProgramCompanyBidId)
ORDER BY SubProgramId

Dit leidt tot het volgende resultaat:

Afbeeldingslocatie: http://home.student.utwente.nl/r.h.m.hakvoort/subquery/example_data_output2.gif

De huidige testtabel bestaat uit slechts 170 rows. In de toekomst is het de bedoeling dat hier duizenden records in komen te staan. Echter doet de query er nu al 15 seconden over!

Mijn vraag is: Kan deze query geoptimaliseerd worden? Andere constructies bv.?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Je kan je indexen goed zetten (als je dat niet al gedaan hebt), en kijken of je een alternatieve query kan bedenken die joins gebruikt in plaats van subqueries, aangezien joins sneller zijn.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Quartje
  • Registratie: Oktober 2000
  • Laatst online: 13-05 12:58
Ik heb de indices goed gezet en hij blaast er nu over. Oftewel, problem solved :)

Thanks!