SQL多层查询后再用窗口,求累计和,代码运行速度特别慢,求简化方案,多谢了
SQL多层查询后再用窗口,求累计和,代码运行速度特别慢,求简化方案,谢谢了
代码目的如下,对一组数据根据条件分组求和,然后每行求和的结果/整列和 的百分比,然后从大到小排序,再求累加,最后给分类的名字。(其实就是做ABC Analysis的思路)。
大概结构是这样:
select * from(
【原始代码】
) as d
然后生成窗口,再运行累加的计算,就是累加这步计算特别慢。
原始代码的结果如下:

我现在的代码,如下
create view acc as ’生成窗口
select * from
(
select *,rownum=row_number() over (order by [%Value] desc) from ‘给一列序列号
(
select *,
(A.TotalCA/B.SUMValue) AS [%Value],
(A.TotalKG/B.SUMVolume) as [%Volume]
FROM(
select [Supply Chain],[Region],[Mat type name],[Plant],[Mat name],[MONTH],
SUM([Vol INV total KG]) as TotalKG,
SUM([Val INV total CA]) AS TotalCA
from [INVENTORY$]
GROUP BY [Supply Chain],[Region],[Mat type name],[Plant],[Mat name],[Month]
)A,
(select sum([Val INV total CA]) AS SUMValue,
sum([Vol INV total KG]) as SUMVolume
FROM [INVENTORY$])B
) as c
) as d
然后在另外一个SQL窗口输入如下代码用于求累加的结果:
select *, (select sum([%Value]) from acc as e where rownum<= f.rownum) as accumulaSumVal
from acc as f
能运行,但是速度特别慢,一个多小时才出来不到600行,平常用SQL都是很快的,所以我想是因为用了窗口所以慢还是因为什么? 我原始数据有200,000多行,实在不行。
求各位高手指教。
------解决思路----------------------
这种不断累加的计算,其实用sql来实现,效率还是比较低的。
在sql server 2012中新增了一部分分析函数,其中对 sum函数做了扩展,可以通过 sum(v) over(partition by ... order by ...)
对列v的值进行累计求和,效率 应该会比 单一的 rownum<= f.rownum 来的快一点。
建议实在不行,就用游标来实现,可以做到 只对表扫描1遍,就可以达到累计求和的目的,速度应该会提高上百倍
代码目的如下,对一组数据根据条件分组求和,然后每行求和的结果/整列和 的百分比,然后从大到小排序,再求累加,最后给分类的名字。(其实就是做ABC Analysis的思路)。
大概结构是这样:
select * from(
【原始代码】
) as d
然后生成窗口,再运行累加的计算,就是累加这步计算特别慢。
原始代码的结果如下:
我现在的代码,如下
create view acc as ’生成窗口
select * from
(
select *,rownum=row_number() over (order by [%Value] desc) from ‘给一列序列号
(
select *,
(A.TotalCA/B.SUMValue) AS [%Value],
(A.TotalKG/B.SUMVolume) as [%Volume]
FROM(
select [Supply Chain],[Region],[Mat type name],[Plant],[Mat name],[MONTH],
SUM([Vol INV total KG]) as TotalKG,
SUM([Val INV total CA]) AS TotalCA
from [INVENTORY$]
GROUP BY [Supply Chain],[Region],[Mat type name],[Plant],[Mat name],[Month]
)A,
(select sum([Val INV total CA]) AS SUMValue,
sum([Vol INV total KG]) as SUMVolume
FROM [INVENTORY$])B
) as c
) as d
然后在另外一个SQL窗口输入如下代码用于求累加的结果:
select *, (select sum([%Value]) from acc as e where rownum<= f.rownum) as accumulaSumVal
from acc as f
能运行,但是速度特别慢,一个多小时才出来不到600行,平常用SQL都是很快的,所以我想是因为用了窗口所以慢还是因为什么? 我原始数据有200,000多行,实在不行。
求各位高手指教。
------解决思路----------------------
这种不断累加的计算,其实用sql来实现,效率还是比较低的。
在sql server 2012中新增了一部分分析函数,其中对 sum函数做了扩展,可以通过 sum(v) over(partition by ... order by ...)
对列v的值进行累计求和,效率 应该会比 单一的 rownum<= f.rownum 来的快一点。
建议实在不行,就用游标来实现,可以做到 只对表扫描1遍,就可以达到累计求和的目的,速度应该会提高上百倍