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
FROM
clausola. Usa sempre uno standard corretto, esplicito , leggibileJOIN
sintassi. (Ciò non influisce sulle prestazioni, tuttavia.) decode()
è piuttosto difficile da seguire. Un sempliceor
booleano è equivalente.BETWEEN
non è necessario supponendo chedatet
non è nel futuro.SUM(NVL())
non è necessario, perchéNULL
i valori vengono ignorati. Se sei preoccupato perNULL
risultato, suggerireiCOALESCE(SUM(dd.amt), 0)