请教!数据统计速度太慢,如何提高?
如题!需求:
统计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编辑过]