Navrhoval bych napsat kód jako:
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');
Pro tento dotaz bych doporučil indexy na:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
Změny ve výše uvedeném dotazu:
- Nikdy použijte čárky v
FROMdoložka. Vždy používejte správné, explicitní, standardní , čitelnéJOINsyntax. (To však nemá vliv na výkon.) decode()je poměrně těžké sledovat. Jednoduchý booleovskýorje ekvivalentní.BETWEENje zbytečné za předpokladu, žedatetnení v budoucnosti.SUM(NVL())není potřeba, protožeNULLhodnoty jsou ignorovány. Pokud vás znepokojujeNULLvýsledek bych navrhovalCOALESCE(SUM(dd.amt), 0)