Sugiro escrever o código como:
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');
Para esta consulta, eu recomendaria índices em:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
As alterações na consulta acima:
- Nunca use vírgulas no
FROMcláusula. Sempre use apropriado, explícito, padrão , legívelJOINsintaxe. (No entanto, isso não afeta o desempenho.) decode()é bastante difícil de seguir. Um simples booleanooré equivalente.BETWEENé desnecessário assumindo quedatetnão está no futuro.SUM(NVL())não é necessário, porqueNULLvalores são ignorados. Se você está preocupado comNULLresultado, sugiroCOALESCE(SUM(dd.amt), 0)