Wat zijn nou de vaste regels die je moet opvolgen wanneer je een query-tree wilt optimaliseren?

Stel ik heb de volgende query


SELECT pers_achternaam, pers_voornaam, afdeling_naam

FROM zh_afdeling a, personeel p
WHERE a.afdeling_nr = p.pers_afd_toegewezen

AND pers_achternaam >= 'S'

AND afdeling_naam = 'Radiologie'


wat is nou de volgorde van stappen die je zou volgen?
@Ger ik moet ook inderdaad met EXPLAIN het een en ander doen. Mocht ik er niet uitkomen dan maak ik natuurlijk een topic aan :)
Ger van Steenderen op 20/10/2013 18:37:56

[quote="Reshad F op 20/10/2013 18:21:01"]
in dit geval haal ik alle gebruikers op waarvan de achternaam met een S begint of een letter na de S en vanuit de Radialogie afdeling komt.

Gebruik LIKE 'S%', in principe kan je geen >= gebruiken op een string, dat geeft niet altijd de juiste resultaten
[/quote]
Merk wel op dat dat iets anders oplevert dan het voorbeeld. LIKE 'S%' geeft alles dat begint met een S, >= 'S' geeft ook de T en alles daarna.

Over het algemeen als je hebt over queries versnellen zijn er twee zaken van belang:
1) de juiste indexen hebben en die correct gebruiken
2) zo snel mogelijk je dataset verkleinen binnen de query

De eerste is over het algemeen het belangrijkst (geeft de meeste versnelling), maar de tweede moet je ook niet onderschatten. Zeker als je door middel van bepaalde berekeningen rijen wilt selecteren, dan is het zonder meer van belang om je dataset al te verkleinen voor je de berekening uitvoert. Ik heb hier zeer aanmerkelijke versnellingen mee gezien, die via simpele indexen niet te behalen zouden zijn.

Erwin H op 21/10/2013 16:57:37

...de tweede moet je ook niet onderschatten. Zeker als je door middel van bepaalde berekeningen rijen wilt selecteren, dan is het zonder meer van belang om je dataset al te verkleinen voor je de berekening uitvoert. ...


Kan je een voorbeeld geven?
Iets groot, en wat je er van gemaakt hebt (of zo)

Een voorbeeld is een query op een database met coordinaten. Stel je wilt alle locaties hebben binnen een straal van 5 km rondom een willekeurige plek. Als je dat precies wilt uitrekenen zal je een berkening moeten uitvoeren op alle coordinaten in de database. Hierbij kunnen indexen niet gebruikt worden, omdat die helemaal niets zeggen over de uitkomst van de berekening. Je zal de berekening dus echt op alle records moeten doen.

Als je echter eerst alleen de locaties selecteert die binnen een 10km bij 10km vierkant vallen waarvan de willekeurige plek het middelpunt is, dan verklein je je dataset aanzienlijk en die selectie kan wel via een index gebeuren. Dan doe je namelijk een simpele <= en => vergelijking. Vervolgens hoef je dan op een veel kleinere dataset de berekening uit te voeren.
O ja, zo.

Het voorbeeld dat je geeft, ben ik ook al tegengekomen.
Ik deed dit ook in twee stappen: eerst een vierkant gebied afbakenen. Dat rekent gemakkelijk, gewoon een min en max lng en lat.
en dan daarbinnen de berekening voor de cirkel.
Ook een fout die nog weleens gemaakt wordt

.... WHERE delivery_date + INTERVAL 15 day >= CURRENT_DATE

Moet zijn:

.... WHERE delivery_date >= CURRENT_DATE - INTERVAL 15 day

Reageren