标题:请教!数据统计速度太慢,如何提高?
取消只看楼主
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
结帖率:100%
已结贴  问题点数:20 回复次数:9 
请教!数据统计速度太慢,如何提高?
如题!

需求:
统计18.01.01-18.05.31之间,每个学生的交费总额;

说明:
sysxsdatol:是学生信息表;
sysxsdabjjl:是交费记录表;
两个表中的xh和xm是连接数据的对应关系。

我之前的解决思路:
1、先读取18.01.01-18.05.31之间的交费记录数据;
2、之后以交费记录表为准,删除学生信息表中不在范围内的学生信息;
3、最后以学生信息表为准,在交费记录表中统计每个学生的具体交费总额;并保存在jf字段中。

因为数据涉及量较大,速度很慢,能不能提速!?请各位大神指导!

程序代码:
close all
clear all

 PUBLIC syswindir,SYSCURUSER,sysdatebeginvar ,sysdateendvar 

 syswindir = ''

 SYSCURUSER=''

 sysdatebeginvar = ctod('2018.05.01')

 sysdateendvar  = ctod('2018.05.31')
? sysdatebeginvar , sysdateendvar

 ********************************************************获取系统目录

 DECLARE LONG GetWindowsDirectory IN WIN32API STRING @ lcWinDir, LONG

 LOCAL lcWinDir, lnStringLen

 lcWinDir = SPACE(200) + CHR(0)

 lnStringLen = GetWindowsDirectory(@lcWinDir, 200)

 syswindir = LEFT(lcWinDir,lnStringLen) + '\LkySharedTemp'

 CLEAR DLLS

 IF .NOT. DIRECTORY(syswindir)
    MD &syswindir

 ENDIF
***********************************************************************************************************************************************
public oldsec
oldsec=SECONDS( )
valoldsec=SECONDS( )

tempdbfnamevar1=tempdbffileverify()
SELECT * FROM sysxsdatol INTO TABLE &tempdbfnamevar1 ORDER BY xh asc , xm asc
use
sele sysxsdatol
use
      ******************************************************获取统计时间段内有交费记录的学生
      tempdbfnamevar2=tempdbffileverify()
      SELECT * FROM sysxsdabjjl INTO TABLE &tempdbfnamevar2 WHERE jfrq>=sysdatebeginvar and jfrq<=sysdateendvar ORDER BY xh asc , xm asc
      use
      sele sysxsdabjjl
      use
oldseccc=alltrim(str(SECONDS( )-valoldsec))
valoldsec=SECONDS( )
? '准备数据用时[ '+oldseccc+' ]秒!'
      sele 1
      use &tempdbfnamevar1 EXCLUSIVE  &&tol
      replace bj with .f. all
      go top
      sele 2
      use &tempdbfnamevar2 EXCLUSIVE  &&bjjl
      crecc=alltrim(str(reccount()))
      scan
           WAIT WINDOW '进程:' + ALLTRIM (STR (RECNO ()))+ "/" + crecc NOWAIT
           sele 1
           replace bj with .t. for (alltrim(xh)==alltrim(B->xh) .and. alltrim(xm)==alltrim(B->xm))
           sele 2
      endscan
      sele 1
      delete for !bj
      pack
oldseccc=alltrim(str(SECONDS( )-valoldsec))
valoldsec=SECONDS( )
? '清查数据用时[ '+oldseccc+' ]秒!'
      ***************************************************************************************合计交费记录
      crecc=alltrim(str(reccount()))
      jfjecc=0.00
      scan
           WAIT WINDOW '进程:' + ALLTRIM (STR (RECNO ()))+ "/" + crecc NOWAIT
           jfjecc=0.00
           sele 2
           sum jfje to jfjecc for alltrim(xh)==alltrim(A->xh) and alltrim(xm)==alltrim(A->xm)
           sele 1
           replace jf with jfjecc , tjrq with date()
      endscan
sele 2
sum jfje to cacc
? cacc
sele 1
sum jf to facc
? facc
? facc-cacc
oldseccc=alltrim(str(SECONDS( )-valoldsec))
valoldsec=SECONDS( )
? '合计用时[ '+oldseccc+' ]秒!'

oldseccc=alltrim(str(SECONDS( )-oldsec))
? '总用时[ '+oldseccc+' ]秒!'

********************************************************************************************************************************************************************************************
PROCEDURE lockdbf

 wait window "文件被其他用户锁定,正常排队...请稍候!" nowait

 do while !flock()

 enddo

 wait clear
endproc
********************************************************核查临时表,存放在本地系统盘
PROCEDURE tempdbffileverify
if .not. directory(syswindir)
   md &syswindir
endif 
tempdbfnamevar0=syswindir+'\'+left(alltri(sys(0)),at('#',alltrim(sys(0)))-2)+right(Chrtran(Dtoc(Date()),'.',''),6)+Chrtran(Chrtran(time(0),':',''),'.','')+SYSCURUSER+'.dbf'
do while file(tempdbfnamevar0)
   tempdbfnamevar0=syswindir+'\'+left(alltri(sys(0)),at('#',alltrim(sys(0)))-2)+right(Chrtran(Dtoc(Date()),'.',''),6)+Chrtran(Chrtran(time(0),':',''),'.','')+SYSCURUSER+'.dbf'
enddo
return(tempdbfnamevar0)
endproc



[此贴子已经被作者于2018-7-2 16:40编辑过]

搜索更多相关主题的帖子: 数据 统计 记录 str sele 
2018-07-01 18:04
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
十几年前的程序了,数据量小时还可能,但现在的数据量大了,速度就是问题。请大家多多指导!
2018-07-01 18:10
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
回复 3楼 sdta
提速,目前速度太慢!请版主指导!
2018-07-01 18:16
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
回复 6楼 sdta
xh和xm,因为同一个xh下有不同的xm。主要是***-01;***-02等!
2018-07-01 18:25
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
回复 5楼 sdta
可以用不同的方法,这个方法是十几年前写的,想改良一下,用SQL可以,就是我还不太熟悉!
2018-07-01 18:27
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
就是统计数据。删除数据,只是操作方法而已。

姓名和学号是唯一的。就是说姓名和学号必须同时相等。
2018-07-01 18:43
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
给一条SQL统计命令,学习一下,谢谢!
2018-07-01 18:59
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
在你这命令中把学生信息表的所有字段都调出来生成一个新的查询结果。

这么说吧,就是要统计交费记录表中18.01.01-18.05.31之间的每个学生(xh和xm完全相等)的交费总额写入学生信息表后,并将这些学生按学生信息表字段生成查询结果。
2018-07-02 14:02
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
已经解决!
2018-07-02 16:05
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
换一个思路解决,目前是一个学号下有这个学生的几条记录,如学号001,但姓名则有张三01,张三02,张三03...

所以,可以把学号+姓名(xh+xm)即可做为一个唯一标识,这样即可解决学号不唯一的问题。

如果这样,一条命令如何解决?
2018-07-02 16:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488306-1-1.html




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

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