求助:因SQL SERVER导致系统内存过高问题
经常使用MSSQL的朋友都会发现一个小小的网站在运行若干天后MSSQL就会把服务器上所有的内存都吃光,此时你不得不重新启动一下服务器或mssql来释放内存,有人认为是 MSSQL有内存泄露问题,其实不然,微软给我们了明确说明:在您启动SQL Server 之后,SQL Server内存使用量将会持续稳定上升,即使当服务器上活动很少时也不会下降。另外,任务管理器和性能监视器将显示计算机上可用的物理内存稳定下降,直到可用内存降到 4 至 10 MB 为止。仅仅出现这种状态不表示内存泄漏。此行为是正常的,并且是 SQL Server 缓冲池的预期行为。默认情况下,SQL Server 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止内存页面交换(在 4 至 10 MB 之间),SQL Server缓冲池就会继续增大。像在与SQL Server 分配内存位于相同计算机上的其他进程一样,SQL Server 缓冲区管理器将在需要的时候释放内存。SQL Server每秒可以释放和获取几兆字节的内存,从而使它可以快速适应内存分配变化。更多信息您可以通过服务器内存最小值和服务器内存最大值配置选项设置 SQL Server数据库引擎使用的内存(缓冲池)量的上下限。在设置服务器内存最小值和服务器内存最大值选项之前,请查阅以下 Microsoft 知识库文章中标题为'内存'一节中的参考信息:319942 HOW TO:Determine Proper sql server(WINDOWS平台上强大的数据库平台) Configuration Settings(确定正确的 sql server(WINDOWS平台上强大的数据库平台) 配置设置)请注意,服务器内存最大值选项只限制 SQL Server 缓冲池的大小。服务器内存最大值选项不限制剩余的未保留内存区域,sql server(WINDOWS平台上强大的数据库平台) 准备将该区域分配给其他组件,例如扩展存储过程、COM 对象、以及非共享 DLL、EXE 和 MAPI 组件。由于前面的分配SQL Server专用字节超过服务器内存最大值配置是很正常的。有关此未保留内存区域中分配的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:316749 PRB:在使用大量数据库时可能没有足够的虚拟内存
/3GB默认情况下,32位的操作系统只能直接分配4GB的内存,其中2GB内存空间是系统预留了供自己使用的。所以,最多只剩下2GB 的VAS(虚拟地址空间)给所有的应用程序,比如SQL Server。你可以启用系统启动文件Bootini上的/3GB标记增加内存,使应用程序可利用的内存达到3GB。需要注意的是,VAS仅仅是所有可供使用的地址集,不是物理内存。
PAE (物理地址扩展)
PAE是IA32处理器新增的功能,用于分配大于4GB的物理内存。可以通过开启系统启动文件bootini上的/PAE开关启用PAE。
AWE (址窗口化扩展控件)
AWE可以在32位操作系统上扩展应用程序的执行能力。它允许应用程序访问超出已配置的最大虚拟内存地址空间的可用物理内存。SQL Server 2005的优势是它支持AWE内存映射这种动态分配方式。如果SQL Server只需要很少的资源,它会通过AWE将多余部分内存返还给操作系统供其他的进程或应用程序使用。另外,AWE被支持的动态映射物理内存只能小于已配置的最大虚拟内存地址空间。而在64位系统上有启用AWE配置选项,但是它的配置是被忽略不计的。
注意
1 启用PAE是目的是让AWE内存访问量大于4GB。如果/PAW的开关没有开启,当内存超过4GB的时候,AWE无法再预置内存。
2 当/3GB开关与/PAE开关同时启用,操作系统不能使用超过16GB的内存。这是由于考虑到内核虚拟内存空间。如果系统重启的时候在bootini文件中开启/3GB开关,而系统又有大于16GB的物理内存,额外的内存并没有被操作系统使用。不开启/3GB开关重启系统将使用所有的物理内存。
详细信息你可以参考下面的文章配置SQL Server 使用大于2GB的物理内存。参考:
这些占用着的内存,其实是数据缓存如果内存够大,那就别删了删除后会减低性能和效率
如果一定要删,实质上是通过最大值开限制内存开销:
1、鼠标右键实例-->属性-->内存
2、设定最大内存 即可
3、
最大值(数量或大小)对象SQLServer7
0SQLServer2000批处理大小65,536网络数据包大小165,536网络数据包大小1每个短字符串列的字节数8,0008,000每个text、ntext、或image列的字节数2最大值(数量或大小)对象SQLServer7
0SQLServer2000批处理大小65,536网络数据包大小165,536网络数据包大小1每个短字符串列的字节数8,0008,000每个text、ntext、或image列的字节数2GB-22GB-2每个GROUPBY、ORDERBY的字节数8,060每个索引中的字节数9009002每个外键的字节数900900每个主键的字节数900900每行字节数8,0608,060存储过程源文本中的字节数批处理大小之较小者或者250MB批处理大小之较小者或者250MB每个数据表的聚集索引数11GROUPBY、ORDERBY中的列数只受字节数限制GROUPBYWITHCUBE或WITHROLLUP语句中的列数或表达式数目10每个索引的列数1616每个外键的列数1616每个主键的列数1616每个基础数据表的列数1,0241,024每个SELECT语句的列数4,0964,096每个INSERT语句的列数1,0241,024每个客户端的连接个数已配置连接的最大值已配置连接的最大值数据库大小1,048,516TB31,048,516TB3每个SQLServer实例的数据库个数32,76732,767每个数据库的文件组个数256256每个数据库的文件个数32,76732,767文件大小(数据)32TB32TB文件大小(日志)4TB32TB每个数据表的外键表引用253253标识符长度(以字符计)128128每台计算机的实例数暂缺16包含SQL语句的字符串长度(批处理大小)65,536网络数据包大小165,536网络数据包大小1每个连接的锁数每个服务器的最大锁数每个服务器的最大锁数每个SQLServer实例的锁数2,147,483,647(静态)SQLServer40%的内存(动态)2,147,483,647(静态)SQLServer40%的内存(动态)嵌套存储过程层数3232嵌套子查询3232嵌套触发器层数3232每个数据表的非聚集索引个数249249SQLServer实例中同时打开的对象个数42,147,483,647(或可用内存)2,147,483,647(或可用内存)每个数据库中的对象个数2,147,483,64742,147,483,6474每个存储过程的参数个数1,0241,024每个数据表的REFERENCE个数253253每个数据表的行数受可用存储资源限制受可用存储资源限制每个数据库的数据表个数受数据库中的对象个数限制4受数据库中的对象个数限制4每个SELECT语句的数据表个数256256每个数据表的触发器个数受数据库中的对象个数限制4受数据库中的对象个数限制4每个数据表的UNIQUE索引个数或约束个数249个非聚集索引和1个聚集索引249个非聚集索引和1个聚集索引1
网络数据包大小是表格格式数据方案(TDS)数据包的大小,该数据包用于应用程序和关系数据库引擎之间的通讯
默认的数据包大小为4KB,由networkpacketsize配置选项控制
2
在SQLServer2000中,任何键的最大字节数不能超过900
可以使用可变长度的列来定义键,只要在这种列中不插入数据超过900字节的行,其最大大小就可以在900以上
有关更多信息,请参见索引键的最大值
3
当使用SQLServer2000DesktopEngine或Microsoft数据引擎(MSDE)1
0时,数据库的大小不能超过2GB
4
数据库对象包括所有的表、视图、存储过程、扩展存储过程、触发器、规则、默认值及约束
Sql Server系统内存管理在没有配置内存最大值,很多时候我们会发现运行Sql Server的系统内存往往居高不下。这是由于他对于内存使用的策略是有多少闲置的内存就占用多少,直到内存使用虑达到系统峰值时(预留内存根据系统默认预留使用为准,至少4M),才会清除一些缓存释放少量的内存为新的缓存腾出空间。
这些内存一般都是Sql Server运行时候用作缓存的,例如你运行一个select语句, 执行个存储过程,调用函数;
1 数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来, 下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。
2执行命令缓存:在执行存储过程,自定函数时,Sql Server需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。
在我们执行完相应的查询语句,或存储过程,如果我们不在需要这些缓存,我可以将它清除,DBCC管理命令缓存清除如下:
--清除存储过程缓存DBCC FREEPROCCACHE
--注:方便记住关键字FREEPROCCACHE 可以拆解成FREE(割舍,清除) PROC(存储过程关键字简写),CACHE(缓存)
--清除会话缓存
DBCC FREESESSIONCACHE
--注:FREE(割舍,清除) SESSION(会话)CACHE(缓存)
--清除系统缓存
DBCC FREESYSTEMCACHE('All')
--注:FREE SYSTE MCACHE
--清除所有缓存
DBCC DROPCLEANBUFFERS
--注:DROP CLEAN BUFFERS
默认值就行了,如果你操作系统上sqlserver不想占用太多,那么就设个你内存的80%左右
SQL是自动调用内存机制的,初始占用内存大小取决你的系统内存大小,最低约需要2GB,最高约可占用系统内存的80%。
1、SQL Server 作为一个数据库服务系统,它的作用就是以尽可能高效、实用的方式管理数据,所以,它占用服务器内存高是很普遍的现象。
2、但是如果在SQL数表设计、存储过程代码编写、临时表的应用中,不注意考虑内存占用与释放,CPU运算,可能会额外的造成不必要的内存占用、CPU占用等。
3、SQL Server在运行过程中,一般会以它认为需要的量去占用内存,对于企业实际运行的SQL Server来说,一般都使用专业级别的服务器,一般都配上几十甚至上百G的内存,不过,即便是这样,内存也不一定够,它基本上会把设定为它可以用的内存给吃干净。因为它的目标就是以最高的效率查找和提供数据。
4、如果它的内存占用你受不了,让你的电脑没法正常运作了,那你可以设定它的最大内存占用,一般去SQL Server管理工具中,找服务器的属性,然后找到相关的参数,作个调整即可。
5、如果你是在你工作或娱乐的电脑上安装了一个SQL Server,用于工作或学习,那么,在不用时,停止SQL Server相关服务,内存即可被基本完全空出(它对CPU的占用也会停止)。(SQL Server 2000及以前版本在托盘中有一个小工具可以控制起动或停止,其后的版本,需要去控制面版中的“服务”中去停相关的应用。)
0条评论