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?
Is een join niet sneller? Kan je een VIEW maken?
Een string vergelijken met meer dan S... werkt dat?
lijkt mij langzaam... beter pak je van de kolom de eerste letter als nieuwe kolom?
Bij query optimalisatie gaat het er om zo snel mogelijk een vooraf bepaald resultaat te bereiken.
In dit geval heb ik geen idee welk resultaat je met je query wilt bereiken, dus is het ook niet mogelijk om te bepalen hoe dit resultaat in een zo kort mogelijke tijd te bereiken.
Gezien het query deel dat je al geplaatst hebt zou ik je willen adviseren om gebruik te maken van een JOIN.
Een join is sneller idd maar ik wil meer weten welke volgorde van stappen zou je nemen bij een query dat totaal niet geoptimaliseerd is. net als je doet bij normaliseren van je database. maar dan voor de query.
Toevoeging op 20/10/2013 18:22:26:
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.
Gezien het query deel dat je al geplaatst hebt zou ik je willen adviseren om gebruik te maken van een JOIN.
Je doet je naam eer aan, leg mij uit waar de join ontbreekt:
Reshad F op 20/10/2013 18:02:48
SELECT pers_achternaam, pers_voornaam, afdeling_naam
FROM zh_afdeling a, personeel p
Back to topic:
Heel vaak ligt het optimaliseren meer in de manier waarop je de tabellen opzet, met andere woorden het juiste gebruik van indexen, dat wil zeggen zet indexen op kolommen waarop je joint (bij een FK gaat dat vanzelf) en op kolommen die je vrij consequent in de WHERE gebruikt.
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
Ik snap dat opzet van tabellen een belangrijk factor is voor je optimalisatie maar de reden voor mijn vraag is specifiek voor de query zelf want ik heb binnenkort een tentamen over RDBMS en dan krijg je een kant en klaar tabel waar je de query, triggers, views etc zelf moet invullen en het optimaliseren van je query is er een van vandaar dat ik een beetje duidelijke richtlijnen voor mezelf wil maken aan de hand van welke is meest belangrijk en welke komt daarna.. ?
Klopt het overigens dat een zelfde query verschillende snelheden kan hebben als je deze achter elkaar uitvoert?
ik heb namelijk met 1 query resultaten als
13ms
20ms
21ms
17ms
etc
op je tweede antwoord
like 'S%' geeft me alleen de rijen die ook daadwerkelijk een S bevatten maar >= geeft ook alle letters erna dus
Ja dat klopt, en die verschillen die je nu krijgt zijn te verwaralozen, dat heeft meer met de activiteiten op je systeem te maken.
Of je queries voldoende geoptimalisserd zijn te controleren kun je beter via EXLPAIN query, dan heb je meer beeld over wat er gebeurd.
SELECT p.pers_achternaam, p.pers_voornaam, a.afdeling_naam
FROM zh_afdeling AS a
LEFT JOIN personeel AS p ON (a.afdeling_nr = p.pers_afd_toegewezen)
AND p.pers_achternaam >= 'S'
AND a.afdeling_naam = 'Radiologie'
Wat wellicht sneller is... omdat dat sneller dingen wegfiltert en zeker het proberen waard is:
SELECT p.pers_achternaam, p.pers_voornaam, a.afdeling_naam
FROM zh_afdeling AS a
LEFT JOIN personeel AS p ON (p.pers_afd_toegewezen = a.afdeling_nr)
AND a.afdeling_naam = 'Radiologie'
AND p.pers_achternaam >= 'S'
Let ook op het omdraaien van p.pers_afd_toegewezen en a.afdeling_nr.
Daarnaast geef je wel aliassen (p en a) aan, maar gebruik je die niet. Doe dat (uiteraard) wel, zo hoeft SQL niet te gissen welke tabel je bedoelt.
De query zoals in eerste instantie is getoond IS ook een join.
Deze methode is de 'oude' methode en heet impliciete join. Een impliciete join is even snel als de door jou bedoelde join. De join is in dit geval gespecificeerd in de WHERE clause:
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'