以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助] CrossTableBuilder 耗时的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=174165)

--  作者:km007
--  发布时间:2022/1/5 3:06:00
--  [求助] CrossTableBuilder 耗时的问题
交叉统计一年(大概 几十万数据销售数据,交叉统计后得出的统计表有 三万多行,如下代码 耗时  667 秒 这效率实在是快奔溃了 请问如何才能 优化 或 提高统计效率?


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20220105030405.png
图片点击可在新窗口打开查看

\'代码如下:--------------------------------------------------------------------------------------------------------------------------------------

Dim st As Date = Date.Now
Dim jb As New SQLJoinTableBuilder("临时测试表1","测试表A")
jb.ConnectionName = _sjymc
jb.AddExp("年份","year(日期)",True)
jb.AddExp("月份","month(日期)",True)
jb.AddExp("客户id","btypeid",True)
jb.AddExp("产品id","PtypeId",True)
\'--------------------------------------------------------------------------------------------------------------------------------------
jb.AddExp("金额","sum(金额)")
jb.AddExp("数量","sum(数量)")
jb.AddExp("毛利","sum(金额) - sum(成本)")
\'--------------------------------------------------------------------------------------------------------------------------------------
jb.Filter = "日期 >= \'2021-01-01\' and 日期 <= \'2021-12-31\' and 编号 in (\'11\',\'26\',\'45\') and 类型 = \'2\'"
\'--------------------------------------------------------------------------------------------------------------------------------------
Dim cb As new CrossTableBuilder("临时测试表",jb.BuildSQL,_sjymc)
cb.HGroups.AddDef("年份")
cb.HGroups.AddDef("月份")
cb.HGroups.AddDef("产品id")
cb.VGroups.AddDef("客户id")
cb.Totals.Adddef("数量")
cb.Totals.AddDef("实销")
cb.Totals.AddDef("毛利")
cb.Totals.AddDef("毛利率")
cb.Build()
\'--------------------------------------------------------------------------------------------------------------------------------------
output.show("耗时: " & (Date.Now - st).TotalSeconds & "秒")
\'--------------------------------------------------------------------------------------------------------------------------------------
MainTable = Tables("临时测试表")
[此贴子已经被作者于2022/1/5 3:07:16编辑过]

--  作者:有点蓝
--  发布时间:2022/1/5 9:56:00
--  
1、减少统计的数据量
2、使用sql直接后台统计


--  作者:狐狸爸爸
--  发布时间:2022/1/5 10:55:00
--  
建议直接用SQLGroupTableBuilder统计,可能会省点时间。
--  作者:km007
--  发布时间:2022/1/5 12:17:00
--  
以下是引用狐狸爸爸在2022/1/5 10:55:00的发言:
建议直接用SQLGroupTableBuilder统计,可能会省点时间。

测试过了,效率没什么差异


这个问题搞了好几天 能想到的方法都测试过了 实在是奔溃吖


--  作者:狐狸爸爸
--  发布时间:2022/1/5 14:00:00
--  
1、首先测试查询花了多少时间:

Sel ect * Fr om  表名 日期 >= \'2021-01-01\' and 日期 <= \'2021-12-31\' and 编号 in (\'11\',\'26\',\'45\') and 类型 = \'2\'

2、其次不单单是数据量(行数),还要看分组数,假如有100个产品,1万个用户,1年12个月,统计一年的数据,就要进行1200万次汇总,可能要几个小时甚至几天才能完成。

可以将数据库和代码发上来,我看看是不是还有别的原因。



--  作者:km007
--  发布时间:2022/1/5 16:26:00
--  
如下:直接用查询表 生成分组统计表,仅花了 7秒多时间  30多万行数据

分组统计行数:313,803

客户id数量:283

产品id数量:4,437

数据库发不上来,我是直接链接客户云服务器数据库的



图片点击可在新窗口打开查看此主题相关图片如下:qq图片20220105161849.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2022/1/5 16:26:39编辑过]

--  作者:有点蓝
--  发布时间:2022/1/5 16:47:00
--  
把查询表数据导入access,做个项目例子发上来测试
--  作者:km007
--  发布时间:2022/1/5 20:39:00
--  
由于论坛上传附件大小限制,仅能 将压缩包分压成 3个了

Access数据库里 明细表我添加了 50万数据 超级慢


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试.part01.rar

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试.part02.rar

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试.part03.rar


[此贴子已经被作者于2022/1/5 20:41:10编辑过]

--  作者:狐狸爸爸
--  发布时间:2022/1/6 8:26:00
--  
我这边测试340秒完成,我看看能否优化,提高一下速度,也许可以,也许不行。

但不管最后是否提速,你这个文件都不应该用交叉统计了,垂直分组列1250个左右,水平分组接近25000个,等于生成了一个1250列25000行的表,系统会随时崩溃,而其中超过90%的单元格是空(冗余)的。

建议采用分组统计,用折叠模式浏览统计结果,我们会改进一下普通数据的折叠模式,之前一列一个分组,改为可以将多列作为一个分组,方便查阅此类数据。
[此贴子已经被作者于2022/1/6 8:28:18编辑过]

--  作者:km007
--  发布时间:2022/1/6 10:35:00
--  
里面的数据我是随意添加的
但生成报表格式就是这样的
横向分组为商品资料
垂直分组为客户名称
统计销售
这种格式很普遍的