Jag skulle föreslå att du skriver koden som:
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 den här frågan skulle jag rekommendera index på:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
Ändringarna av ovanstående fråga:
- Aldrig använd kommatecken i
FROMklausul. Använd alltid korrekt, tydlig, standard , läsbarJOINsyntax. (Detta påverkar dock inte prestandan.) decode()är ganska svårt att följa. En enkel booleskorär likvärdig.BETWEENär onödigt om man antar attdatetär inte i framtiden.SUM(NVL())behövs inte eftersomNULLvärden ignoreras. Om du är orolig förNULLresultat skulle jag föreslåCOALESCE(SUM(dd.amt), 0)