你没有搞清内存、缓存和虚拟内存的关系。Windows进程会开辟属于自己的虚拟内存,包括硬盘上的临时文件。
执行查询后,系统会取回你的查询所要求的记录集(这里专业术语称为游标),存入虚拟内存。游标中有多少记录在缓存(物理内存中开辟的块)中影响的是运行的速度。CacheSize 属性 (ADO)指示缓存在本地内存中的 Recordset 对象的记录数。设置和返回值设置或返回必须大于 0 的长整型值。默认值为 1。说明使用 CacheSize 属性可控制提供者在缓存中所保存的记录的数目,并可控制一次恢复到本地内存的记录数。例如,如果 CacheSize 为 10,首次打开 Recordset 对象后,提供者将前面 10 个记录调入本地内存。当在 Recordset 对象中移动时,提供者返回本地内存缓冲区中的数据;一旦移动超过缓存中最后的记录,提供者便将数据源中随后的 10 个记录恢复到缓存。可以在 Recordset 对象的存活期调整该属性的值,但是更改该值只影响随后从数据源调入缓存的记录数。只更改属性值将不会更改缓存中的当前内容。如果恢复的记录少于 CacheSize 的指定值,提供者将返回其余的记录,且不会产生错误。不允许将 CacheSize 设置为零,否则将返回错误。从缓存恢复的记录不反映其他用户对数据源所作的更改。如需强行对所有缓存的数据进行更新,请使用 Resync 方法。CacheSize 属性范例
该范例使用 CacheSize 属性,说明当使用和不使用记录数为 30 的缓存时,所执行的操作在性能上的差别。Public Sub CacheSizeX()   Dim rstRoySched As ADODB.Recordset
   Dim strCnn As String
   Dim sngStart As Single
   Dim sngEnd As Single
   Dim sngNoCache As Single
   Dim sngCache As Single
   Dim intLoop As Integer
   Dim strTemp As String   ' 打开 RoySched 表。
   strCnn = "Provider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
   Set rstRoySched = New ADODB.Recordset
   rstRoySched.Open "roysched", strCnn, , , adCmdTable   ' 枚举记录集对象两次并记录已播放时间。
   sngStart = Timer   For intLoop = 1 To 2
      rstRoySched.MoveFirst      Do While Not rstRoySched.EOF
         ' 为性能测试执行一个简单的操作。
         strTemp = rstRoySched!title_id
         rstRoySched.MoveNext
      Loop
   Next intLoop   sngEnd = Timer
   sngNoCache = sngEnd - sngStart   ' 以 30 个记录为一组缓存记录。
   rstRoySched.MoveFirst
   rstRoySched.CacheSize = 30
   sngStart = Timer   ' 枚举记录集对象两次并记录已播放时间。
   For intLoop = 1 To 2      rstRoySched.MoveFirst
      Do While Not rstRoySched.EOF
         ' 为性能测试执行一个简单的操作。
         strTemp = rstRoySched!title_id
         rstRoySched.MoveNext
      Loop
   Next intLoop   sngEnd = Timer
   sngCache = sngEnd - sngStart   ' 显示性能结果。
   MsgBox "Caching Performance Results:" & vbCr & _
      "   No cache: " & Format(sngNoCache, _
      "##0.000") & " seconds" & vbCr & _
      "   30-record cache: " & Format(sngCache, _
      "##0.000") & " seconds"
   rstRoySched.CloseEnd Sub

解决方案 »

  1.   

    谢谢,可是,小弟还是有几个问题还是不大明白,还想请您看看1,通过ADO来访问SQL server的数据的过程,是不是这样的,  首先将由SQL server上访问到的数据存在本地(硬盘或内存中。如果一条SELECT语句会返回几十万条数据,是不是全部存放在本地?)
      接着,再将一部分存在本地的数据放入缓存以供recordset访问(存入多少由cachesize来设定),当要访问的数据不再缓存中时,再从本地数据中调入缓存(而不是从SQL server上调用)。  不知道访问过程是不是这样的?
     
    2.您提到的“数据源”我认为指的是本地的数据(由sql server返回到本地的数据集),而不是指SQL server上的数据,对不对?3,可否推荐一些讲述 ADO,OLE DB,ODBC的工作原理的资料,书籍。再次感谢