Foxtable(狐表)用户栏目专家坐堂 → NB哄哄的分组与交叉统计,统计效率未必NB


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

主题:NB哄哄的分组与交叉统计,统计效率未必NB

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
NB哄哄的分组与交叉统计,统计效率未必NB  发帖心情 Post By:2009/6/22 13:23:00 [显示全部帖子]

      我一直期待的分组与交叉统计的百分比计算功能终于推出了。乍一看确实NB,各种比例的计算,老六考虑的也确实周到。但经过一个上午的测试,其统计效率实在不敢恭维。问题就出在同比、环比等各种比例的计算上。
     以一个近20万条的数据库为例,现按照“年、月”分组、统计“面积”及同比增幅:
     1、用foxtable的分组统计,只要一运行,电脑风扇就开始忽忽的转,进程显示CPU占用基本都在50%以上。统计完成时间大概在20多分钟。
     2、同样的统计项目,如果用SQL的话,只要不到5秒!
     差距怎么会这么大呢?请老六检查并看看是否有改进的空间。
     等会我把数据库及测试实例发上来。

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 13:49:00 [显示全部帖子]

数据库在这里,附件为ACCESS格式,请将其导入到SQL数据库中再测试。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试.rar


测试方法:

1、设置外部数据源,将以下SQL语句复制到新增外部查询表中,点“预览”,不出5秒钟就可看到查询结果:

SELECT a.区间, a.面积 AS 面积_本期, b.面积 AS 面积_同期, CONVERT(numeric(10, 2), CASE WHEN b.面积 <= 0 THEN 0 ELSE (a.面积 / b.面积 - 1) * 100 END) AS 面积_同比 FROM (SELECT CONVERT(varchar(15), replace(str(datepart(year, 日期), 4)+'年'+str(datepart(month, 日期), 2) + '月份', ' ', '0')) AS 区间, SUM(面积) AS 面积 FROM cl_广告明细 GROUP BY CONVERT(varchar(15), replace(str(datepart(year, 日期), 4) + '年' + str(datepart(month, 日期), 2) + '月份', ' ', '0'))) a LEFT OUTER JOIN  (SELECT CONVERT(varchar(15), replace(str(datepart(year, 日期), 4) + '年' + str(datepart(month, 日期), 2) + '月份', ' ', '0')) AS 区间, SUM(面积) AS 面积 FROM cl_广告明细 GROUP BY CONVERT(varchar(15), replace(str(datepart(year, 日期), 4) + '年' + str(datepart(month, 日期), 2) + '月份', ' ', '0'))) b ON CONVERT(int, LEFT(a.区间, 4)) = CONVERT(int, LEFT(b.区间, 4)) + 1 AND SUBSTRING(a.区间, 6, 2) = SUBSTRING(b.区间, 6, 2) order by a.区间

2、如果觉得上面的语句太乱,也可在命令窗口执行以下代码:

    Dim q As new QueryBuilder
    q.TableName = "面积统计"
    Dim bm as string = "convert(varchar(15),replace(str(datepart(year,日期),4)+'年'+str(datepart(month,日期),2)+'月份',' ','0'))"
    Dim yj as string = ("select " & bm & " AS 区间,sum(面积) as 面积 from cl_广告明细 group by " & bm)
Dim sql as string = ("select a.区间,a.面积 as 面积_本期,b.面积 as 面积_同期,convert(numeric(10,2),case when b.面积<=0 then 0 else (a.面积/b.面积-1)*100 end) as 面积_同比 from (" & yj & ") a left join (" & yj & ") b on convert(int,left(a.区间,4))=convert(int,left(b.区间,4))+1 and substring(a.区间,6,2)=substring(b.区间,6,2) order by a.区间")
    q.SelectString = sql
    q.C    '外部数据源名称
    q.Build
    MainTable = Tables("面积统计")

    这是在外部数据载入到foxtable以后、采用QueryBuilder进行统计的,统计时间同样不超过5秒钟!

3、用foxtable本身的分组统计,请按以下设置进行统计。估计需要20分钟左右才能出结果:

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

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 14:44:00 [显示全部帖子]

