SC读取数据库的效率和速度问题
(创建时间:2010年03月17日 23:33:00)
Jangogo : 
SC读取数据库用的是ADO对象,效率和ADO有直接的关系。
但是我们应该注意的事情是在SC里面一定要尽量少用Do/Loop 或者 for next 来循环数据集在拼凑字符串返回结果。
这样的效率是非常低的,最好的方法是使用ADO.Recorset对象的GetString方法,一次性生成字符串返回,在前台的JS里面再使用Split分割成数组。
结合JS的对象和动态载入表格的方法可以极大地加快程序的处理速度。
如 固定资产台帐 功能,原来有位同事做的代码如下:
 
  1. function readAccountInfo(startTime,endTime,dbtype)   
  2. on error resume next   
  3.   
  4.     dim cn,rsG,rs,rs1,rs2,ss   
  5.        
  6.     dim ccode,cname,cplace,cuser,depy,depm,balance,cunit,cdate   
  7.     dim staffid,pid,acid,debitqty,debit,price,deped   
  8.        
  9.     '变动    
  10.     dim qty,dep,yzh,nvalue   
  11.     '折旧   
  12.     dim dep1,cdep1   
  13.        
  14.     set cn=GetCN_()   
  15.     set rsG = GetRS_()   
  16.     cn.open CNStr_   
  17.   
  18.     ss=""  
  19.     set rs2=GetRS_()   
  20.     set rs=GetRS_()   
  21.     set rs1=GetRS_()   
  22.        
  23.     'sql = "select ccode from fasub where fatype=2"   
  24.     sql = "select ccode from fa where fa.ccode <> ' ' order by ccode"  
  25.     rsG.open sql,cn,1,3   
  26.       
  27.     do while not rsG.eof   
  28.         if err then exit do   
  29.         '判断固定资产是否有子信息   
  30.         sql = "select * from fa where ccode='" & rsG("ccode") & "'"  
  31.         rs.open sql,cn,1,3   
  32.         if not rs.eof then   
  33.             cname = rs("cname")   
  34.             cplace = rs("cplace")   
  35.             cuser = rs("cuser")   
  36.             depy = rs("depy")   
  37.             depm = rs("depm")   
  38.             balance = rs("balance")   
  39.             cunit = rs("cunit")   
  40.             cdate = rs("cdate")   
  41.             acid = rs("acid")   
  42.             staffid = ""  
  43.             pid = ""  
  44.             debitqty = 1   
  45.             debit = 0   
  46.             price = 0   
  47.             deped = 0   
  48.         end if   
  49.         rs.close   
  50.            
  51.         '查询统计变动数据   
  52.         sql = "select fasub.ccode,fasub.DeptStaffID,fasub.PrjID,fasub.acid_fee,SUM(fasub.debitQty-fasub.creditQty) as qty,AVG(fasub.price) as aprice,SUM(fasub.debit-fasub.credit) as sdebit from fasub,accperiod where (fatype=1 or fatype=0) and (fasub.fadate between accperiod.startdate and accperiod.enddate) and fasub.ccode='" & rsG("ccode") & "' and accperiod.period >= '" & startTime & "' and accperiod.period <= '" & endTime & "' group by fasub.ccode,fasub.DeptStaffID,fasub.PrjID,fasub.acid_fee"  
  53.            
  54.         rs.open sql,cn,1,3   
  55.            
  56.         '查询统计折旧数据   
  57.         sql="select fasub.ccode,fasub.DeptStaffID,fasub.PrjID,SUM(fasub.creditDep) as sDep from fa,fasub,accperiod where fa.ccode=fasub.ccode and fasub.fatype=3 and (fasub.fadate between accperiod.startdate and accperiod.enddate) and fasub.ccode='" & rsG("ccode") & "' and accperiod.period >= '" & startTime & "' and accperiod.period <= '" & endTime & "' group by fasub.ccode,fasub.DeptStaffID,fasub.PrjID"  
  58.         'msgbox sql   
  59.         rs1.open sql,cn,1,3   
  60.        
  61.         'sql="select fa.ccode,fa.cname,fa.cplace,fa.cuser,fa.cdate,fa.depm,fa.depy,fa.balance,fa.cunit,fasub.debitQty,fasub.price,fasub.debit,fasub.deped,fasub.acid_fee,fasub.DeptStaffID,fasub.PrjID from fa,fasub where fa.ccode=fasub.ccode and fasub.ccode='" & rsG("ccode") & "' and fasub.fatype=2"   
  62.         sql = "select fa.ccode,fa.cname,fa.cplace,fa.cuser,fa.cdate,fa.depm,fa.depy,fa.balance,fa.cunit,fasub.debitQty,fasub.price,fasub.debit,fasub.deped,fasub.acid_fee,deptstaff.DeptStaffName,prj.PrjName from fa,fasub,deptstaff,prj where fa.ccode=fasub.ccode and fasub.DeptStaffID=deptstaff.DeptStaffID and fasub.PrjID=prj.PrjID and fasub.ccode='" & rsG("ccode") & "' and fasub.fatype=2"  
  63.         rs2.open sql,cn,1,3   
  64.   
  65.         if not rs2.eof then   
  66.             cname = rs2("cname")   
  67.             cplace = rs2("cplace")   
  68.             cuser = rs2("cuser")   
  69.             depy = rs2("depy")   
  70.             depm = rs2("depm")   
  71.             balance = rs2("balance")   
  72.             cunit = rs2("cunit")   
  73.             cdate = rs2("cdate")   
  74.             staffid = rs2("DeptStaffName")   
  75.             pid = rs2("PrjName")   
  76.             acid = rs2("acid_fee")   
  77.             debitqty = rs2("debitQty")   
  78.             debit = rs2("debit")   
  79.             price = rs2("price")   
  80.             deped = rs2("deped")   
  81.         end if   
  82.            
  83.         if rs.eof then   
  84.             qty = 0   
  85.             yzh = 0   
  86.             nvalue = 0   
  87.         else   
  88.             qty = CInt(rs("qty"))   
  89.             yzh = rs("sdebit")   
  90.             nvalue = rs("sdebit")   
  91.         end if   
  92.            
  93.         if rs1.eof then   
  94.             dep = 0 + deped   
  95.             cdep = 0   
  96.         else   
  97.             dep = rs1("sDep") + deped   
  98.             cdep = rs1("sDep")   
  99.         end if   
  100.              
  101.         ss=ss & "<P>"  
  102.         ss=ss & "<CODE>" & CD(rsG("ccode")) & "</CODE>"  
  103.         ss=ss & "<NAME>" & CD(cname) & "</NAME>"  
  104.         ss=ss & "<DEPID>" & CD(staffid) & "</DEPID>"  
  105.         ss=ss & "<PRJID>" & CD(pid) & "</PRJID>"  
  106.         ss=ss & "<PLACE>" & CD(cplace) & "</PLACE>"  
  107.         ss=ss & "<USER>" & CD(cuser) & "</USER>"  
  108.         ss=ss & "<DATE>" & CD(DFF_(cdate)) & "</DATE>"  
  109.         ss=ss & "<DEPM>" & CD(depm) & "</DEPM>"  
  110.         ss=ss & "<FEE>" & CD(acid) & "</FEE>"  
  111.         ss=ss & "<DEPY>" & CD(depy) & "</DEPY>"  
  112.         ss=ss & "<BALANCE>" & CD(balance) & "</BALANCE>"  
  113.         ss=ss & "<UNIT>" & CD(cunit) & "</UNIT>"  
  114.         ss=ss & "<QTY>" & CD(CInt(debitqty) + qty) & "</QTY>"  
  115.         ss=ss & "<PRICE>" & CD(FormatNumber(price,2)) & "</PRICE>"  
  116.         'ss=ss & "<YZH>" & CD(debit + yzh) & "</YZH>"   
  117.         ss=ss & "<YZH>" & CD(FormatNumber((debit + yzh),2)) & "</YZH>"  
  118.         'ss=ss & "<DEP>" & CD(FormatNumber((deped + dep),3)) & "</DEP>"   
  119.         ss=ss & "<DEP>" & CD(FormatNumber(GetAddUpDep(dbtype,rsG("ccode"),startTime,endtime) + deped,3)) & "</DEP>"  
  120.         ss=ss & "<CDEP>" & CD(FormatNumber(cdep,3)) & "</CDEP>"  
  121.         '原来是净值减去本期折旧   
  122.         'ss=ss & "<NVALUE>" & CD(Abs(FormatNumber((debit + nvalue - dep),3))) & "</NVALUE>"   
  123.         '下面是净值减去累计折旧   
  124.            
  125.         ss=ss & "<NVALUE>" & CD(Abs(FormatNumber((debit + nvalue - (GetAddUpDep(dbtype,rsG("ccode"),startTime,endtime) + deped)),3))) & "</NVALUE>"  
  126.         ss=ss & "</P>"  
  127.            
  128.         rs.close   
  129.         rs1.close   
  130.         rs2.close   
  131.         'msgbox ss   
  132.         rsG.MoveNext   
  133.     loop   
  134.    ' msgbox err.description   
  135.     readAccountInfo=XML_("<PS>" & ss & "</PS>" & errXML_(err))   
  136. close_ rs   
  137. close_ rs1   
  138. close_ rs2   
  139. close_ cn   
  140. end function   
  141.   
  142. '计算并获取累计折旧   
  143. function GetAddUpDep(dbtype,ccode,startperiod,endperiod)   
  144. on error resume next   
  145.     dim cn,rs,sql,rtn   
  146.     dim fadate,isGoon,speriod,eperiod   
  147.     dim sp,ep 'period   
  148.        
  149.     set cn = GetCN_()   
  150.     cn.open CNStr_   
  151.     set rs = GetRS_()   
  152.        
  153.     isGoon = true   
  154.     rtn = 0   
  155.        
  156.     dim c   
  157.     c = "#"  
  158.     if dbtype = "sqlserver" then   
  159.         c = "'"  
  160.     end if   
  161.        
  162.     sql = "select count(*) from fasub where fatype=3"  
  163.     rs.open sql,cn,1,3   
  164.     if rs.eof then   
  165.         isGoon = false   
  166.     end if   
  167.     rs.close   
  168.        
  169.     if isGoon then   
  170.         sql = "select top 1 * from fasub where fasub.ccode <> ' ' order by fadate asc"  
  171.         rs.open sql,cn,1,3   
  172.         if not rs.eof then   
  173.             fadate = rs("fadate")   
  174.         end if   
  175.         rs.close   
  176.            
  177.         sql = "select period from accperiod where (" & c & fadate & c & " between startdate and enddate)"  
  178.         rs.open sql,cn,1,3   
  179.         if not rs.eof then   
  180.             speriod = rs("period")   
  181.         end if   
  182.         rs.close   
  183.            
  184.         sql = "select top 1 * from fasub where fasub.ccode <> ' ' order by fadate desc"  
  185.         rs.open sql,cn,1,3   
  186.         if not rs.eof then   
  187.             fadate = rs("fadate")   
  188.         end if   
  189.         rs.close   
  190.            
  191.         sql = "select period from accperiod where (" & c & fadate & c & " between startdate and enddate)"  
  192.         rs.open sql,cn,1,3   
  193.         if not rs.eof then   
  194.             eperiod = rs("period")   
  195.         end if   
  196.         rs.close   
  197.            
  198.         sp = speriod   
  199.         ep = endperiod   
  200.   
  201.         'msgbox eperiod   
  202.         '查询统计累计折旧数据   
  203.         sql="select fasub.ccode,fasub.DeptStaffID,fasub.PrjID,SUM(fasub.creditDep) as sDep from fa,fasub,accperiod where fa.ccode=fasub.ccode and fasub.fatype=3 and (fasub.fadate between accperiod.startdate and accperiod.enddate) and fasub.ccode='" & ccode & "' and accperiod.period >= '" & sp & "' and accperiod.period <= '" & ep & "' group by fasub.ccode,fasub.DeptStaffID,fasub.PrjID"  
  204.            
  205.         rs.open sql,cn,1,3   
  206.         if not rs.eof then   
  207.             rtn = rs("sDep")   
  208.         end if   
  209.     end if   
  210.   
  211.     GetAddUpDep = rtn   
  212.        
  213.     set rs = nothing   
  214.     set cn = nothing   
  215. end function   
  216.   
  217.   
  218.   
  219. function CD(s1)   
  220.   CD="<![CDATA[" & s1 & "]]>"  
  221. end function  

代码上我们可以看到readAccountInfo函数里面用了Do/Loop循环,并且多次打开数据库,多次查询,里面还调用一个子函数GetAddUpDep再次多次打开数据库。
这个过程当数据库仅仅是30条数据的时候已经需要差不多10分钟的处理时间。效率非常的低,而且会导致代码处理超时,页面显示出错。
更改如下:
文档中心