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
FROM
clausule. Gebruik altijd de juiste, expliciete, standaard , leesbareJOIN
syntaxis. (Dit heeft echter geen invloed op de prestaties.) decode()
is nogal moeilijk te volgen. Een eenvoudige booleaanseor
is equivalent.BETWEEN
is niet nodig, ervan uitgaande datdatet
is niet in de toekomst.SUM(NVL())
is niet nodig, omdatNULL
waarden worden genegeerd. Als je je zorgen maakt overNULL
resultaat, stel ik voorCOALESCE(SUM(dd.amt), 0)