sqlserver 2005内存配置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何降低SQL Server 2005内存使用量与设置
我的数据库服务器内存为8G,现在资源管理器显示内存用到5G,可以肯定是sql server数据库吃内存原因。
MSSQL占用了太多的内存,而且还不断的增长;或者说已经设置了使用内存,可是它没有用到那么多,这是怎么一回事儿呢?
MSSQL是怎样使用内存的:
最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉。所以一般我们在看statistics io的时候,看到的physics read都是0。其次就是查询的开销,一般地说,hash join 是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销的。所以用于关联和排序的列上一般需要有索引。
再其次就是对执行计划、系统数据的存储,这些都是比较小的。我们先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内存,数据缓存一般是越多越好,甚至有些时候我们会强行把一些数据pin在高速缓存中。但是如果有其它应用程序,虽然在需要的时候MSSQL会释放内存,但是线程切换、IO等待这些工作也是需要时间的,所以就会造成性能的降低。
方法:可以考虑增加内存,优化数据库和代码,设置MSSQL的最大内存使用等等。 max server memory 和min server memory,如何设置(2种) 1.通过SSMS界面中的服务器属性可以设置 2. --通过sp_configure设置
EXEC sp_configureN'min server memory (MB)',N'替换最小值' GO
RECONFIGURE GO
EXEC sp_configureN'max server memory (MB)',N'替换最大值' GO
RECONFIGURE GO
如果没有其它应用程序,那么就不要限制MSSQL对内存的使用。
然后来看查询的开销,这个开销显然是越低越好,因为我们不能从中得到好处,相反,使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免中间表和游标的使用,在经常作关联和排序的列上建立索引。
除了限制SQL使用内存之外,还可以优化数据库设计,比如没有必要用char(100)的地方,就用varchar,没有必要用int的地方就用smallint, tinyint,
没有必要用双字节nvarchar的地方,就用varchar,这些都能有效减少读入内存的数据。但如果有很多历史数据的话,很多人都不会去做的。
或者就是优化SQL代码。
名人堂:众名人带你感受他们的驱动人生马云任志强李嘉诚柳传志史玉柱
合理设置内存让数据库与其他程序共存
在SQL Server数据库中,有min server memory与max server memory两个内存选项。。在达到min规定的内存数量之前,数据库引擎缓冲池是不会释放它获取的任何内存。min内存数量为50M。查询作业执行完毕后,只要没有达到50M这个值。则数据库系统不会把没有的20M 内存还给操作系统,而是一直占用着,以方面后续的作业。如果用户需要调用数据库系统中的函数或者过程,此时内存的需要量可能会超过规定的最小内存量,如达到80M。数据
库引擎缓冲池从不将内存分配降低到最小内存所指定的水平下。也就是说,此时数据库最多会释放30M的内存,为自己留下50M的内存空间,即使当前其可能只需要用到40M内存空间即可。当然在抓取内存空间的时候,其也不会为自己分配高于MAX内存所规定的内存空间。
为此如果能够把数据库的最低内存设置的比较低的话,则数据库系统在用完内存话就可以马上把内存释放出来,而不会为自己保留比较大的暂时不同的内存空间。同理,在保障业务需求的情况下把最大内存设置的比较小,则可以为其他应用程序留下比较多的内存空间。如果一台服务器上只运行了一个数据库应用程序,或者说数据库的应用比较简单、数据库内存使用量基本上不会超过最小内存数量的花,则可以采用默认多参数配置。但是如果在同一台服务器上部署了比较多的应用程序或者数据库设计比较复杂,此时就需要对数据库的最小内存与最大内存进行配置,以实现多个应用程序能够实现和平共处。数据库就需要采用一定的保护措施,需要设置最小内存与最大内存,来保障自己数据库正常运行所需要的内存空间。一般来说,最好把最小内存设置的小一点,而把最大内存的花设置的大一点。如此的话,可以让数据库引擎在管理内存的时候有比较大的灵活性。然后再进行后续监测的数据来进行相应的调整,慢慢的把内存配置调整到最优。
要分析数据库系统内存的使用大户,跟其他应用程序的内存使用高峰分流。数据库中函数、过程、复杂的视图、备份等作业都会用到比较可观的内存。如企业如果在SQL SERVER数据库上面部署了ERP系统,而系统中有一个“库存采购”作业,这个需要用到比较复杂的业务逻辑,需要考虑到库存、安全库存、包装数量等等比较复杂的计算。为此最好能够把这个作业放到服务器比较空的时候运行,以跟其他应用程序错开运行。备份作业需要用到比较多的内存,为此最好能够把各种应用程序的备份作业错开来运行。如此的话可以减少应用程序之间内存的占用。
如果把最小内存与最大内存的值设置为相同,那么会产生什么情况呢?如果把它们设置为相同的值,则一旦分配给数据库引擎的内存达到这个值的话,则数据库引擎将停止为缓冲池动态释放和获取内存。也就是说,此时数据库内存的分配就是固定的,不会根据数据库引擎的负荷来动态的获取或者释放。显然对于生成用的服务器来说,这并不是一个很好的配置。但是在一些特殊的应用下,却可以起到比较不错的效果。如需要测试数据库某个作业与内存之间的关系,那么就有可能需要把它们的值配置为相同。另外如果服务器中只运行了数据库应用程序,那就有可能需要把这两个参数设置的比较高,以减少数据库内存释放与获取时所发生的额外开销等等。
另外数据库运行过程中的某些作业是不受这个最大内存的限制的。如数据库中的进程可能会得到超过最大内存选项所指定的内存;数据库的一些外部组建也可以得到缓冲池以外的内存。不过在大部分情况下,数据库运行还是受到这个缓冲池内存的限制的。所以说在内存参数设置的时候,最好能够留有一定的余地。
=====================================================
Windows2003 企业版 + Sql Server2005手工调整数据库服务器内存
总以为Windows2003 能够合理的使用多余的内存,能够智能化处理内存,事实非然。我有一台数据库服务器,32位,操作系统是Windows2003企业版,4G内存,320G存储空间,