环境VB6.0 sp6 + ADODB 2.8
SQL - Server 服务器在远程计算机上安装(服务器100M带宽)
客户机使用ADSL与SQL服务器连接。
代码如下(以下代码毫无实际意义,只是为了试验其效率):
Dim Conn As Connection
    Set Conn = New Connection
    Conn.ConnectionString = "Provider=SQLOLEDB.1;User ID=sa;Password=77882447;" & _
        "Initial Catalog=TEST;Data Source=61.233.xx.xx"
    Conn.CursorLocation = adUseServer
    Conn.Open
    Dim Rs As Recordset
    Set Rs = Conn.Execute("select * from 表1") '由于网络原因,此查询耗时2秒
    Set Rs = Conn.Execute("select * from 表2")
    Set Rs = Conn.Execute("select * from 表3")
    Set Rs = Conn.Execute("select * from 表4")
    Set Rs = Conn.Execute("select * from 表5")
    Set Rs = Conn.Execute("select * from 表6")
    Set Rs = Conn.Execute("select * from 表7")
    Conn.Close执行以上7条查询操作,耗时10秒以上。有没有什么方法可以优化此速度?
使用存储过程也不行,难道使用宽带远程连接SQL服务器就这么低效吗?其实我想要的是一种客户机通过ADSL连接远程SQL-Server服务器,执行SQL查询的高效方案。也可以不用ADO,而用其它更高效的方法。但我只知道用ADO...望高手指导!

解决方案 »

  1.   

    不要select*,只select需要的字段,而且应该优化数据库的索引
      

  2.   

    我的意思是,可否使用DCOM或COM+技术,比如类似与.net中的透明代理,一类的中间件技术来提高网络访问的效率?
      

  3.   

    主要在数据库设计和SQL语句方面下功夫
      

  4.   

    主要做的是限制搜索范围 网络接口速度是限定了的 除非你象FLASHGET多线程下载那样   也许会提高传输速度
      

  5.   

    主要做的是限制搜索范围 网络接口速度是限定了的 除非你象FLASHGET多线程下载那样   也许会提高传输速度
    ---------------------------------
    同时做很多查询?
    看到LZ写的Select*,我就想到了,如果把这些东西Select到本地,处理好了再上传的方法。
    打开的时候线先非常慢的接数据库,然后速度就是本地的非常快了。
    这也许不是最好的办法,但是如果真的是大量数据读写,也许是最好的办法。
      

  6.   

    asp/asp.net的方式不错,在服务器端处理好所有的查询(速度是非常快的),然后将结果以字符串形式(HTML/XML)返回客户端。这样的速度是很理想的(比客户端用ado连接sql服务器更快)。
    我知道在.net中,有一种解决方案,就是SOAP。但我不知道在vb6中如何使用。
      

  7.   

    其实我问的不是sql语句优化效率的问题。我的问题是如何让客户端更快的执行sql语句,得到结果。
      

  8.   

    问 MS SQL Server DBA。
      

  9.   

    首先看看你的语句在SQL Server里面的执行时间是什么如果你在SQL Server里面的执行时间是5秒的话,那么在应用程序里面执行时间不会低于这个时间那么这种情况下所谓的提高执行效率,就是对该表中常用条件增加索引,以便达到更快的速度如果说你在SQL里面的执行速度已经优化的很好的话,还想进一步提升速度,其实有个变通的方法不过很BT就是先用Select * From TableName把这个表所有数据弄下来,这样第一次执行的时间会比较长,但是可以考虑使用异步执行获得RecordSet的方法,减低用户感觉然后通过RecordSet的Filter来进行过滤
    比如客户仅仅要高速查询某些数据,比如
    Select * from TableName where address='地址1'
    Select * from TableName where address='地址2'
    .....
    就使用 
    Recordset.Filter="address='地址1'"
    Recordset.Filter="address='地址2'"
    .....
    这样应该比每次打开新的RecordSet速度要快点
    不过内存占用......
      

  10.   

    不好意思,谢谢大家了!
    其实我的问题是,VB中如何实现服务器端控件。
    比如,客户端建立服务器端控件的实例,然后调用服务器端控件的方法获得数据,服务器端控件则在服务器上运行,在服务器上连接本地SQL数据库获得数据,然后通过二进制串的形式吧结果反悔给客户端。这样,要比客户端直接连接服务器端的SQL数据库执行查询效率要高。
    这个问题在.net很好解决,可在vb6中我实在不知道该怎么做。
    由于最近在改一个vb6写的单机版程序,要改成网络的,所以迫切希望得悉vb6中此技术的运用!
      

  11.   

    查询最好是在服务器段完成,查询结果通过网络传递给客户端。在客户端用ADO直接连数据库再快也快不到哪儿去。
      

  12.   

    我的意思是,可否使用DCOM或COM+技术,比如类似与.net中的透明代理,一类的中间件技术来提高网络访问的效率?
    ----------------------------------------
    你要的中间层,DCOM和COM+是可以的,或者webservices都可以
    不过你问题中的示例,或许并非使用了中间层就可以解决了,听听上面大家的意见吧
      

  13.   

    你的清楚,使用代理越多耗时只会越多,最简单最快的就是最直接的。
    首先由于你的PC部署现状,所以建议你不要频繁的去访问Server端,你可以通过一次访问获取你所有需要的信息,构建数据包一起返回,减少COM+在客户端和中间层的通信耗时;
    另外采用Conn.CursorLocation   =   adUseServer 设置你的考虑清楚,如果没有必要可以采用adUseClient就可以了;
    还有由于是跨PC或进程访问,所以你应该尽量考虑去取最小但又是全面的信息,用“*”的Select是不推荐的;
    最后,所有的获取数据逻辑应该尽量使用SQL内部,比如可以加一些过滤(Where)而避免到客户端循环来提升效率。
    使用COM或COM+访问,他能省去你一些低层通信的问题,特别是多层部署问题,无法提升你的访问效率。
    希望能对你有所帮助。
      

  14.   


    我的问题已经解决了,我自己写了一个基于Wisock的控件。谢谢大家了!http://topic.csdn.net/u/20080818/20/c370d5af-74e4-4eac-a444-4838b43fdaf4.html一起分享·