如何优化这个程序
不上代码了,说一下思路:文本文件A中记录了库存产品一个月的每日变动明细,记录有数千万条(从月初到月末),表B中记录了需要统计的数百项产品,需要实现的是按照表B中的产品代码,计算当月平均日库存(每天的实际库存相加再除以当月实际天数)。
我现在的做法:
将文本A导入一个新表C中,然后按照表B的记录由表c生成表d(仅包含有用记录的表),从B中读出一条记录,按日从D中求出入库合计(sum all 出入库 to n for 日期=当日.and. 产品代码=cpdm)进行累加。
这个过程我想应该是尽量减少了运算的,但依然极慢,大约需要3-4小时。
各位,还有更好的思路吗。
*******************************
文本导入c 表的过程我是放到单独按钮完成的。文本是月末生成的,表 B 的数据也是次月初提供需要计算的。
过程:
1、按照 B 的记录 生成 D
append from c for 产品代码=b中的代码
逐条生成
2、再按照B 中的记录逐日计算
用for...to...next逐日累加库存的。
用sum all 出入库 to n for 日期=当日.and. 产品代码=cpdm 计算出入库发生额
我分析过,时间耽误在 过程1 中,生成包含有用记录的表非常耗时。
*****************************************
谢谢几位的帮助,我原来学习的是 foxbase1.1 现在用的是 vfp7.0 所以对select用法不是很熟悉,我也不是搞专业开发的,仅仅是业余爱好,一直程序中不太考虑优化,这回数据量太大了。几位的select语句我仔细分析了一下,可能没有太理解,觉得对我的问题没有彻底解决。不好意思,数据量太大(zip格式600M),传不上来,何况还有保密的问题。
我再详细表述一下我的问题:
原始记录中包括10万个产品的数千万条记录(产品每日频繁出入库),我要统计的仅仅是10万多产品中的几百条(b表)。
所以各位提到的办法用select 分组统计的办法统计10万个产品的每日合计,再在其中查找需要的数据(b表)是否更耗时间。
另外我手工测时用select ...into... 和用append from 生成表的时间相差不大(感觉测时)。
刚刚想到一个通用性不好的办法。
需要统计的数据 b 表建索引
从文本 a 导入c表的过程时,fgets()读一行,直接截取出产品编码,然后seek在b表中查找,没有找到放弃,找到写入 d表,这样速度是否能快一点。
[ 本帖最后由 oldhawk 于 2013-5-14 00:54 编辑 ]