不知道老六的比例统计是怎样实现的。放着高效的SQL不用,着实有点让人想不通。分组统计、交叉统计无非是由用户定义了一些参数,把它们套用到SQL语句中不就行了吗?
foxtable的定位比较高端,尤其是对大型数据库的支持。几十万条的数据库很常见,查询统计功能必须也要非常高效才行。请老六考虑改进一下。

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 15:01:00 [显示全部帖子]

几十万条的数据库如果一下子加载到foxtable中确实不是一个好的办法,但在实际工作中,这种情况也会经常碰到。比如,要统计连续几年的年度增长率,必须要把这几年的数据都加载进来才行。
现在的问题是,在20万条数据已经加载的情况下,用QueryBuilder和foxtable自身的分组交叉分别进行统计,其效率差别是非常大的。我的意思是,能否改进一下目前的分组、交叉统计。


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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 15:31:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-6-22 15:13:00的发言:


看10楼的回复,Foxtable本身的统计是很高效的,我加了年和月的表达式列,统计你的20万数据,一样可以在几秒钟内统计出来,只是这样的话,同比和环比计算不了,不过这个很容易解决的。

呵呵,如果加了“年”和“月”,就没办法计算比例了。这和之前没更新的分组与交叉统计方法相同,当然很快了。
这个分组统计和交叉统计,确实牛皮!不过,要效率提高了,才算是真正的牛皮。
看老六的意思,估计很快能解决。期待中!

[此贴子已经被作者于2009-6-22 15:32:24编辑过]

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 15:48:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-6-22 15:36:00的发言:

呵呵,速度降低,和占比计算无关的,占比占用的计算时间,绝对不到0.1秒,用旧版本的foxtable统计你的20万数据,一样很久出不来结果的。
这个问题解决了,等下次更新吧。

用旧版统计会很久出不来结果?我印象中,旧版统计还是很快的。
既然已经解决了,就放出来吧。等着用呢图片点击可在新窗口打开查看

通用软件能做到这样的统计分析,绝对是NB!

对了,汇总模式也加上这样的统计功能吧。还有自动隐藏无关列的问题,具体请看这里的2楼:http://www.foxtable.com/dispbbs.asp?boardid=2&Id=3132&page=2。不会是忘记了吧?

[此贴子已经被作者于2009-6-22 15:53:19编辑过]

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 16:12:00 [显示全部帖子]

看这个示意图:

图片点击可在新窗口打开查看此主题相关图片如下:snap4.gif
图片点击可在新窗口打开查看
这是按媒体名称和行业类别分组、对面积和费用进行统计。由于字段太多,需要拉动滚动条才能看到最右边的统计结果,非常非常不方便。建议在生成统计时,只显示媒体名称、行业类别、面积、费用四列(也就是分组列和统计列),其它列全部隐藏。这样看起来就会非常直观。
退出汇总模式时,再显示全部列。

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 16:46:00 [显示全部帖子]

以下是引用kylin在2009-6-22 16:43:00的发言:
这个讨论是有成效的,不错,顶一下!
不过,隐藏无关列,绝对不可以列为自动,应该作为可选项,最多作为可选时默认隐藏,用户根据需要也可以不隐藏的

是的,就是建议加个可选项。
只要老六觉得有意思,那这个问题离解决也就不远了。呵呵


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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 17:00:00 [显示全部帖子]

36秒基本还可以接受。如果再快点就更好了,呵呵
事先加上年月列的话,那这两列就不是日期型的了。还能生成同比与环比数据?
[此贴子已经被作者于2009-6-22 17:00:40编辑过]

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


加好友 发短信 一级勋章
等级:版主 帖子:1991 积分:19363 威望:0 精华:20 注册:2008/9/2 10:09:00
  发帖心情 Post By:2009/6/22 17:07:00 [显示全部帖子]

呵呵,真NB,就是有点不太规范。不是日期列的话,日期分组项目怎么处理?
期待早点用上更新后的版本。因为BUG,我现在无法体验交叉统计的新功能呢

 回到顶部
总数 15 1 2 下一页