Oracle性能优化:能否单查询计算COMPLETED_AMOUNT与PENDING_AMOUNT?
如何在单查询中高效计算COMPLETED_AMOUNT和PENDING_AMOUNT
当然可以在单个查询里同时计算这两个金额!你当前的写法其实已经实现了单查询目标,但考虑到你提到的性能顾虑,我推荐用条件聚合的方式来优化——这种方法只需要扫描一次EFT_TABLE,比你当前两次相关子查询的写法性能提升明显,尤其当EFT_TABLE数据量较大时。
优化后的查询示例
假设你PENDING_AMOUNT的条件是类似J.COLUMN4 = 'Y'这类(你可以根据实际需求替换),优化后的语句如下:
SELECT D.COLUMN5, D.COLUMN2, -- 计算COMPLETED_AMOUNT:匹配指定条件时累加金额,否则加0 SUM(CASE WHEN J.COLUMN4 = 'N' AND J.COLUMN6 = 'CL' AND J.COLUMN7 = 'B' THEN J.AMOUNT ELSE 0 END) AS COMPLETED_AMOUNT, -- 计算PENDING_AMOUNT:替换成你的实际判断条件 SUM(CASE WHEN J.COLUMN4 = 'Y' AND J.COLUMN6 = 'PN' AND J.COLUMN7 = 'B' THEN J.AMOUNT ELSE 0 END) AS PENDING_AMOUNT FROM 你的主表名 D -- 替换为你实际的主表名称 LEFT JOIN EFT_TABLE J ON J.COLUMN1 = D.COLUMN1 AND J.COLUMN2 = D.COLUMN2 AND J.COLUMN3 = D.COLUMN3 AND J.COLUMN5 = D.COLUMN5 GROUP BY D.COLUMN5, D.COLUMN2;
为什么这个方案更优?
- 你的原写法会对主表
D的每一行执行两次独立的子查询,相当于重复扫描EFT_TABLE多次; - 优化后的
LEFT JOIN只关联一次EFT_TABLE,再通过CASE语句在SUM中做条件判断,一次性完成两个金额的计算,大幅减少了表扫描的次数,性能更出色; - 完全符合你“单查询实现”且不降低性能的要求,逻辑也清晰易懂。
内容的提问来源于stack exchange,提问作者dursun öztürk
相关产品推荐
相关产品推荐

