Oracle
 sql >> Base de données >  >> RDS >> Oracle

Optimisation des performances d'une instruction DECODE() dans une clause WHERE

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 , lisible JOIN syntaxe. (Cela n'affecte cependant pas les performances.)
  • decode() est assez difficile à suivre. Un simple booléen or est équivalent.
  • BETWEEN n'est pas nécessaire en supposant que datet n'est pas dans le futur.
  • SUM(NVL()) n'est pas nécessaire, car NULL les valeurs sont ignorées. Si vous êtes préoccupé par NULL résultat, je suggérerais COALESCE(SUM(dd.amt), 0)