Je suggérerais d'écrire le code comme suit :
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');
Pour cette requête, je recommanderais des index sur :
db(nd_id, a_id, id, datet, code)
dd(dsba_id, datet, v_id)
Les modifications apportées à la requête ci-dessus :
- Jamais utilisez des virgules dans le
FROM
clause. Utilisez toujours des informations appropriées, explicites et standard , lisibleJOIN
syntaxe. (Cela n'affecte cependant pas les performances.) decode()
est assez difficile à suivre. Un simple booléenor
est équivalent.BETWEEN
n'est pas nécessaire en supposant quedatet
n'est pas dans le futur.SUM(NVL())
n'est pas nécessaire, carNULL
les valeurs sont ignorées. Si vous êtes préoccupé parNULL
résultat, je suggéreraisCOALESCE(SUM(dd.amt), 0)