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 , lesbaresJOIN
Syntax. (Dies wirkt sich jedoch nicht auf die Leistung aus.) decode()
ist ziemlich schwer zu folgen. Ein einfacher boolescheror
ist gleichwertig.BETWEEN
ist unnötig, vorausgesetzt, dassdatet
liegt nicht in der Zukunft.SUM(NVL())
wird nicht benötigt, daNULL
Werte werden ignoriert. Wenn Sie wegenNULL
besorgt sind Als Ergebnis würde ichCOALESCE(SUM(dd.amt), 0)
vorschlagen