SQL Server进程占用内存的一点认识

        最近在做数据处理的东东,唉,总是遇到系统的内存溢出的情况,实在是受不了了,本身机器的内存也只有768M。开的东西也多,又要处理海量的数据,能不溢出才怪呢?

        没办法啊,想看看SQL Server 的占用内存到底是怎么一回事,便翻了大量的资料。变做起了测试:

1、当开启Sql Server 进程时,内存:
2、执行一些操作:


看着sqlserver.exe进程始终都不把内存释放掉,心里面难过啊:(

天啊,sql server 执行后内存是不是放的,具体原因是:

在你启动 SQL Server 之后,SQL Server 内存使用量将会持续稳定上升,即使当服务器上活动很少时也不会下降。另外,任务管理器和性能监视器将显示计算机上可用的物理内存稳定下降,直到可用内存降到 4 至 10 MB 为止。仅仅出现这种状态并不表示内存泄漏。此状态是正常的,并且是 SQL Server 缓冲池的预期状态。默认情况下,SQL Server 根据操作系统报告的物理内存加载来动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止分页(在 4 至 10 MB 之间),SQL Server 缓冲池就会继续增大。像在与 SQL Server 分配内存位于相同计算机上的其他进程一样,SQL Server 缓冲区管理器将在需要的时候释放内存。SQL Server 每秒可以释放和获取几兆字节的内存,从而使它可以快速适应内存分配更改。

最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉。所以一般我们在看statistics io的时候,看到的physics read都是0。 其次就是查询的开销,一般地说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销的。所以用于关联和排序的列上一般需要有索引。再其次就是对执行计划、系统数据的存储,这些都是比较小的。

2、就是说:服务器不是很好的,也就是内存不够大的计算机在运行程序时,隔一段时间就需要重启一下SQL服务。这个还真有点烦。
3、于是乎,我又开始寻找解决的办法。终于有了个不错的办法。

第一步,打开记事本,输入下列2行命令:
net stop mssqlserver
net start mssqlserver
将其存为一个.bat的文件。

第二步,在Windows的“任务计划”功能里,添加一条新的任务计划,让系统在每天的03:00执行一次这个.bat 这个批处理文件即可。

4、又是一个比较弱智的问题,大家看了不要 骂我啊!呵呵。。。。
posted @ 2008-10-24 16:20  stonespawn  阅读(1676)  评论(3编辑  收藏  举报