楼主: 〇〇

用c实现group by cube的思路

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
发表于 2010-2-18 22:34 | 只看该作者
你的程序和GROUP BY CUBE不等价。

例子:
create table t (c1 varchar2(10),c2 varchar2(10), c3 varchar2(10), amount number);

故意插入一个空列:
insert into t values (1,2,null,1);

select c1,c2,c3,sum(amount) from t group by cube(c1,c2,c3);
C1                   C2                   C3                   SUM(AMOUNT)
-------------------- -------------------- -------------------- -----------
                                                                         1
                                                                         1
                     2                                                   1
                     2                                                   1
1                                                                        1
1                                                                        1
1                    2                                                   1
1                    2                                                   1

8 rows selected.

可以看到有些重复的行,而你的程序会把它们归并到一起。

三个列的组合你似乎写得很辛苦了,四个列应付得了吗?

再给你出个难题:
COUNT(DISTINCT C4)这样的能实现吗?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
12#
发表于 2010-2-18 23:06 | 只看该作者
如果分组的结果有很多,ORACLE会用HASH GROUP BY, 也就是用HASH表来实现快速查找,这也比你的二叉树更高效。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
13#
发表于 2010-2-19 10:28 | 只看该作者
原帖由 newkid 于 2010-2-18 22:34 发表
你的程序和GROUP BY CUBE不等价。

例子:
create table t (c1 varchar2(10),c2 varchar2(10), c3 varchar2(10), amount number);

故意插入一个空列:
insert into t values (1,2,null,1);

select c1,c2,c3,sum(amount) from t group by cube(c1,c2,c3);
C1                   C2                   C3                   SUM(AMOUNT)
-------------------- -------------------- -------------------- -----------
                                                                         1
                                                                         1
                     2                                                   1
                     2                                                   1
1                                                                        1
1                                                                        1
1                    2                                                   1
1                    2                                                   1

8 rows selected.

可以看到有些重复的行,而你的程序会把它们归并到一起。

三个列的组合你似乎写得很辛苦了,四个列应付得了吗?

再给你出个难题:
COUNT(DISTINCT C4)这样的能实现吗?

看我的数据定义,primary key,不可以null的吧?
另外,我还是没彻底弄懂,你上边的列表,什么也没归并啊?都单列着呢?
逻辑上,比如,统计各地区,各民族,各党派的代表人数,不可以null的吧?即使无党派也要给一个代码的吧?
即使有一个null,把它统计在任何党派也不错吧?算法再完善一下(任意党派代码0,数据库里不要用,在DAU里null代码是0x80000000,这样就归并不到一起了)?实在不行,你就用group by cube好了。
C没什么不可以做的,方便就做,不方便你完全可以SQL,ORACLE引擎内部也是C啊。
C写程序是比较费事,我们做一些公用程序可以一定程度减轻负担。怎么方便怎么用,看程序员的了。

“三个列的组合你似乎写得很辛苦了,四个列应付得了吗?”,复制-粘贴吧,两句一项,不怕费事就行。

你一定要用C解决任意语法问题,好办啊,写一个语言解释器,编排执行计划和状态机,处理数据buff,优化策略。。。。。

[ 本帖最后由 yulihua49 于 2010-2-19 10:57 编辑 ]

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
14#
发表于 2010-2-19 11:04 | 只看该作者
原帖由 newkid 于 2010-2-18 23:06 发表
如果分组的结果有很多,ORACLE会用HASH GROUP BY, 也就是用HASH表来实现快速查找,这也比你的二叉树更高效。

那我也可以hash啊?不就是算法吗?那要看花多少代价,得多少性能,合算不。我不是给你直接使用group by cube的例子吗?谁也没禁止你啊!不是OO非要弄一个C程序的吗?我的意思是可以,好坏他自己测测看嘛,哪个好用哪个呗。
再说,我的程序固然比SQL复杂,但比OO同事的那个简单多了,好懂多了,也容易改成其它需要的场合。

[ 本帖最后由 yulihua49 于 2010-2-19 11:09 编辑 ]

使用道具 举报

