次のようにコードを書くことをお勧めします:
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)
をお勧めします