sql server占内存过多问题的解决方法
本文导语: 有时会遇到这样的情况: sql server占用了太多的内存,而且还不断的增长; 或者是这样的一种情况,虽然已经设置了使用内存,可是它没有用到那么多,原因何在? 首先,来看下sql server是怎样使用内存的。 最大的开销一般是...
有时会遇到这样的情况:
sql server占用了太多的内存,而且还不断的增长;
或者是这样的一种情况,虽然已经设置了使用内存,可是它没有用到那么多,原因何在?
首先,来看下sql server是怎样使用内存的。
最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得会用到的数据统统扔到内存中,直到内存不足时,才会把命中率低的数据给清掉。
因此,当我们在看statistics io时,看到的physics read都是0。
其次,便是查询的开销。
一般来说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销的。
所以用于关联和排序的列上一般需要有索引。
再者,就是对执行计划、系统数据的存储,这些都是比较小的。
先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内存,数据缓存一般是越多越好,甚至有时会强行把一些数据pin在高速缓存中。
但是,如果有其它应用程序,虽然在需要时MSSQL会释放内存,但是线程切换、IO等待这些工作也是需要时间的,所以就会造成性能的降低。
这样,就必须设置MSSQL的最大内存使用。
可以在SQL Server 属性(内存选项卡)中找到配置最大使用内存的地方,也可以使用sp_configure来完成。
如果没有其它应用程序,那么就不要限制MSSQL对内存的使用。
然后,来看查询的开销,这个开销显然是越低越好,因为不能从中得到好处,相反,使用了越多的内存多半意味着查询速度的降低。
因此,一般要避免中间表和游标的使用,在经常作关联和排序的列上建立索引。
读到这里,你是不是已经清楚很多了,对于sql server内存占用过多的原因有了更多的认识,那么就在平时多加注意吧。
合理分配与使用sql server的内存,避免过多占用,造成性能上的不足。