Sugerowałbym napisanie kodu jako:
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');
Dla tego zapytania polecam indeksy na:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
Zmiany w powyższym zapytaniu:
- Nigdy użyj przecinków w
FROMklauzula. Zawsze używaj właściwego, wyraźnego, standardowego , czytelneJOINskładnia. (Nie wpływa to jednak na wydajność). decode()jest raczej trudna do naśladowania. Prosty logicznyorjest równoważne.BETWEENjest niepotrzebne przy założeniu, żedatetnie jest w przyszłości.SUM(NVL())nie jest potrzebne, ponieważNULLwartości są ignorowane. Jeśli martwisz się oNULLwynik, sugerowałbymCOALESCE(SUM(dd.amt), 0)