Yo sugeriría escribir el 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, recomendaría índices en:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
Los cambios a la consulta anterior:
- Nunca use comas en
FROMcláusula. Utilice siempre mensajes estándar adecuados, explícitos , legibleJOINsintaxis. (Sin embargo, esto no afecta el rendimiento). decode()es bastante difícil de seguir. Un simple booleanoores equivalente.BETWEENes innecesario asumiendo quedatetno está en el futuro.SUM(NVL())no es necesario, porqueNULLlos valores son ignorados. Si le preocupaNULLresultado, sugeriríaCOALESCE(SUM(dd.amt), 0)