Tôi khuyên bạn nên viết mã dưới dạng:
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');
Đối với truy vấn này, tôi muốn giới thiệu các chỉ mục trên:
-
db(nd_id, a_id, id, datet, code)
-
dd(dsba_id, datet, v_id)
Các thay đổi đối với truy vấn trên:
- Không bao giờ sử dụng dấu phẩy trong
FROM
mệnh đề. Luôn sử dụng đúng, rõ ràng, tiêu chuẩn , có thể đọc đượcJOIN
cú pháp. (Tuy nhiên, điều này không ảnh hưởng đến hiệu suất.) -
decode()
khá khó để theo dõi. Một boolean đơn giảnor
tương đương. -
BETWEEN
là không cần thiết giả định rằngdatet
không có trong tương lai. -
SUM(NVL())
không cần thiết, vìNULL
các giá trị bị bỏ qua. Nếu bạn lo lắng vềNULL
kết quả, tôi sẽ đề xuấtCOALESCE(SUM(dd.amt), 0)