有一个表中有十多个字段,除了主键外均为img类型,每个字段存贮的图片都大约有800多K,当存储了几百条记录后,为了添加记录,在运行select语句很慢,请问怎么能提速select的查询速度!!如下:Public adors As ADODB.Recordset
Set adors = New ADODB.Recordset'*************************************************************
adors.Open "SELECT * FROM (表名) where 1=2", adocn, adOpenDynamic, adLockOptimistic
'********************************************这条语句特别慢
adors.addnew
    adors.Fields("XH").value = n
    Call FileToDB(adors(4), App.Path & "\tif\DDXFB.tif")
    Call FileToDB(adors(5), App.Path & "\tif\DDXFB.tif")
    Call FileToDB(adors(6), App.Path & "\tif\DDXFB.tif")
    Call FileToDB(adors(7), App.Path & "\tif\Pole.tif")
    Call FileToDB(adors(8), App.Path & "\tif\Pole.tif")
    Call FileToDB(adors(9), App.Path & "\tif\Pole.tif")
    Call FileToDB(adors(10), App.Path & "\tif\JCKYW.tif")
    Call FileToDB(adors(11), App.Path & "\tif\JCKYW.tif")
    Call FileToDB(adors(12), App.Path & "\tif\JCKYW.tif")
    Call FileToDB(adors(13), App.Path & "\tif\lx.tif")
    Call FileToDB(adors(14), App.Path & "\tif\lx.tif")
    Call FileToDB(adors(15), App.Path & "\tif\lx.tif")
 adors.Updateadors.Close
Public Sub FileToDB(ByRef fld As ADODB.Field, DiskFile As String)Dim byteData() As Byte  '字节数据数组
Dim NumBlocks As Long   '块数
Dim FileLength As Long  '文件长度
Dim LeftOver As Long    '余数值
Dim SourceFile As Long  '数据源文件
Const BLOCKSIZE = 4096
Dim i As Long
On Error GoTo ErrorHandlerSourceFile = FreeFile                      'FreeFile函数提供尚未使用的文件号
Open DiskFile For Binary Access Read As SourceFile  'OPEN函数激活对文件的(I/O),二进制
FileLength = LOF(SourceFile)                'LOF函数表示以OPEN语句打开的文件以字节数表示的文件大小'''如果图象文件存在,将其保存到数据库
If FileLength = 0 Then
    Close SourceFile                        'CLOSE函数关闭OPEN函数打开的(I/O)文件
    MsgBox DiskFile & " 无内容或不存在!", 64, "提示"
Else
    NumBlocks = FileLength \ BLOCKSIZE
    LeftOver = FileLength Mod BLOCKSIZE     '取块数后的余数值
    ReDim byteData(1 To BLOCKSIZE)
    For i = 1 To NumBlocks
        Get SourceFile, , byteData()        'GET函数将一个以打开的磁盘文件读入一个变量之中
        fld.AppendChunk byteData()          'AppendChunk属性添加数据到二进制字段
    Next i
    
    ReDim byteData(1 To LeftOver)
    Get SourceFile, , byteData()
    fld.AppendChunk byteData()
    Close SourceFile                        'CLOSE函数关闭OPEN函数打开的(I/O)文件
End IfExit Sub
ErrorHandler:End Sub

解决方案 »

  1.   

    提速在数据库设计时,定义主键,可以提高访问速度
    如果你光是为了增加一条记录,打开记录集的时候,可以用:
    select top 0 * from 表名 这样没有数据的检索,得到的只是字段信息,速度会很快的!如果你要进行SELECT检索,最好数据量不要太大,一条,应该没问题!
      

  2.   

    代码写得很漂亮,应该是VB老鸟了。lihonggen0 的
    1.定义主键,可以提高访问速度
    没有意义,因为贴主已经表明有主键。而且主键在增加查询速度的同时不可避免的增加的插入和修改的速度。
    2.select top 0 * from 表名 
    有一定的意义。因为虽然where条件恒为false,但是SQL引擎还是会扫描全表。而select top 0不会有这个问题。可以试一下,估计改进有限。victorycyz(中海) 的
    不失为一个好办法。数据表/库大了是会影响查询速度的。
    如果你一定要把图片放在库里,还有个治标不治本的办法。在你的示例代码中多次出现不同字段存同一图片,如果实际情况就是这样,我觉得不妨抽出来单独做一个表。原表中只存图片的名称/ID
      

  3.   

    建议你采用SQL语句来完成插入操作。例如:
    sql="insert into table(xh ) values(n) "
    adocn.excute sql然后再
    '*************************************************************
    adors.Open "SELECT * FROM (表名) where xh=n", adocn, adOpenStatic,adLockOptimistic
                                                         ^^^^^^^^^这样也可以提速  
    '********************************************这条语句特别慢
       ' adors.Fields("XH").value = n
        Call FileToDB(adors(4), App.Path & "\tif\DDXFB.tif")
        Call FileToDB(adors(5), App.Path & "\tif\DDXFB.tif")
        Call FileToDB(adors(6), App.Path & "\tif\DDXFB.tif")
        Call FileToDB(adors(7), App.Path & "\tif\Pole.tif")
        Call FileToDB(adors(8), App.Path & "\tif\Pole.tif")
        Call FileToDB(adors(9), App.Path & "\tif\Pole.tif")
        Call FileToDB(adors(10), App.Path & "\tif\JCKYW.tif")
        Call FileToDB(adors(11), App.Path & "\tif\JCKYW.tif")
        Call FileToDB(adors(12), App.Path & "\tif\JCKYW.tif")
        Call FileToDB(adors(13), App.Path & "\tif\lx.tif")
        Call FileToDB(adors(14), App.Path & "\tif\lx.tif")
        Call FileToDB(adors(15), App.Path & "\tif\lx.tif")
     adors.Updateadors.Close
      

  4.   

    楼上的,这种方法我已经试过了,没有太大的起色的,谢谢,大家了,其实我是用图片举了个例子,我是把一种文件存到数据库里了,这种文件经常更新的,用的方法和存图片是一样的罢了,我是用的SYBASE数据库的,现在这个问题仍然没有解决的办法,看来只能写个存储过程了,估计也快不了多少的!先把帖子结了吧