免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: lb_20016
打印 上一主题 下一主题

上百万条数据记录的报表统计问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-30 11:49 |只看该作者
原帖由 ahkai 于 2006-4-30 11:14 发表
抱歉,我没有QQ,很落伍哈^-^.

1、每天的抽取程序是定时执行的,需要一个crontab定时。原数据库和目标库的数据同步应该在esql的抽取程序前运行。
2、写在一个crontab shell里,可以保证数据库同步完成后,执行 ...



银行的业务程序是如此,有日结、月结、年结等,不过银行的日结除了这种优化外还有其他作用。

不过我认为,大型业务系统都是如此吧。

我做商业(零售业)系统的,也是这样,有日结、月结、年结。

论坛徽章:
0
12 [报告]
发表于 2006-04-30 12:44 |只看该作者
ahkai :
    非常感谢你的耐心指导!
   你说的方法一共提到了三个程序
   1、用于定时的crontab
     2、负责抽取数据的esql
     3、crontab shell
我对Unix和Informix都不熟悉,都是刚接触的,以我现在的水平应该写不出来,不知道你那里有什么写好的或者
类似的脚本程序,我可以看看,然后改一下用,这样就比较快了。麻烦了!

论坛徽章:
0
13 [报告]
发表于 2006-04-30 13:46 |只看该作者

回复 12楼 lb_20016 的帖子

1、crontab定时执行一个命令或批处理程序,批处理程序包含数据库数据同步和数据抽取。
2、esql程序你直接用不了,逻辑不一样。如果没有写过unix程序,不会用cc /gcc 编译器 make编译脚本等工具,还是要学学这方面的东西。esql本身还是很好学的。

论坛徽章:
0
14 [报告]
发表于 2006-04-30 16:17 |只看该作者
unix程序 cc /gcc 编译器 make编译脚本等工具以前做毕业设计的时候用过,是linux下的,只是很久没弄了,快3年了,esql也看过,郁闷啊,都忘完了

论坛徽章:
0
15 [报告]
发表于 2006-05-01 09:41 |只看该作者
ahkai :
       能不能提供一下需要的shell和esql脚本程序,我应该看得懂的,而且3年前也用过make和gcc等,只是要写的话就比较棘手了,非常感谢!

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-12-09 06:20:00
16 [报告]
发表于 2006-05-01 22:22 |只看该作者
用4gl写定时程序
服务器也该升级了

论坛徽章:
0
17 [报告]
发表于 2006-05-02 16:12 |只看该作者
嗯,从呵呵的回复里我也很受启发,先感谢一下哈~~~
然后再说一下我的一点意见:
1.其实你现在的软件可以分成两个模块,一个是ASP的前端展示,另一个是后台的数据处理。
ASP不熟,不说了:)
2.关于数据的处理,实现的功能是对统计需求的预先处理。说白了就是为了使用户的查询的响应时间变短,对要运行的查询进行预先的准备。
这样,数据库就有两种表:
a)源表。也就是实际是业务数据表。
b)目的表。针对各种统计报表需求预处理的表。
这样,数据处理的功能就是定时(每天)把源表中的有效数据提取到目的表中。从而保证在ASP端查询时主要使用目的表中已经准备好的统计数据,较少地使用数据量很大的源表。

至于实现,要求不高的话其实不用使用ESQL/4GL的,只要写几个预处理存储过程,然后用cron定时调用就好了。调用方法可以用"dbaccess 数据库名 sp.sql" , sp.sql是你写 execute procedure 的地方。

至于效率问题,就不是三句两句能说的清楚的了~~值得一提的是对源表的索引一定要精心设置。

[ 本帖最后由 iceiceberg 于 2006-5-2 16:13 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2006-05-08 13:49 |只看该作者
假期看了ESQL和Unix中crontab方面的资料,大家帮我看看我改的代码,实现的是从远程数据表读数据写入本地库的表里面,但是资料提到的都是在同一个库里面进行操作,没有提到异地库的操作。我暂时没有多的机子来搭环境调试,所以请大家帮我看看帮我改改,谢谢拉!
    /*定义两个常量*/
EXEC SQL define NAME_LEN 15;
EXEC SQL define AGE_LEN 15;
main()
{
/*声明宿主变量*/
EXEC SQL BEGIN DECLARE SECTION;
char p_name[ NAME_LEN + 1 ];
char p_age[ AGE_LEN + 1 ];
EXEC SQL END DECLARE SECTION;
/*出错处理*/
EXEC SQL WHENEVER ERROR STOP;
/*连接到远程数据库far_db,计算机名(服务器名)为far_pc*/
/*本地数据库local_db,本地计算机名local_pc*/
EXEC SQL connect to 'far_pc.far_db';
if ( SQLCODE < 0 )
{ printf("CONNECT failed: %d\n", SQLCODE)
exit(0);
/*声明一个游标,查询所有30岁以下的人的姓名*/
EXEC SQL DECLARE fetch_data cursor for
select name, age
into :p_name, :p_age
from t_man
where age < 30;
/*打开游标*/
EXEC SQL open democursor;
/*如果SQLSTATE不等于“00”,那么表示到达了数据集的尾部(02),或者产生了错误(大于02)*/
for (;
{
EXEC SQL fetch democursor;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;  /*出错便跳出,正常的话就把当前记录插入本地库中的表里,依次循环直到游标数据集的尾部*/
EXEC SQL insert into local_db.local_table (name,age) values (:p_name,:p_age);
}

/*打印错误信息*/
if (strncmp(SQLSTATE, "02", 2) != 0)
printf("SQLSTATE after fetch is %s\n", SQLSTATE);
/*关闭游标*/
EXEC SQL close fetch_data
/*释放游标占用的资源*/
EXEC SQL free fetch_data
/*断开数据库服务器的连接*/
EXEC SQL disconnect current;
printf("\nDEMO1  Program over.\n\n";
}
主要就是异地和本地表的描述那里我觉得我写的可能不对。
另外想问的就是:
1:如何确认我的Esql的环境已经装完?是不是只要输入esql命令系统能认出来就OK拉?
2:编译上面这个脚本后好象是生成一个可执行文件吧,是吗,我没有环境,郁闷。
3:把这个生成的可执行文件加到crontab里面就可以了吧?
以上疑惑恳请大伙指教,谢谢!

[ 本帖最后由 lb_20016 于 2006-5-8 13:51 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2006-05-08 23:33 |只看该作者
急盼解答,自己顶一下,有劳大伙拉!

论坛徽章:
0
20 [报告]
发表于 2006-05-09 12:46 |只看该作者
哪位可以指教一下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP