Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Leistungsoptimierung einer DECODE()-Anweisung in einer WHERE-Klausel

Ich würde vorschlagen, den Code wie folgt zu schreiben:

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');

Für diese Abfrage würde ich Indizes empfehlen auf:

  • db(nd_id, a_id, id, datet, code)
  • dd(dsba_id, datet, v_id)

Die Änderungen an der obigen Abfrage:

  • Niemals Verwenden Sie Kommas im FROM Klausel. Verwenden Sie immer den richtigen, expliziten Standard , lesbares JOIN Syntax. (Dies wirkt sich jedoch nicht auf die Leistung aus.)
  • decode() ist ziemlich schwer zu folgen. Ein einfacher boolescher or ist gleichwertig.
  • BETWEEN ist unnötig, vorausgesetzt, dass datet liegt nicht in der Zukunft.
  • SUM(NVL()) wird nicht benötigt, da NULL Werte werden ignoriert. Wenn Sie wegen NULL besorgt sind Als Ergebnis würde ich COALESCE(SUM(dd.amt), 0) vorschlagen