Foxtable(狐表)用户栏目专家坐堂 → [求助] CrossTableBuilder 耗时的问题


  共有4870人关注过本帖树形打印复制链接

主题:[求助] CrossTableBuilder 耗时的问题

帅哥哟,离线,有人找我吗?
km007
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:481 积分:5783 威望:0 精华:0 注册:2016/1/28 2:59:00
[求助] CrossTableBuilder 耗时的问题  发帖心情 Post By:2022/1/5 3:06:00 [只看该作者]

交叉统计一年(大概 几十万数据销售数据,交叉统计后得出的统计表有 三万多行,如下代码 耗时  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编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/1/5 9:56:00 [只看该作者]

1、减少统计的数据量
2、使用sql直接后台统计


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2022/1/5 10:55:00 [只看该作者]

建议直接用SQLGroupTableBuilder统计,可能会省点时间。

 回到顶部
帅哥哟,离线,有人找我吗?
km007
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:481 积分:5783 威望:0 精华:0 注册:2016/1/28 2:59:00
  发帖心情 Post By:2022/1/5 12:17:00 [只看该作者]

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

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


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


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:481 积分:5783 威望:0 精华:0 注册:2016/1/28 2:59:00
  发帖心情 Post By:2022/1/5 16:26:00 [只看该作者]

如下:直接用查询表 生成分组统计表,仅花了 7秒多时间  30多万行数据

分组统计行数:313,803

客户id数量:283

产品id数量:4,437

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



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

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/1/5 16:47:00 [只看该作者]

把查询表数据导入access,做个项目例子发上来测试

 回到顶部
帅哥哟,离线,有人找我吗?
km007
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:481 积分:5783 威望:0 精华:0 注册:2016/1/28 2:59:00
  发帖心情 Post By:2022/1/5 20:39:00 [只看该作者]

由于论坛上传附件大小限制,仅能 将压缩包分压成 3个了

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


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

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

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


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

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2022/1/6 8:26:00 [只看该作者]

我这边测试340秒完成,我看看能否优化,提高一下速度,也许可以,也许不行。

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

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

 回到顶部
帅哥哟,离线,有人找我吗?
km007
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:481 积分:5783 威望:0 精华:0 注册:2016/1/28 2:59:00
  发帖心情 Post By:2022/1/6 10:35:00 [只看该作者]

里面的数据我是随意添加的
但生成报表格式就是这样的
横向分组为商品资料
垂直分组为客户名称
统计销售
这种格式很普遍的

 回到顶部
总数 23 1 2 3 下一页