SqlServer会自动将经常使用的对象放入缓存,以提高运行效率(一定范围内SqlServer越用越快)。但它在内存没有消耗殆尽的时候,可能不会主动释放这些资源。因此使用的内存会不断增大。
可以在企业管理器->某服务器上点右键,设置SqlServer服务的内存配置。但建议不要改得太小。

解决方案 »

  1.   

    这是sql的内存管理机制决定的在可用内存足够的时候,SQL不会释放内存,只有到了无可用内存时,SQL才释放掉内存
      

  2.   

    参考联机帮助上的说明动态管理 Windows NT 和 Windows 2000 上的内存
    当 SQL Server 数据库引擎在 Microsoft® Windows NT® 或 Windows® 2000 上运行时,其默认内存管理行为并不是获取特定的内存量,而是在不产生多余换页 I/O 的情况下获取尽可能多的内存。为此,数据库引擎获取尽可能多的可用内存,同时保留足够的可用内存以防操作系统交换内存。SQL Server 实例在启动时通常获取 8 到 12 MB 的内存以完成初始化过程。当实例完成初始化后,就不会再获取更多的内存,直到用户连接到该实例并开始产生工作负荷。这时,该实例根据需要不停地获取内存以支持工作负荷。随着更多的用户连接并运行查询,SQL Server 将获取支持需求所需的额外内存。该实例将继续获取内存直到达到自身的内存分配目标,并且直到达到该目标的下限才会释放任何内存。为了在不产生多余换页 I/O 的情况下获取尽可能多的内存,SQL Server 的每个实例都设置一个内存获取目标,直到计算机的可用物理内存在 4 MB 到 10 MB 的范围内。之所以选择该范围是因为测试表明 Windows NT 和 Windows 2000 都有最小内存交换,直到内存分配等于可用物理内存减去 4 MB。工作负荷处理任务重的 SQL Server 实例保留的可用物理内存为范围的较低端 (4 MB);工作负荷处理任务轻的实例保留的可用物理内存为范围的较高端 (10 MB)。SQL Server 实例的目标随工作负荷的改变而变化。当更多的用户连接并产生更多的工作时,该实例倾向于获取更多的内存以使可用的内存保持在 4 MB 的限制以下。当工作负荷减轻时,该实例将其目标调整为 10 MB 的可用空间,并释放内存给操作系统。将可用空间量保持在 10 MB 与 4 MB 之间可防止 Windows NT 或 Windows 2000 过多执行换页操作,同时使 SQL Server 得以获得尽可能最大的高速缓冲存储器而不至引起额外的交换。实例的目标内存设置与数据库缓冲池的页相对于可用池大小的需求有关。在任何即时点,缓冲区页的总需求取决于满足所有当前执行的查询所需的数据页数。如果相对于高速缓冲存储器内的页数,数据页的需求很大,则当前在缓冲区内的每一页很可能在相对较短的时间内由新页替换。这可由"缓冲区管理器"对象的"页生命期"性能计数器来度量。对于相对较小的缓冲区有较高需求的情况将生成短生命期,而纯粹的影响就是使 I/O 增加,因为在页可由多个逻辑读取引用之前往往要被重写。为减轻这个问题,数据库引擎可以获取更多的内存以增加高速缓冲存储器的大小。当页生命期长时,数据库引擎将可用内存定位于目标的高端 (10 MB);而当页生命期短时,数据库引擎定位于目标范围的低端 (4 MB)。随着其它应用程序在运行 SQL Server 实例的计算机上启动,它们消耗内存致使可用物理内存量降到 SQL Server 的目标以下。SQL Server 实例于是从其地址空间释放足够内存,以使可用内存量回到 SQL Server 的目标。如果有其它应用程序停止运行而使可用内存增多,SQL Server 实例将增加其内存分配大小。SQL Server 可以每秒释放并获取几 MB 字节的内存,这使它得以根据内存分配变化作出快速调整。
      

  3.   

    你可以限制sql对内存的使用企业管理器--右键SQL属性--内存--根据你的需要设置SQL可用内存的最大值,或者选择使用固定量
      

  4.   

    謝謝各位,但我以前沒有發生過此問題啊,以前3個月才用到400M內存,現在一天就到400M ,512M內存控制成多少最好呢?  還是我的內存太小啊 !  此sql server上沒有運行erp ,只是自已寫的小程序才用到 !
      

  5.   

    1.是突然变成这样的,还是逐渐变成这种情况的? 
      如果是突然的,可能是那里出了故障
      如果是逐渐变成这样的,可能是正常的,随着数据量的增加和处理负担的加重,服务器内存占用增加也是正常的2.跟踪一下,看看那些处理是异常或耗时的
    开始--程序--MS SQLSERVER
    --事件探察器(SQL Profiler)
    --文件
    --新建--跟踪...
    --设置要跟踪的服务器的信息(连接服务器)--确定
    --设置跟踪的项目...
    --然后数据库的调用情况就会显示出来在跟踪项目设置中,如果不熟悉的话,一般用默认设置
    筛选项目有几个可以注意一下:1.DatabaseName 同于你要检测的数据库名
    2.Error        同于错误,如果经常出现某个编号的错误,则针对此错误号
    3.Seccess      同于0,失败,1,成功,如果是排错,就过滤掉成功的处理