| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1248 人关注过本帖
标题:【求助】怎样才能加快统计的速度?
只看楼主 加入收藏
mlpoo
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-6-25
结帖率:0
收藏
 问题点数:0 回复次数:7 
【求助】怎样才能加快统计的速度?
有一个上百万条记录的表dbf1,我编了个小程序用其中的几个字段值作为条件进行统计,得到相同字段值的记录数,再把统计结果输出到dbf2,然后把表dbf1中已经统计过的记录删除,再进行下一次统计,一直循环到表dbf1为空。不过感觉速度实在太慢,向论坛的各位求助,大家看看我的程序帮助分析一下,是不是我的思路错了?

sele 2
use dbf2                              &&记录统计结果的表
sele 1
use dbf1                              &&原始数据
do while bof()=.t.
        field1=a1                     &&取字段值作为统计条件
        field2=a2
        fieldn=an
        count for field1=a1 and field2=a2 and ……fieldn=an to aaa   &&得到统计结果
        sele2
        insert into dbf2(field1,field2,……fieldn,同条件记录数) values(a1,a2,……,an,aaa) &&把统计
                                                                                            条件和
                                                                                        结果写到dbf2

        sele 1
        dele for field1=a1 and field2=a2 and .……fieldn=an  &&删掉已有结果的记录,减小dbf1体积
        pack
enddo

大家帮我看看,有没有更好的办法?
P.S.为了便于大家理解,我用两个表说明:
假设dbf1存放的是需要统计的数据,当然记录的排列肯定没有下
面排列的那么整齐,字段数也不止这么少。
dbf1
field0 field1 field2 field3 field4 field5 field6 field7
    a    13    990    3        .t.    .t.    .f.  工人
    b    13    990    3        .t.    .t.    .f.  工人
    c    13    990    3        .t.    .t.    .f.  工人        ←未经统计的数据
    d    13    990    3        .t.    .t.    .f.  工人
    e    33    1200   5        .f.    .f.    .t.  技师
    f    33    1200   5        .f.    .f.    .t.  技师
    g    11    960    1        .t.    .t.    .t.  学徒
    h    11    960    1        .t.    .t.    .t.  学徒
    i    11    960    1        .t.    .t.    .t.  学徒
    j    11    960    1        .t.    .t.    .t.  学徒
    k    11    960    1        .t.    .t.    .t.  学徒
    l    43    1000   3        .t.    .f.    .t.  技师
    m    17    910    1        .t.    .t.    .f.  工人
    n    17    910    1        .t.    .t.    .f.  工人
dbf2存放统计的结果
dbf2
field1 field2 field3 field4 field5 field6 field7 同条件记录数
  13    990    3        .t.    .t.    .f.  工人    4
  33    1200   5        .f.    .f.    .t.  技师    2           ←我需要的结果
  11    960    1        .t.    .t.    .t.  学徒    5
  43    1000   3        .t.    .f.    .t.  技师    1
  17    910    1        .t.    .t.    .f.  工人    2
   

[ 本帖最后由 mlpoo 于 2009-9-16 21:52 编辑 ]
搜索更多相关主题的帖子: 统计 速度 
2009-09-16 16:25
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:0 
看你的代码, 你是统计 重复记录吧?? 不需这么复杂的~~~

假设field1,field2,...fieldn 均为字符型, 且长度相同, 代码如下(记录:一百余万,字段:15-20个,用时:约15秒)~~~ 因不清楚你的数库结构, 你可参照代码, 用padl()或padr()或str()函数, 作相应修改~~~

