请问各位有没有遇到这个错误信息?
服务器win2000 + ms sql2000 + midas + borland socket server
客户端不到20个,连续每天24小时运行了几周后,最近频频报这个错误。未能执行所请求的操作,因为可用内存少于最小查询内存。请减小 'min memory per query' 服务器配置选项的配置值。
我没有办法只好重启服务器。请问这样的错误是不是服务器内存耗尽了?应该是那方面的原因造成的?我服务器端的远程数据模块狠简单,只是放了一些查询组件而已,不至于内存泄漏吧狠奇怪,拜托大家了

解决方案 »

  1.   

    min memory per query 选项
    使用 min memory per query 选项指定将分配给查询执行时所需要的最小内存量(以 KB 为单位)。例如,如果将 min memory per query 设置为 2048 KB,则查询保证将至少获取那么多的总内存。可以将 min memory per query 设置为从 512 到 2147483647 KB (2 GB) 之间的任何值。默认设置为 1024KB。Microsoft® SQL Server™ 2000 查询处理器尝试确定分配给查询的最佳内存量。min memory per query 选项允许管理员指定任何一个查询将获得的最小内存量。如果查询需对大量数据执行哈希和排序操作,则这些查询获得的内存通常比该选项指定的最小内存多。对于一些小型查询和中等大小的查询,增大 min memory per query 的值可以提高性能,但会导致内存资源争夺加剧。min memory per query 包括分配给排序的内存,并替换 SQL Server 7.0 版或早期版本中的 sort pages 选项。min memory per query 是一个高级选项。如果要用 sp_configure 系统存储过程改变该设置,必须把"显示高级选项"设置为 1,该选项立即生效(无需服务器停止并重新启动)。
      

  2.   

    //这两篇文章都是转的
    SQL Server有一些重要的配置参数。例如它有一个“min memory per query”参数,这是为系统中每一个用户提供的最小内存总量,SQL Server利用这些内存进行排序和连接操作,增加这个数值可能提高查询的速度。把“awe enabled”设置为1并在boot.ini文件中加上“/pae”就可以启用Address Windowing Extensions(即AWE,它是SQL Server 2000的新功能,要求Windows 2000 Advanced Server)。启用AWE之后,我们能够使用多达8 GB的RAM。但是,启用这个功能有一个副作用。启用这个功能之后,SQL Server将在启动时获取大部分可用RAM,而不再是动态分配内存,因此我们必须监视max server memory以及min server memory参数,以免系统变得太慢。表1,SQL Server的参数设置 
    参数 默认值 如何调整 
    max_worker_threads 255 依赖于数据库负载的大小,降低这个数值可能提高性能。 
    min_server_memory zero (0) SQL Server能够动态分配内存。预先分配一些内存可能会提高响应速度(例如,把这个参数设置成50 MB,然后看看性能是否有所改善)。 
    max_server_memory SQL Server根据需要动态分配内存。 如果不启用AWE,SQL Server 2000最多能够使用3 GB内存(SQL Server 7最多使用2 GB内存)。 
    你可以通过设置各种参数来提高数据库性能。max_worker_threads、min_server_memory以及max_server_memory都属于重要的参数。 
      

  3.   

    to: daijingjie2002
    使用的是动态内存分配to:whbo,Kshape:
    我发现服务端程序占用内存并不是很多,ms sql的内存占用量很大。
    服务端程序只是很简单的远程数据模块,内放置了几个简单的查询组件。几乎所有功能都是midas实现的,我的代码很少系统的分层大体是:客户端--》midas--》服务端(远程数据模块)--->mssql数据库对于资源,我想,应该不是客户端问题,客户端使用查询组件很小心,每次都先close再查询open
    既然是“ms sql的内存占用量很大”,而且是mssql最终报错,我怀疑是“服务端(远程数据模块)--->mssql数据库”之间出了问题而mssql最终给出这个错误,我想原因肯定是内存申请失败造成的,而不是表面上的“min memory per query ”设置问题(这个设置我没动过,一直是1024K,默认值)我想是不是我的服务端(远程数据模块)某些设置不对,造成占用了过多的mssql资源?
    因为服务端代码不多,所以我才怀疑是某些设置或者运行方式的问题
      

  4.   

    //如果照你说的话,我就不清楚具体的原因了
    //你看看如果这里设置了可以吗?如果不行我也就没法了
    ---------------------------------------------------------------------------------如何设置最小查询内存(企业管理器)
    1.展开一个服务器组。
    2.右击一个服务器,再单击"属性"。
    3.单击"内存"选项卡。
    4.在"最小查询内存"框中,键入或选择一个介于 512 到 2147483647 KB 之间的值。 
    默认值为 1024 KB。
      

  5.   

    改造你的服务器的查询模式,不要用TCLIENTDATASET自带的分包获取模式:
    例如 服务器端:
    function TCoTestAccount.MSearch(const PSql: WideString): OleVariant;
    begin
      AQSearch.Close;
      AQSearch.SQL.Clear;
      AQSearch.SQL.Text:=trim(Psql);
      AQSearch.Open;
      if not AQSearch.IsEmpty then
      begin
        Result:=DspSearch.Data;
      end else
      begin
        Result:=Null;
      end;
      AQSearch.Close;
    end;客户端:
    sql:='Select top n from tablename where id>'+curmaxid;
    Datas:=ClientDm.ATest.MSearch(Sql);
        if Not VarisNULL(dATAS) THEN
        BEGIN
          CdsTypes.Close;
          CdsTypes.Data:=NULL;
          CdsTypes.Data:=DATAS;
          DATAS:=Null;
        END;用语句来控制的查询,,分页等。这样服务器始终保持最小的内存使用状态!!!说的有点模糊,,见晾个人意见,只供参考!!!
      

  6.   

    尽管问题还没有解决,还是要谢谢Kshape同志的热心回答to:Erice
    这样只是关注于解决客户端和服务器端的数据交互啊,而我感到不是他们之间的问题
      

  7.   

    每个客户端都会创建独立的服务器线程,如果每个客户端都有一个数据连接,那么20个客户端就有20个数据库连接。服务器此时需要多大的内存服务!!!!还有,用TCLIENTDATASET+TPROVIDER如果不自己写代码优化,服务器上还是保存有状态的,例如:你带开的数据表,会在客户端独立的服务器线承中一直打开等等,同样会影响服务器的性能;对了 以前写过一个分布式的程序,测试时,单个服务器可以连接65个客户端,不会出现问题,当客户端无操作时,服务器端在服务器内存中只占服务器端可执行文件的本身大小,有兴趣可以一起学习!!!
      

  8.   

    让erice这么一说,我感到我以前的理解有问题,同时,要重新修改程序似乎太困难了