大数据量查询,SQL查询分析器速度很快,VB 程序查询速度很慢很慢

catman3000 2003-06-18 07:06:34
我有一个联合查询,包含了 Table1 和 Table2,其中Table1数据量有200多万,Table2 数据不多,如下查询:
SELECT Table1.* FROM Table1,Table2 WHERE Table1.Field1=Table2.Field1 AND (Table2 的限制条件语句)

这个查询返回8000来条记录,在 SQL 查询分析器中花1秒多就查出来了,但用 ADO 的 RecordSet 查询,竟然要30秒钟!!!

该查询语句在VB中如下执行:
Rs.open Sql,conn,adOpenStatic,adLockReadOnly

试过修改后面两个参数,不管用。
我该怎么办呢?
...全文
265 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leimin 2003-06-20
  • 打赏
  • 举报
回复
256M内存的就要30秒才查出来8000条。??
太慢。你需要更新INDEX,TRY :
DBCC DBREINDEX
在试试看。
yckou 2003-06-20
  • 打赏
  • 举报
回复
将服务器游标改成客户端游标试一下.
catman3000 2003-06-19
  • 打赏
  • 举报
回复
谢谢大家的回答,补丁是打到了SP3,索引该建立的都建立了,今天又去测试了一下,发现查询分析器也很慢,可能是昨天加了一个视图的原因,今天发现出了很多问题,把视图删除了,就都慢起来了。经过分析,感觉内存是一个原因,在另外一台512M内存的机器上面7秒就全部出来2万多条关联查询,这台256M内存的就要30秒才查出来8000条。另外看来对大数据量的表关联查询的时候,如果返回8000条数据,其实数据库要在大表中搜索8000次,由于表太大,虽然索引都有,但还是会慢。
kingdier 2003-06-18
  • 打赏
  • 举报
回复
加上补丁会大大减少 延时的概率~~ 但偶尔还是会遇到~~
估计是ADO机制本身的缺限~~ 可通过加大数据源索引buffer 根本解决~~
zjcxc 2003-06-18
  • 打赏
  • 举报
回复
你如果没有打补丁的话,最好先打上.
我的程序中就试过这样的情况,用同一条语句打开表,在A过程中不用1秒钟就打开了,在B过程中要15秒,两个过程中的打开方式全部一样.
我找了很久都没有找到原因,最后打上sql sp3的补丁后,一切正常.
matboy 2003-06-18
  • 打赏
  • 举报
回复
如果仅仅是Rs.open Sql,conn,adOpenStatic,adLockReadOnly这条语句,其查询速度不可能与查询分析器相差这么多,如果ADO查询时间准确的话,很可能是查询分析器中执行前已经执行过相关表的某个查询,导致没有重新执行规划,因此速度会比较快,不过即便如此,我还是不理解为什么会差这么多,你这个问题比较妖怪
leimin 2003-06-18
  • 打赏
  • 举报
回复
2个方法,你可以试试
1.在SQLSERVER写一个SP,VB在CLIENT调用该SP返回RECORDSET,效率会有明显的改进。
2.在MSSQLSERVER建立一个VIEW并建立视图索引,在VB调用该视图。
zjcxc 2003-06-18
  • 打赏
  • 举报
回复
我曾经遇过,没装sp3的话,会出现这些东西,你试试看是否这种原因造成的.
catman3000 2003-06-18
  • 打赏
  • 举报
回复
谢谢你们的回答,由于出问题的这台机器在用户的机器上,现在还没法调试,索引是建好了的,这从 SQL 查询分析器返回结果很快,就看出来了,只是不明白为什么要列出字段名呢?

经SQL跟踪,ADO 执行了如下语句:
declare @P1 int
set @P1=180150000
declare @P2 int
set @P2=8
declare @P3 int
set @P3=1
declare @P4 int
set @P4=0
exec sp_cursoropen @P1 output, N'Select jijiantotal.* from jijiantotal,DataChange where DataChange.TableName=''jijiantotal'' and DataChange.SubNum>6406 and DataChange.SubNum<=6447 and DataChange.ServerCode<>''P'' and jijiantotal.jijiantotalId=DataChange.MainKeyId ORDER BY DataChange.MainKeyId ', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4

在 SQL 查询分析器里面,只跟踪到如下语句:
Select jijiantotal.* from jijiantotal,DataChange where DataChange.TableName=''jijiantotal'' and DataChange.SubNum>6406 and DataChange.SubNum<=6447 and DataChange.ServerCode<>''P'' and jijiantotal.jijiantotalId=DataChange.MainKeyId ORDER BY DataChange.MainKeyId
friendliu 2003-06-18
  • 打赏
  • 举报
回复
1.列出字段名;
2.把你的表Table1,Table2的表做索引;
3.也可考虑把做视图,在VB里再SELECT一下试试
wynbfqny 2003-06-18
  • 打赏
  • 举报
回复
Table1.* 改成列出你所要的所有字段名试试

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