sele 1
use dbf1                              &&原始数据
repl all 同条件记录数 with 1
inde on field1+field2+...+fieldn to ls
tota on field1+field2+...+fieldn to dbf2 fiel 同条件记录数  
retu
2009-09-16 18:21
mlpoo
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-6-25
收藏
得分:0 
茵梦湖感谢你的回复,不过你的代码似乎与我的要求有点出入。
我用两个表来说明:
假设dbf1存放的是需要统计的数据,当然记录的排列肯定没有下
面排列的那么整齐,字段数也不止这么少。
dbf1
field0 field1 field2 field3 field4 field5 field6 field7
    a    13    990    3        .t.    .t.    .f.  工人
    b    13    990    3        .t.    .t.    .f.  工人
    c    13    990    3        .t.    .t.    .f.  工人
    d    13    990    3        .t.    .t.    .f.  工人
    e    33    1200   5        .f.    .f.    .t.  技师
    f    33    1200   5        .f.    .f.    .t.  技师
    g    11    960    1        .t.    .t.    .t.  学徒
    h    11    960    1        .t.    .t.    .t.  学徒
    i    11    960    1        .t.    .t.    .t.  学徒
    j    11    960    1        .t.    .t.    .t.  学徒
    k    11    960    1        .t.    .t.    .t.  学徒
    l    43    1000   3        .t.    .f.    .t.  技师
    m    17    910    1        .t.    .t.    .f.  工人
    n    17    910    1        .t.    .t.    .f.  工人

dbf2存放统计的结果
dbf2
field1 field2 field3 field4 field5 field6 field7 同条件记录数
  13    990    3        .t.    .t.    .f.  工人    4
  33    1200   5        .f.    .f.    .t.  技师    2
  11    960    1        .t.    .t.    .t.  学徒    5
  43    1000   3        .t.    .f.    .t.  技师    1
  17    910    1        .t.    .t.    .f.  工人    2

[ 本帖最后由 mlpoo 于 2009-9-16 21:56 编辑 ]
2009-09-16 20:14
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:0 
select *,count(*) 同条件记录 from 表名 group by field7

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2009-09-16 20:18
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:0 
select field1,field2,field3,field4,field5,field6,field7,count(*) 同条件记录 from dbf1 group by field1,field2,field3,field4,field5,field6,field7

field1      field2      field3      field4 field5 field6 field7     同条件记录        
----------- ----------- ----------- ------ ------ ------ ---------- -----------  
11          960         1           .t.    .t.    .t.    学徒         5
13          990         3           .t.    .t.    .f.    工人         4
33          1200        5           .f.    .f.    .t.    技师         2
 
(所影响的行数为 3 行)
2009-09-16 21:51
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
select最快速了
2009-09-16 22:10
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:0 
以下是引用tlliqi在2009-9-16 22:10的发言:

select最快速了
 
 
估计你没有测试过吧??  "sele ... group by ..." 语句只能说简洁, 但最快速是谈不上的, 几千几万个记录的数库可能感觉不太明显, 但记录超过36万左右时, 感觉就很明显了, 比 "inde on ..." + "tota on ..." 要多耗时近3倍~~~建议你测试一下~~~

"update .. set ..  where a表.?=b表.? " 语句, 和"inde on .. " +"set rela .." +"repl .. on" 比较, 也是一样~~~你也可以测试一下~~~
 

2009-09-16 22:51
mlpoo
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-6-25
收藏
得分:0 
非常感谢以上各位的答复,我的问题已经得到解决了,使用select就搞定了,110多万记录的表用一台赛3+256内存的机子不到60秒就有结果了。
因为我的vfp是半吊子水平,肯定是写不出上面的那些语句的。
在这里还想向茵梦湖请教一下:
sele 1  
use dbf1                              &&原始数据
repl all 同条件记录数 with 1    ←这里是什么作用呢?‘同条件记录数’这个字段只存在于dbf2表中。
inde on field1+field2+...+fieldn to ls
tota on field1+field2+...+fieldn to dbf2 fiel 同条件记录数   
retu

水平有限,让你见笑了。
祝各位一切顺利。
2009-09-16 23:13
快速回复:【求助】怎样才能加快统计的速度?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023522 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved