|
原帖由 〇〇 于 2010-2-24 15:22 发表 ![]()
你那个C程序需要改写才能适合这道题,我没看太懂,改不出来,请您改改
我试了,是group by cube快。
用的我的那个tjrb,7552个记录:
SELECT unit,tabname,flg,count(*) count,sum(dat1) s,avg(dat1) ag FROM TICKET.tjrb GROUP BY CUBE (unit,tabname,flg)
18ms,
树group,70ms
没有null的,二者结果完全相同。共归并出552项
- main(int argc,char **argv)
- {
- cube_stu cube;
- TJRB_stu tjrb;
- DAU tjrb_DAU,cube_DAU;
- T_SQL_Connect SQL_Connect;
- int ret,num=0;
- char stmt[4096];
- INT64 now;
- T_PkgType tj_tpl[5];
- struct t_node node;
- T_Tree *root=0;
- if(argc>1) ret=envcfg(argv[1]);
- ret=db_open(&SQL_Connect);
- if(ret) {
- printf("%s,dbopen error\n",argv[0]);
- return 1;
- }
- patt_copy(tj_tpl,TJRB_tpl,"unit,tabname,flg,dat1");
- DAU_init(&tjrb_DAU,&SQL_Connect,0,&tjrb,tj_tpl);
- //测试树group
- node.num=#
- now=now_usec();
- *stmt=0;
- ret=DAU_prepare(&tjrb_DAU,stmt);
- ShowLog(5,"%s:stmt=%s",__FUNCTION__,stmt);
- if(ret!=0) {
- printf("%s,err=%d,%s\n",stmt,
- SQL_Connect.Errno,
- SQL_Connect.ErrMsg);
- } else {
- while(!DAU_next(&tjrb_DAU)) {
- node.count=1;
- node.s=tjrb.dat1;
- *node.unit=0;
- *node.tabname=0;
- node.flg=SHORTNULL;
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //000
- node.flg=tjrb.flg;
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //001
- strcpy(node.tabname,tjrb.tabname);
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //011
- node.flg=SHORTNULL;
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //010
- strcpy(node.unit,tjrb.unit);
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //110
- node.flg=tjrb.flg;
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //111
- *node.tabname=0;
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //101
- node.flg=SHORTNULL;
- root=BB_Tree_Add(root,&node,sizeof(node),cmp,add_dup); //100
- }
- if(root) {
- BB_Tree_Scan(root,avg);
- BB_Tree_Scan(root,print_node);
- BB_Tree_Free(&root,0);
- }
- printf("num=%d,TIMEVAL=%lld\n",num,now_usec()-now);
- }
- DAU_free(&tjrb_DAU);
- //测试CUBE
- num=0;
- DAU_init(&cube_DAU,&SQL_Connect,0,&cube,cube_tpl);
- now=now_usec();
- strcpy(stmt,"GROUP BY CUBE (unit,tabname,flg)");
- ret=DAU_prepare(&cube_DAU,stmt);
- ShowLog(5,"%s:stmt=%s",__FUNCTION__,stmt);
- if(ret!=0) {
- printf("%s,err=%d,%s\n",stmt,
- SQL_Connect.Errno,
- SQL_Connect.ErrMsg);
- } else {
- while(!DAU_next(&cube_DAU)) {
- num++;
- DAU_pack(&cube_DAU,stmt);
- printf("%s\n",stmt);
- }
- }
- printf("num=%d,TIMEVAL=%lld\n",num,now_usec()-now);
- DAU_free(&cube_DAU);
- ___SQL_CloseDatabase__(&SQL_Connect);
- return 0;
- }
- //附cube模板:
- T_PkgType cube_tpl[]={
- {CH_CHAR,9,"unit",0,-1},
- {CH_CHAR,9,"tabname"},
- {CH_SHORT,sizeof(short),"flg"},
- {CH_INT,sizeof(int),"count(*) count"},
- {CH_INT64,sizeof(INT64),"sum(dat1) s"},
- {CH_DOUBLE,sizeof(double),"avg(dat1) ag","%.2lf"},
- {-1,0,"tjrb","tjdate|unit|tabname|flg|"}
- };
- extern T_PkgType cube_tpl[];
- typedef struct {
- char unit[9];
- char tabname[9];
- short flg;
- int count;
- INT64 s;
- double ag;
- } cube_stu;
复制代码
[ 本帖最后由 yulihua49 于 2010-2-24 17:15 编辑 ] |
|