回复
论坛徽章:
4
15#
发表于 2010-2-19 16:08 | 只看该作者
mark!

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
16#
发表于 2010-2-19 22:46 | 只看该作者
"看我的数据定义,primary key,不可以null的吧?"
哦,昨天没看到你还定义了主键。也就是说你这程序是专门为非空列服务的?我还以为你要写一个任意三列的CUBE。
话说回来,假如真有这么一个主键,在这组合上聚合没有任何意义,因为已经是唯一的了。

"另外,我还是没彻底弄懂,你上边的列表,什么也没归并啊?都单列着呢?"
我另一贴不是给了你解释吗?这个CUBE相当于做八次的GROUP BY, 然后用UNION ALL合并起来。因为我的例子聚合结果只有一行,总共就是八行。虽然你看到有些行是相同的,但有的数据本身就是NULL, 有的NULL则是组合的结果,此NULL非彼NULL, 用下面可以看到区别:
select c1,c2,c3,sum(amount),GROUPING(c1),GROUPING(c2),GROUPING(c3)
from t group by cube(c1,c2,c3);

"逻辑上,比如,统计各地区,各民族,各党派的代表人数,不可以null的吧?即使无党派也要给一个代码的吧?"
NULL是无可替代的。别忘了还有“非代码”型数据,比如日期、数字。既然你要实现CUBE就要实现完全等价的功能。

"即使有一个null,把它统计在任何党派也不错吧?"
幸亏SQL标准不是你定的,否则就天下大乱了。NULL可以等同于任何数据?

"实在不行,你就用group by cube好了。
C没什么不可以做的,方便就做,不方便你完全可以SQL,ORACLE引擎内部也是C啊。"
你应该很清楚我是ORACLE卫道士,所以如果有人要DIY实现ORACLE原有的功能我就准备挑剔一番。


“三个列的组合你似乎写得很辛苦了,四个列应付得了吗?”,复制-粘贴吧,两句一项,不怕费事就行。
似乎没那么简单吧?我看你用了格雷码的思路,每次只修改一项。不久前我用SQL写了一个自动生成所有组合的:
http://www.itpub.net/viewthread.php?tid=1268254

"你一定要用C解决任意语法问题,好办啊,写一个语言解释器,编排执行计划和状态机,处理数据buff,优化策略。。。。。

那我也可以hash啊?不就是算法吗?那要看花多少代价,得多少性能,合算不。我不是给你直接使用group by cube的例子吗?谁也没禁止你啊!不是OO非要弄一个C程序的吗?我的意思是可以,好坏他自己测测看嘛,哪个好用哪个呗。
再说,我的程序固然比SQL复杂,但比OO同事的那个简单多了,好懂多了,也容易改成其它需要的场合。"

呵呵,还是刚才那句话,如果你要DIY我就准备找茬。OO同事的程序相当于一种报表定义语言的解释器,跟CUBE其实没什么关系。

[ 本帖最后由 newkid 于 2010-2-20 00:21 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
17#
发表于 2010-2-20 07:20 | 只看该作者
我观察了GROUP BY CUBE 的执行计划,发现ORACLE很灵活多变,有时候是SORT GROUP BY, 有时候是HASH GROUP BY,有时又是 SORT GROUP BY ROLL UP 或 GENERATE CUBE, 基本上你所有的小聪明伎俩它都考虑到了,不服不行。
同样是C语言,SQL引擎访问数据是直接在内存中的,不像DAU还隔了一层,所以你要超过它是很难的。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
18#
 楼主| 发表于 2010-2-20 09:20 | 只看该作者
原帖由 newkid 于 2010-2-20 07:20 发表
我观察了GROUP BY CUBE 的执行计划,发现ORACLE很灵活多变,有时候是SORT GROUP BY, 有时候是HASH GROUP BY,有时又是 SORT GROUP BY ROLL UP 或 GENERATE CUBE, 基本上你所有的小聪明伎俩它都考虑到了,不服不行。
同样是C语言,SQL引擎访问数据是直接在内存中的,不像DAU还隔了一层,所以你要超过它是很难的。

newkid研究得深入

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
19#
发表于 2010-2-20 20:34 | 只看该作者
原帖由 〇〇 于 2010-2-20 09:20 发表

newkid研究得深入

那你就用group by cube好了,何必再折腾。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
20#
 楼主| 发表于 2010-2-20 21:32 | 只看该作者

回复 #19 yulihua49 的帖子

我没有newkid看到的执行计划多,而且我的测试cube(无并行)比union慢

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表