A tünet
A napi működés egyik legfontosabb riportja 306 másodperc alatt töltődött be. Öt perc nem egyszerűen lassú: operatív környezetben azt jelenti, hogy az emberek nem használják a riportot. Inkább telefonálnak, külön listát vezetnek vagy emlékezetből döntenek.
A kézenfekvő magyarázat a növekvő adatmennyiség vagy a kevés szerverkapacitás volt. A végrehajtási terv viszont mást mutatott.
Mit mutatott a végrehajtási terv
A lekérdezés logikailag jól elkülönített építőelemekből állt, de több ponton ugyanazokra a költséges köztes eredményekre támaszkodott. A végrehajtási tervből kiderült, hogy az adatbázismotor ezeket nem egyszer számította ki és használta fel újra: több végrehajtási ágon ismételten elvégezte ugyanazokat a kapcsolásokat, szűréseket és összesítéseket.
A forráskód ezért áttekinthetőnek látszott, a tényleges végrehajtás mégis sokszorosan elvégezte ugyanazt a munkát. A szűk keresztmetszet nem egyetlen hibás utasítás volt, hanem a lekérdezés egészének végrehajtási szerkezete.
A változtatás
Az üzleti szabályokhoz nem nyúltunk. A lekérdezést egyértelmű végrehajtási fázisokra bontottuk:
- A költséges, többször használt köztes eredményeket egyszer állítottuk elő, majd indexelhető struktúrában használtuk tovább.
- A szűréseket a lehető legkorábbi biztonságos pontra helyeztük.
- Az indexeket a tényleges összekapcsolási és szűrési mintákhoz igazítottuk.
- Minden módosításnál összevetettük az eredeti és az új eredményhalmazt.
Az optimalizálás legfontosabb korlátja az volt, hogy a riport jelentése nem változhat. A gyors, de mást számoló lekérdezés nem optimalizálás, hanem hiba.
Az eredmény
| Mérés | Előtte | Utána |
|---|---|---|
| Válaszidő | 306 s | 0,4 s |
| Gyorsulás | — | 765× |
| Üzleti logika | eredeti | változatlan |
Nem kellett nagyobb szerver, adatbáziscsere vagy új riporting-platform. A megoldás a végrehajtási terv helyes értelmezése és a lekérdezés szerkezetének megváltoztatása volt.
Ha a kimutatása öt percig tölt, az sokszor nem a szerver hibája, hanem a lekérdezés szerkezete — és ez a rendszer cseréje nélkül is javítható.