Ostatnio wpadla mi w ręce aplikacja pisana przez firmę E***.
Jest to baza danych wolontariuszy wraz z interfejsem www napisanym w PHP, zawierająca ok. 10 tys. użytkowników, kilka tys. projektów itp. Ogólnie nieduża. Kod napisany w pewnym wysokopoziomowym frameworku, MVC, teoretycznie "ładnie". No własnie teoretycznie, bo strony systemu wyświetlały się mniej więcej w 30 do 60 sekund na nieobciążonym systemie. Znalazłem takie kwiatki:
kawałek logu zapytań:
LOG: duration: 0.605 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1611'
LOG: duration: 0.603 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1610'
LOG: duration: 0.719 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1609'
LOG: duration: 0.603 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1608'
LOG: duration: 0.601 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1607'
LOG: duration: 0.627 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1606'
LOG: duration: 0.604 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1605'
LOG: duration: 0.642 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1604'
LOG: duration: 0.627 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1603'
LOG: duration: 0.603 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1602'
LOG: duration: 0.660 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1601'
LOG: duration: 0.605 ms statement: SELECT state FROM volunteergroups WHERE volunteergroupid='1600'
// dalej jeszcze 4 tys. takich linii
Kilka fajnych zapytań SQL:
SELECT DISTINCT m.volunteergroupid, p.name, p.provinceid
FROM vgmembers m, volunteers v, provinces p, volunteergroupscorrect vg, academies a
WHERE vg.volunteergroupid = m.volunteergroupid AND vg.provinceid = p.provinceid AND m.userid = v.volunteerid AND m.leader IS TRUE
ORDER BY m.volunteergroupid, p.name, p.provinceid;
// ^^^^^ zwróćcie uwage na zestaw tabel we FROM i iloczyn kartezjanski
SELECT count(distinct users.userid) FROM
users
LEFT JOIN ...
LEFT JOIN ...
jeszcze 8 kosztownych left joinów;
// ^^^^^ po co te joiny???
Chce Was zapytac, czy Wy też zetknęliście się z tego typu skaszanionym kodem i jak często?
Czy to jest powszechne, czy tylko ta zaprezentowana tu aplikacja jest wybitna? Powyższa aplikacja była zakupiona za niemałą kasę, nie jest to jakiś kod beta.