SQL累计求和的优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL累计求和的优化相关的知识,希望对你有一定的参考价值。

select ADDVCD , yyyy,mm,dt,
--当日数据
day_w,
--月累计
(select sum(day_w) from
(select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt)
where ADDVCD=t.ADDVCD and yyyy=t.yyyy and mm=t.mm and dt<=t.dt)
as mm_w,
--年累计
(select sum(day_w) from
(select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt)
where ADDVCD=t.ADDVCD and yyyy=t.yyyy and dt<=t.dt)
as yyyy_w
from (select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt) t

请问大家,我上面这个累计月、年求和的sql 执行效率很慢,如何可以优化呢,请指教
不使用月累计和年累计的情况下,为10000条数据,执行速度20秒

参考技术A 你可以试试先为下面这句sql建立个视图
select substr(MP_CD,1,6) as ADDVCD,to_char(DT,'YYYY-MM-dd') as dt,substr(to_char(DT,'YYYY-MM-dd'),1,4) as yyyy,substr(to_char(DT,'YYYY-MM-dd'),1,7) as mm,SUM(DAY_W) as day_w from SERVER.wr_day_w_r group by substr(MP_CD,1,6),to_char(DT,'YYYY-MM-dd') order by ADDVCD,dt

然后再进行其他累计的查询。追问

真正慢的地方应该是累计的 sum函数 每一行都要都要计算sum 这个有办法破么

追答

所以就应该建立一个视图索引让其提前完成一部分的统计,而且只一句sql我见你是反复使用的。

追问

我已经知道问题出在索引身上了,子查询是不能用了,视图也建不了索引,愁人

追答

为什么建立不了视图?

追问

要建一个视图索引?

参考技术B 用 join 或者case会很快啊追问

真真慢的地方应该是累计的 sum函数 每一行都要都要计算sum 这个有办法破么

追答

朋友,就是用case呀 给你个例子
select rq ,
sum(case when shengfu ='胜' then 1 else 0 end) as 胜 ,
sum(case when shengfu ='负'then 1 else 0 end)as 负
from #tmp group by rq

追问

你这是一个逻辑判断 如果shengfu这一列 是胜那么sum+1 如果是负那么sum+0 是对胜负的一个统计 我这里直接计算数值 每一行都进行计算 累加满足条件的1-200条数据。用不了这个case哦 谢谢了

Sql server 数量累计求和

declare @电量表 table(日期 int,日发电量 float, 计划发电量 float,日均发电量 float) 
insert into @电量表 select 1,3.8788,null,3.8024  
insert into @电量表 select 2,3.8846 ,null,3.8024  
insert into @电量表 select 3,3.7841 ,null,3.8024  
insert into @电量表 select 4,3.7946,null,3.8024  
insert into @电量表 select 5,3.7672,null,3.8024  
insert into @电量表 select 6,3.7178,null,3.8024  
insert into @电量表 select 7, 3.7871,null,3.8024  
SELECT M.日期,SUM(DL.日发电量) AS 电量累计
    FROM @电量表 DL    
    INNER JOIN      
    (SELECT * FROM @电量表) M    
  ON (DL.日期 <= M.日期)    
  --WHERE  M.日期 <= 7     
    GROUP BY M.日期, M.日发电量 
ORDER BY m.日期 

以上是关于SQL累计求和的优化的主要内容,如果未能解决你的问题,请参考以下文章

Sql server 数量累计求和

Sql Server CPU 性能排查及优化

sql查询按时间累计

需要帮助优化 SQL 查询

SQL语句优化

sql对查询结果求和