注册 登录
编程论坛 VB6论坛

大数据量情况下,花费大量的时间,请帮助优化下

kent73 发布于 2013-10-07 08:52, 1194 次点击
有近50000条数据,用FOR循环,需要花费大量的时间,请帮助优化下代码。
谢谢


只有本站会员才能查看附件,请 登录
19 回复
#2
3037709572013-10-07 09:19
看你写的代码一点代码重用的观点都没有,最起码将访问数据库的操作弄成一个模块呢吧? 每次都New ADODB.Recordset,速度能快吗?
#3
kent732013-10-07 09:28
只会这些啊,请斑竹帮忙
谢谢
#4
3037709572013-10-07 10:30
你窗体加载的时候最起码要从数据库中将【部门】【工号】【出勤状态】这三个字段的值查出来绑定到ComboBox中去吧?
你只初始化一个窗体的图片Form1.Icon = LoadPicture("" & App.Path & "\Log_Off.ico")设置一个Timer的刷新时间(Timer1.Interval = 1000)就不管了?
那你点击查询按钮的时候,如何根据你选择的条件来查询数据呢?你新手吗?感觉对整体项目的把握不到位呀?先不说代码写的好不好,最起码你的编写程序的思路要清新要正确。没有前面的准备你的后续工作能顺利吗?好好的将你的这个程序改改吧,建议你弄个类模块访问数据库。
#5
kent732013-10-07 10:49
没有系统的学过,属于半路出家
就是发现哪里有问题,哪里补一块的那种
#6
3037709572013-10-07 10:55
哦,难怪,你在网上找找关于VB访问数据库的类模块示例看看,然后将你的思路捋清楚再编写代码。思路最重要了,思路不正确其他的全白搭。
#7
kent732013-10-07 11:30
好的,我先找找吧
#8
kent732013-10-08 08:56
斑竹
找不到啊,帮我改下吧。
谢谢!
#9
bczgvip2013-10-08 13:39
行 22: 控件 DataGrid1 的类 MSDataGridLib.DataGrid 不是一个已加载的控件类。
行 90: 控件 Adodc1 的类 MSAdodcLib.Adodc 不是一个已加载的控件类。
行 174: 控件 DTPicker1 的类 MSComCtl2.DTPicker 不是一个已加载的控件类。
必要控件。
话说才4070条数据,不算多吧?
#10
kent732013-10-08 14:49
放上去的只有10%的数据。
#11
kent732013-10-10 11:58
斑竹不在
#12
kent732013-10-15 08:53
,只能结贴
#13
lowxiong2013-10-15 15:38
可以综合一个sql访问,另外在循环中多次update记录集影响速度,通过调试,在ide环境下,你的代码需要58秒,我修改后的代码需要16秒,我的代码如下:
Private Sub Command1_Click()
  Dim d1 As Date, d2 As Date, k As Long, i As Integer, a As String
  Call OpenConn
  d1 = Time
  If rs1.State = 1 Then rs1.Close
  sql = "select 工号,日期,Count(时间) AS sjj from Tb_kq_kqjl_temp group by 工号,日期 order by 工号,日期"
  rs1.Open sql, cn, 3, 3
  While Not rs1.EOF
    If Weekday(rs1!日期) = 8 Then wkd = "星期日" Else wkd = Null  '''标注星期日出勤
    If rs2.State = 1 Then rs2.Close
    sql = "select * from Tb_kq_kqjl_temp where 工号='" & rs1!工号 & "' and 日期='" & rs1!日期 & "' order by 时间1"
    rs2.Open sql, cn, 3, 3
    i = 1
    zt = ""
    While Not rs2.EOF
      rs2!b = "时间" & i
      rs2!休息日 = wkd
      If rs1!sjj = 2 Then
        '属于正常出勤
        If rs2!ID = 459916 Or rs2!ID = 459917 Then
          a = a
        End If
        If i = 1 Then
          yc = "正常上班"
        Else
          yc = "正常下班"
        End If
        If Format(rs2!时间, "hh:mm:ss") > Format("8:15:00", "hh:mm:ss") And rs2!时间 < "08:45:00" And i = 1 Then yc = "迟到"
        If Format(rs2!时间, "hh:mm:ss") < Format("16:45:00", "hh:mm:ss") And rs2!时间 > "16:15:00" And i = 2 Then yc = "早退"
        If Format(rs2!时间, "hh:mm:ss") > Format("8:45:00", "hh:mm:ss") And i = 1 Then yc = "上班异常"
        If Format(rs2!时间, "hh:mm:ss") < Format("16:15:00", "hh:mm:ss") And i = 2 Then yc = "下班异常"
        If yc = "" Then
          zt = zt
        Else
          zt = zt & "/" & yc
        End If
        If i = 1 Then
          kssj = rs2!时间
        Else
          If Len(zt) > 0 Then zt = Right(zt, Len(zt) - 1)
          jssj = rs2!时间
          cqsj = Round(Val(DateDiff("n", kssj, jssj)) / 60, 2) - 0.5  ''出勤时间
          rs2!状态 = zt
          rs2!工作时间 = cqsj
          rs2.MovePrevious
          rs2!状态 = zt
          rs2!工作时间 = cqsj
          rs2.MoveNext
        End If
      Else
        rs2!状态 = "异常"
        rs2!工作时间 = 0
      End If
      rs2.MoveNext
      i = i + 1
    Wend
    rs2.UpdateBatch
    rs1.MoveNext
  Wend
  Call CloseConn
  d2 = Time
  k = DateDiff("s", d1, d2)    '计算耗时
  MsgBox k                     '显示耗时,本代码需要16秒,你的需要58秒,提高3.6倍,也就这样了,还有一种方式,只需打开一次记录集,不知道会不会加快速度
End Sub


[ 本帖最后由 lowxiong 于 2013-10-15 16:39 编辑 ]
#14
lowxiong2013-10-15 16:29
另外时间比较不能直接比较,否则出错。你的迟到早退算法判断有错误,比如id号为459918的明显是迟到,你却是早退,要不应该有半天班的判断。
#15
kent732013-11-01 15:32
谢谢了
4w多条记录,20多分就搞定了
#16
vbvcr512013-11-04 13:46
连接数据库效率(提高速度的问题)有办法的,在运行软件时,先运行一下连接数据库cn.open这个部分,其他不用运行。以后每次连接数据库进行数据库操作就会很快了。
#17
vbvcr512013-11-04 13:48
请问版主,代码调试需要的时间是怎么测出来的,请教.
从版主代码里学到了 DateDiff函数 呵呵长知识

[ 本帖最后由 vbvcr51 于 2013-11-4 18:53 编辑 ]
#18
vbvcr512013-11-04 18:47
我的建议还是要对 sql语句执行效率 的问题上在学习学习。对于处理大量数据的话,不是随便写sql语句就行了。呵呵,说到底水平问题了.
#19
yjy7909272013-11-24 18:32
处理大量数据,一定要减少搜索范围,减少搜索参数
另外,考勤数据库基一按时间排列,你再按时间日期排序,基本是无用功。
#20
vbvcr512013-11-25 12:53
不知道这是做什么用的,靠这个在挣钱吗?
1