| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1194 人关注过本帖
标题:大数据量情况下,花费大量的时间,请帮助优化下
只看楼主 加入收藏
kent73
Rank: 1
等 级:新手上路
帖 子:61
专家分:5
注 册:2009-3-4
收藏(1)
得分:0 
斑竹不在
2013-10-10 11:58
kent73
Rank: 1
等 级:新手上路
帖 子:61
专家分:5
注 册:2009-3-4
收藏
得分:0 
,只能结贴
2013-10-15 08:53
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:652
专家分:3402
注 册:2008-5-7
收藏
得分:0 
可以综合一个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 编辑 ]
2013-10-15 15:38
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:652
专家分:3402
注 册:2008-5-7
收藏
得分:0 
另外时间比较不能直接比较,否则出错。你的迟到早退算法判断有错误,比如id号为459918的明显是迟到,你却是早退,要不应该有半天班的判断。
2013-10-15 16:29
kent73
Rank: 1
等 级:新手上路
帖 子:61
专家分:5
注 册:2009-3-4
收藏
得分:0 
谢谢了
4w多条记录,20多分就搞定了
2013-11-01 15:32
vbvcr51
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:18
帖 子:364
专家分:1724
注 册:2013-11-3
收藏
得分:0 
连接数据库效率(提高速度的问题)有办法的,在运行软件时,先运行一下连接数据库cn.open这个部分,其他不用运行。以后每次连接数据库进行数据库操作就会很快了。
2013-11-04 13:46
vbvcr51
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:18
帖 子:364
专家分:1724
注 册:2013-11-3
收藏
得分:0 
请问版主,代码调试需要的时间是怎么测出来的,请教.
从版主代码里学到了 DateDiff函数 呵呵长知识

[ 本帖最后由 vbvcr51 于 2013-11-4 18:53 编辑 ]
2013-11-04 13:48
vbvcr51
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:18
帖 子:364
专家分:1724
注 册:2013-11-3
收藏
得分:0 
我的建议还是要对 sql语句执行效率 的问题上在学习学习。对于处理大量数据的话,不是随便写sql语句就行了。呵呵,说到底水平问题了.
2013-11-04 18:47
yjy790927
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-11-24
收藏
得分:0 
处理大量数据,一定要减少搜索范围,减少搜索参数
另外,考勤数据库基一按时间排列,你再按时间日期排序,基本是无用功。
2013-11-24 18:32
vbvcr51
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:18
帖 子:364
专家分:1724
注 册:2013-11-3
收藏
得分:0 
不知道这是做什么用的,靠这个在挣钱吗?
2013-11-25 12:53
快速回复:大数据量情况下,花费大量的时间,请帮助优化下
数据加载中...
 
   



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

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