none
困扰我很久的一个问题!可以说一年以上!借此地讨论一下解决方案! RRS feed

  • 问题

  • 今天这个问题又出现了!
    我的数据库整体很大1G左右,
    下面是我的ASP程序(不要笑,我的网站就是asp写得)

    Dim TempClassListStr,ClassID
    TempClassListStr = ClassList
    Function ClassList()
     Dim ClassListObj,SelectStr
     Set ClassListObj = DBC.SqlExec(2,1,"Select ClassID,ClassCName from Classs where ParentID='0' and DelFlag=0 order by ClassID desc")
     do while Not ClassListObj.Eof
      if ClassListObj("ClassID") = ClassID then
       SelectStr = "selected"
      else
       SelectStr = ""
      end if
      ClassList = ClassList & "<option " & SelectStr & " value="&ClassListObj("ClassID")&"" & ">" & ClassListObj("ClassCName") & "</option><br>"
      ClassList = ClassList & ChildClassList(ClassID,ClassListObj("ClassID"),"")
      ClassListObj.MoveNext 
     loop
     ClassListObj.Close
     Set ClassListObj = Nothing
    End Function

    Function ChildClassList(selectedid,ClassID,Temp)
     Dim TempRs,TempStr,SelectStr
     Set TempRs = DBC.SqlExec(2,1,"Select ClassID,ClassCName from Classs where ParentID='" & ClassID & "' and RedirectList='1' and DelFlag=0  order by ClassID desc")
     TempStr = Temp & " |- "
     do while Not TempRs.Eof
      if TempRs("ClassID") = selectedid then
       SelectStr = "selected"
      else
       SelectStr = ""
      end if
      ChildClassList = ChildClassList & "<option " & SelectStr & " value="&TempRs("ClassID")&"" & ">" & TempStr & TempRs("ClassCName") & "</option><br>"
      ChildClassList = ChildClassList & ChildClassList(selectedid,TempRs("ClassID"),TempStr)
      TempRs.MoveNext
     loop
     TempRs.Close
     Set TempRs = Nothing
    End Function
    Public Function SqlExec(RsLF,SqlLF,Sql)
        Dim TempRS
        On Error Resume Next
     If Not IsObject(Conn) Then Class_Terminate  
     select case RsLF
       case 1
      Set SqlExec = Conn.Execute(Sql)
       case 2
         Set TempRS = Server.CreateObject(G_FS_RS)
      TempRs.Open Sql,Conn,1,3
     End select
     Set SqlExec=TempRS
     Set TempRS = Nothing
     SqlNum = SqlNum+1
     If Err Then
      Set Conn = Nothing
        if SqlLF=1 then
        response.write "数据库执行错误,请联系管理员"
      elseif SqlLF=2 then
                    response.write Sql &"<BR>"
        response.write Err.Description&"<BR>"& Err.Source
        err.Clear
        Response.End
      end if

     End If

    End Function



    SqlExec的第一个参数是1是执行execute,2是open
    前者居然有90000s,后者100s

    • 已编辑 lovedata 2010年2月22日 16:33
    2010年2月21日 18:06

答案

  • 如果在用户数没有增加的情况下,而且你表中的数据是一直改变或增加的.几个月后性能下降极有可能是由于索引碎片造成的.所以重建索引应该是个不错的方法
    2010年2月22日 5:46

全部回复

  • 我把它放在2000中,是很好用的,由于要升级数据库,2005中一开始可以,几个月后问题出现了,2008一开始可以,几个月后问题出现了
    这下不知道问题的原因,
    为啥execute执行的效率如此差,open还是可以的,但是偶尔也慢!

    尤其是递归调用时,太慢了!
    2010年2月21日 18:11
  • 一开始我怀疑是sqlserer的问题,装了很几次,不行
    后来怀疑是IIS的问题,装了很几次,不行
    再后来怀疑是.net2.0的问题,装了很几次,不行

    于是全部重装sqlserer,IIS,.net2.0,好像好了一段时间,之后又开始慢了,一个页面以前不到1S就打开,现在5-10S

    折腾了快一年了!
    2010年2月21日 18:17
  • How often do you rebuild index/update statistics? Did you check execution plans? Checked server resource usages?
    2010年2月21日 22:24
  • 如果在用户数没有增加的情况下,而且你表中的数据是一直改变或增加的.几个月后性能下降极有可能是由于索引碎片造成的.所以重建索引应该是个不错的方法
    2010年2月22日 5:46
  • 楼主你好,你可以试试在应用程序慢的时候,用Profiler监控下数据库里面执行的时间。比较一下数据库里面的执行时间和5-10S的差距有多少。
    先确定是不是数据库执行反应慢了,造成应用程序响应时间延长。确定后再决定下一步该怎么做
    2010年2月22日 9:38
    版主
  • 多谢大家关注此贴,按照大家的提示,我又重新建立的索引和统计信息,甚至对ClassID等字段做了索引,效果依旧。
    今晚无意用用本地的程序调用服务器数据库,发现一点蛛丝马迹,同样是用我上面的程序测试的,结果时间减少一般是40000s,着实高兴了一下。
    因为是远程可能中间有延时。
    我比较了一下连接数据库的代码。不同的是数据库服务器地址,本地是 124.123.123.123,2321,远程服务器是(local),于是我将(local)改为124.123.123.123,2321,结果你猜,查询时间居然是450s,哈哈!居然是这个问题!450S是用execute查询的,于是我换成了OPEN时间基本没有变,100S,中间我不时的看内存和sqlserver监视器,发现内存有原来的1.7G变为现在的780M,这一点很奇怪,也可能现在不是高峰。
       两种连接方式并没有显示我的程序的查询语句耗很大的资源,所以我断定还是系统本身的bug,与可能是别的原因,因为我的服务器补丁都是最新的。
    虽然,execute查询,450S是好了很多,但是还不是最理想的,理想应该不会超出100s。
    不知各位是否遇到这样的问题,请赐教
    2010年2月22日 16:54
  • Did you install any sql2k5 service pack? Checked execution plans? You never answer that.
    2010年2月22日 20:33