Jeg vil foreslå at skrive koden som:
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');
Til denne forespørgsel vil jeg anbefale indekser på:
db(nd_id, a_id, id, datet, code)
dd(dsba_id, datet, v_id)
Ændringerne af ovenstående forespørgsel:
- Aldrig brug kommaer i
FROM
klausul. Brug altid korrekt, eksplicit, standard , læsbarJOIN
syntaks. (Dette påvirker dog ikke ydeevnen.) decode()
er ret svær at følge. En simpel booleskor
er tilsvarende.BETWEEN
er unødvendigt forudsat atdatet
er ikke i fremtiden.SUM(NVL())
er ikke nødvendig, fordiNULL
værdier ignoreres. Hvis du er bekymret overNULL
resultat, vil jeg foreslåCOALESCE(SUM(dd.amt), 0)