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

需求:
统计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
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:20 
想达到什么目的

坚守VFP最后的阵地
2018-07-01 18:13
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
回复 3楼 sdta
提速,目前速度太慢!请版主指导!
2018-07-01 18:16
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
不一定要按照你的方法
如果只统计统计18.01.01-18.05.31之间,每个学生的交费总额,一条SQL命令就解决问题了

坚守VFP最后的阵地
2018-07-01 18:18
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
每个学生的唯一标识是不是XH字段

坚守VFP最后的阵地
2018-07-01 18:19
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
看了下,两个表中的XH字段的值不唯一。

坚守VFP最后的阵地
2018-07-01 18:25
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
回复 6楼 sdta
xh和xm,因为同一个xh下有不同的xm。主要是***-01;***-02等!
2018-07-01 18:25
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
不把问题说清楚,问题是解决不了的

坚守VFP最后的阵地
2018-07-01 18:26
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:391
专家分:896
注 册:2004-11-23
得分:0 
回复 5楼 sdta
可以用不同的方法,这个方法是十几年前写的,想改良一下,用SQL可以,就是我还不太熟悉!
2018-07-01 18:27



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




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

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