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
FROM
cláusula. Utilice siempre mensajes estándar adecuados, explícitos , legibleJOIN
sintaxis. (Sin embargo, esto no afecta el rendimiento). decode()
es bastante difícil de seguir. Un simple booleanoor
es equivalente.BETWEEN
es innecesario asumiendo quedatet
no está en el futuro.SUM(NVL())
no es necesario, porqueNULL
los valores son ignorados. Si le preocupaNULL
resultado, sugeriríaCOALESCE(SUM(dd.amt), 0)