如何简化两条SELECT语句以优化存储过程执行效率?
合并查询优化方案
当然可以将这两条语句合并为一条,利用条件聚合实现一次扫描表同时计算出两个结果,避免重复扫描大表带来的额外耗时。
合并后的代码如下:
SELECT SUM(CASE WHEN Cmt.BALANCE_TD < 0 THEN Cmt.BALANCE_TD ELSE 0 END) AS op_overspent_codes, SUM(CASE WHEN Cmt.BALANCE_TD > 0 THEN Cmt.BALANCE_TD ELSE 0 END) AS op_underspent_codes FROM CODES_MONTHLY_TABLE Cmt WHERE Cmt.id = :ip_id AND (Cmt.THEMONTH - 1) = :ip_currentmonth INTO :op_overspent_codes, :op_underspent_codes;
优化说明
- 原代码两次查询会重复扫描符合条件的数据集,合并后仅需一次表扫描,在数据量较大时能大幅降低IO开销。
- 语句依然可以利用已创建的
Cmt.id索引,保证查询效率。 CASE WHEN会分别筛选出余额小于0(超支)和大于0(未超支)的记录,SUM聚合计算各自的总和;余额等于0的记录不影响结果,ELSE 0可确保这类记录不会干扰统计值。
内容的提问来源于stack exchange,提问作者Yuppski
相关产品推荐
相关产品推荐

