Ik stel voor om de code te schrijven als:
SELECT SUM(dd.amt)
FROM db JOIN
dd
ON db.id = dd.dsba_id
WHERE dd.nd_id = xxxxxxx AND
dd.a_id = 'xxxxx-xx' AND
(db.v_id = xxxxxxxxx OR db.code = 'COMPLETE') AND
db.datet >= trunc(sysdate, 'YEAR');
Voor deze vraag raad ik indexen aan op:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
De wijzigingen in de bovenstaande zoekopdracht:
- Nooit gebruik komma's in de
FROMclausule. Gebruik altijd de juiste, expliciete, standaard , leesbareJOINsyntaxis. (Dit heeft echter geen invloed op de prestaties.) decode()is nogal moeilijk te volgen. Een eenvoudige booleaanseoris equivalent.BETWEENis niet nodig, ervan uitgaande datdatetis niet in de toekomst.SUM(NVL())is niet nodig, omdatNULLwaarden worden genegeerd. Als je je zorgen maakt overNULLresultaat, stel ik voorCOALESCE(SUM(dd.amt), 0)