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 @   stonespawn  阅读(1683)  评论(3编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示