如何解决SQLServer占内存过多的问题

我听说SQL Server内存已满。
我来说说我遇到的事情吧。

当时我们内部的服务器是一台R7 ,内存3 2 G。
结果,SQL Server 消耗了 2 8 G,并且没有其他应用程序能够运行。
真让人头疼啊!
必须调整内存设置。
您需要转到 SQL Server Management Studio,找到“属性”窗口,然后单击“内存”选项卡。
记得当时我们老板告诉我们最大不能超过2 5 G,给系统和其他应用留出空间。
如果不执行此步骤,您的系统将显示蓝屏。

查询优化非常重要。
我记得有一个傻小子,从一张大表中做了一个查询SELECT FROM WHERE field = 'value',结果一执行,内存就到了极限。
我告诉他,他需要指定他想要的列,而不是盲目使用它们。
然后我将其更改为使用大表的 WHERE 字段 = 'value' 中的 SELECT 列 1 、列 2 ,内存很快就下降了。
另外,当 JOIN 可用时,避免创建子查询。
这是非常低效的。
我有一个使用子查询的报告,需要很长时间才能运行,但内存仍然很高。
改变JOIN后,速度变快了。

索引这个东西也是一个陷阱。
太少会减慢查询速度;太多会减慢写入速度。
我记得那位老人给每个表都加了全索引。
结果每次更新数据时内存和CPU就开始震动。
然后我分析了执行计划,需要添加的添加,需要删除的删除,服务器立刻就顺利运行了。
因此,索引是根据情况而定的,不能随意添加。

定期维护也很重要。
我曾经管理过一个小型图书馆,那里的数据每天都在增长,而且维护得不好。
结果,内存变得越来越紧张。
然后我得到了 SQL Server Agent,并设置了一个任务来重建索引、更新统计信息、每晚清理旧数据。
这样做会让你的记忆更加稳定。

总之,SQL Server内存很大,应该从这几点入手。
调整内存、优化查询、管理索引并执行定期维护。
一旦完成,系统性能将非常出色。

sql server内存暴涨如何解决

等等前两天调试数据库的时候也出现过类似的情况。
那天早上,办公室的电脑突然像老式翻页机一样死机了。
经过检查,SQL Server的内存增加到1 2 G,发现机器上只剩下1 G了。
当时服务器内存是1 6 G。
系统其他服务没有压力,但是数据库内存已满。

打开SSMS,看到缓冲池使用了9 G,执行计划缓存有2 G或3 G长。
将最大内存从默认的1 00%改为1 0G;我把最小内存设置为0,监控了半个小时。
发现缓冲池自动减少到7 G左右,并且等待内存队列被清空。
这让我想起上周的测试,最大内存设置为8 G,但缓冲池增加到9 G。
当时我以为系统是自动调整的,但现在我想……
但是还有一件奇怪的事情。
调整内存后发现查询突然变慢,导致内存飙升。
该查询正在更新没有索引的表 A,结果是全表扫描。
但奇怪的是,当内存为6 G时,这个查询非常快,但是当内存为8 G时,突然变慢了。
一辆赛车就像加满油一样,但有时半箱油运行不顺畅。
wait 因为缓冲池太大,内存碎片更严重?
现在我想;应结合 CPU 使用情况来查看。
我查了一下,内存增加时CPU只增加了2 0%左右。
它根本不存在CPU 瓶颈。
但今天我突然想到,如果CPU高的话,我觉得内存限制太紧了。
例如,当内存紧张时; SQL Server 无法将计算任务委托给CPU。
我必须再试一次。

如何解决SQLServer占内存过多的问题

重新启动 IIS 没有效果。

首先重新启动SQL Server服务。
例如,对于SQL Server 2 01 6 ,在“服务管理器”中找到“SQL Server(MSSQLSERVER)”,右键单击它,然后重新启动它。
等几分钟。

查看内存使用情况。
如果仍然没有失败,请重新启动 SQL Server 代理服务。
另外,在服务管理器中查找SQL Server代理(MSSQLSERVER代理)并右键单击以重新启动它。

最后,查看任务管理器。
内存应该减少。

如何解决SQLServer占内存过多的问题?

说白了,解决SQL Server占用内存过多问题的核心方法有3 个:内存控制、查询缓存、智能索引、定期维护。

先说最重要的内存控制。
SQL Server依靠内存缓存数据来提高速度,但在我们去年跑的一个项目中,服务器3 2 G的内存居然占用了2 8 G,导致系统在PPT中挂起——术语叫雪崩效应。
事实上,前线的一个小小的延误导致一切都落后了。
正确的解决办法是调整最大服务器内存设置,比如在SSMS中设置限制为2 5 G,以预留系统资源。
但请注意,如果您的应用程序使用大量内存,例如大数据分析,则此技巧可能需要多次测试。

还有一点就是保存题目。
去年我们接手了一个旧系统,查询报表耗时2 秒,峰值内存达到8 G。
然后我们注意到有些问题并切换到显式 JOIN 和 WHERE 子句。
时间减少到0.1 s,最大内存直接减少到1 G。
别傻了,用“”全选。
运行 3 000 级的桌子是一场噩梦;使用JOIN而不是子查询,比如INNER JOIN而不是在WHERE中嵌套IN,这样可以节省大量内存。

还有另一个重要的细节。
索引是内存优化的法宝,但使用过多也会造成陷阱——去年我们调整了电子商务系统,添加了 2 00 个索引。
结果是命令写入速度慢了 5 0%,并且内存占用实际上更高。
所以你必须考虑执行计划。
例如,如果一个查询运行时间为 5 毫秒,但占用了 1 G 内存,则可能存在索引缺失。

一开始我以为把内存调到最大就可以了,后来发现不对。
系统中的其他进程也需要消耗内存。
等等,还有一件事,如果您的 SQL Server 在虚拟机上运行,​​请不要忘记服务器的内存也是有限的。

应该进行更多的压力测试来查看内存曲线的表现。