有一个表中有十多个字段,除了主键外均为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
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
解决方案 »
- 请问一下在datareport中,如何显示;两个关联表的内容。大体上说明一下在dataEnvironment如何操作
- SQL查询求助
- 本人开公司,寻找有项目的人合作?
- 一个查询问题
- 汗...VB居然可以调用ACDSEE的DLL来转换图片格式
- 请问哪里有傅立叶变换的代码?
- 我就不信,没有人回答这个问题,我就疯狂放分了~~~~~~~~(vb论坛人气怎么这么小呢?)
- 怎样在报表中每页打印第几页、页数,之类的东东??
- 如何通过ADO查看数据库某条记录的更新时间
- 如何发送或接收>128的ASCII码字符(VB5)
- 有没有简单方法实现无模式对话框的MessageBox?
- 二百分求,VB程序中一条select语句的提速与优化方法!!
如果你光是为了增加一条记录,打开记录集的时候,可以用:
select top 0 * from 表名 这样没有数据的检索,得到的只是字段信息,速度会很快的!如果你要进行SELECT检索,最好数据量不要太大,一条,应该没问题!
1.定义主键,可以提高访问速度
没有意义,因为贴主已经表明有主键。而且主键在增加查询速度的同时不可避免的增加的插入和修改的速度。
2.select top 0 * from 表名
有一定的意义。因为虽然where条件恒为false,但是SQL引擎还是会扫描全表。而select top 0不会有这个问题。可以试一下,估计改进有限。victorycyz(中海) 的
不失为一个好办法。数据表/库大了是会影响查询速度的。
如果你一定要把图片放在库里,还有个治标不治本的办法。在你的示例代码中多次出现不同字段存同一图片,如果实际情况就是这样,我觉得不妨抽出来单独做一个表。原表中只存图片的名称/ID
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