Suggerirei di scrivere il codice come:
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');
Per questa query, consiglierei gli indici su:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
Le modifiche alla query precedente:
- Mai usa le virgole nel
FROMclausola. Usa sempre uno standard corretto, esplicito , leggibileJOINsintassi. (Ciò non influisce sulle prestazioni, tuttavia.) decode()è piuttosto difficile da seguire. Un sempliceorbooleano è equivalente.BETWEENnon è necessario supponendo chedatetnon è nel futuro.SUM(NVL())non è necessario, perchéNULLi valori vengono ignorati. Se sei preoccupato perNULLrisultato, suggerireiCOALESCE(SUM(dd.amt), 0)