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
FROMclause. Utilisez toujours des informations appropriées, explicites et standard , lisibleJOINsyntaxe. (Cela n'affecte cependant pas les performances.) decode()est assez difficile à suivre. Un simple booléenorest équivalent.BETWEENn'est pas nécessaire en supposant quedatetn'est pas dans le futur.SUM(NVL())n'est pas nécessaire, carNULLles valeurs sont ignorées. Si vous êtes préoccupé parNULLrésultat, je suggéreraisCOALESCE(SUM(dd.amt), 0)