前提:
文本A中有100万数据,每读取一行数据,都要读出一个字符串,然后从access数据库中的表B中查找这个字符串所对应的另一个字符串,然后返回所对应的这个字符串。access数据库表B中只有ID和这个字符串以及这个字符串所对应的另一个字符串三个参数。问题是:数据量很大,access数据库表B中有100万行数据,而文本A中有100万行数据,每一行都要转换的话,就相当于100万×100万次。运行速度非常慢,有什么可以提高运行速度的优化程序嘛?现在想到的是每查找到一行数据,返回字符串后就把这一行删除掉。除了这个方法,还有其他的优化方法嘛?非常非常感谢,这个问题对我来说非常重要,希望高手们指教!!!程序如下:
主程序:
Dim s As String, stemp As String, imsitemp As String, i As Integer, countertemp As Double
Dim m As IntegerDim sArr() As String, sArrTemp() As StringOpen FileIn For Input As #1
    Open FileOut For Output As #2
    Do While Not EOF(1)
        Line Input #1, s
        
        sArr = Split(s)
        imsi = sArr(0) & sArr(1) & sArr(2)
        msisdn = MsisdnCheck(imsi)
函数调用:
Function MsisdnCheck(imsi As String) As String
  On Error GoTo ErrGoto
  Dim conn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Set conn = New ADODB.Connection  
 Dim strConn, strsql, strBuff As String
  
  strConn = "DSN=SCH"
  
  conn.Open strConn
  strsql = "select * from IMSI_MSISDN where imsi='" + imsi + "'"
  
  Set rs = conn.Execute(strsql)
'  rt.Open strsql, cnn, adOpenDynamic, adLockOptimistic
  If rs.EOF = True And rs.BOF = True Then
  MsisdnCheck = " "
  Else
  MsisdnCheck = rs.Fields(2)
  
  End If
  rs.Close
ErrGoto:
' 用户按了“取消”按钮
Exit Function

解决方案 »

  1.   

    索引,记得access是支持index的你的字符串是有重复的么?如果有且重复量大的话,可以先找到,然后再查询再说一句
    100万*100万, 这个数量级是不对的。你循环A肯定是100万了,但是数据库查询应该不是一个循环
      

  2.   

    在access数据库中把所要查找的字符串设置为index,然后在程序里查找,这样会提高速度嘛?
      

  3.   

    你在数据库那个column的数据类型可以看到索引indexed然后你把它设置成yes无重复
    会快
      

  4.   

    听说 Select * 比 Select Fildes 慢那么一点点,只是听说啊,我没试过.你好个Conn做成全局的算了.你现在这样子,要开关开100万次呢
      

  5.   

    你可以试试将文本文件做为access的链表来处理,这样效率要比你的代码高
      

  6.   

    将它们放到Access中,求一CRC(或特征值),不知道能否行。
      

  7.   

    你可以试试将文本文件做为access的链表来处理,这样效率要比你的代码高这个不太会~~~
      

  8.   

    我加入index后速度快了很多,不过仍然需要几十个小时。现在想到的是每查找到一行数据,返回字符串后就把这一行删除掉。这样越到后面速度就会越快。但删除的时候指令运行错误。Function MsisdnCheck(imsi As String) As String
      On Error GoTo ErrGoto
      Dim conn As ADODB.Connection
      Dim rs As ADODB.Recordset
      Set conn = New ADODB.Connection  
     Dim strConn, strsql, strBuff As String
      
      strConn = "DSN=SCH"
      
      conn.Open strConn
      strsql = "select * from IMSI_MSISDN where imsi='" + imsi + "'"
      
      Set rs = conn.Execute(strsql)  If rs.EOF = True And rs.BOF = True Then
      MsisdnCheck = " "
      Else
      MsisdnCheck = rs.Fields(2)
      rs.Delete     '这个为啥不执行呢?一执行就出错,直接跳出函数
      rs.Update
      End If
      
      rs.CloseErrGoto:
    Exit Function
        
      
    End Function
      

  9.   

    你可以试试将文本文件做为access的链表来处理,这样效率要比你的代码高这个不太会~~~
    ----------------------------
    打开access,选择:文件/获取外部数据/链接表,然后按向导操作。这样就可以如操作access一样操作这个链接表了
      

  10.   

    Set rs = conn.Execute(strsql)
    这样的RS是readOnly的