Бих предложил да напишете кода като:
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');
За тази заявка бих препоръчал индекси на:
db(nd_id, a_id, id, datet, code)dd(dsba_id, datet, v_id)
Промените в горната заявка:
- Никога използвайте запетаи в
FROMклауза. Винаги използвайте правилно, изрично, стандартно , четимоJOINсинтаксис. (Това обаче не засяга производителността.) decode()е доста трудно за следване. Обикновено булевоorе еквивалентен.BETWEENе ненужен, ако приемем, чеdatetне е в бъдещето.SUM(NVL())не е необходимо, защотоNULLстойностите се игнорират. Ако сте загрижени заNULLрезултат, бих предложилCOALESCE(SUM(dd.amt), 0)