SQL Server数据库占用服务器内存过高清理一些的说明
[重要通告]如您遇疑难杂症,本站支持知识付费业务,扫右边二维码加博主微信,可节省您宝贵时间哦!
这文章搁浅有些时间了,前段时间有一位做web站点的朋友告诉我,他服务器最近SQL Server数据库天天爆满,也是醉了,问有啥好的解决办法
其实出现这样的问题有很多,具体也说不出到底会是哪里问题,就只能一点点的排查方可;占用内存大无非如下几种方式
SQL Server数据库由于缓存较多内容,运行一段时间后sql server占用内存过大且占用内存比例高出太多,一旦sql server占用内存比例超过90%甚至95%-100%时严重影响网站正常的访问。
在 SQL Server 数据库管理中,内存占用过高是一个常见且影响性能的关键问题。当 SQL Server 消耗过多内存时,不仅会导致服务器响应迟缓,还可能引发其他进程资源不足,进而影响整个系统的稳定性。
低效查询导致大量数据缓存
复杂且未优化的查询语句往往会产生庞大的结果集。SQL Server 为了提高后续查询的速度,会将这些结果集缓存到内存中。例如,一个涉及多表连接且未使用合适索引的查询,可能会检索出大量不必要的数据,这些数据长时间占据内存空间,导致内存占用居高不下。
内存配置不合理
默认情况下,SQL Server 会根据服务器的可用内存动态分配自身的内存使用量。但如果数据库管理员没有根据实际业务需求对内存进行合理配置,就可能出现内存分配过度的情况。比如,在一台同时运行多个应用程序的服务器上,SQL Server 若没有设置合适的最大内存限制,可能会抢占过多内存,致使其他应用程序运行受阻。
索引碎片化严重
随着数据的频繁插入、更新和删除,索引页会逐渐碎片化。碎片化的索引会降低查询性能,使得 SQL Server 需要读取更多的索引页来满足查询需求,这无疑增加了内存的使用量。例如,一个高度碎片化的聚集索引,在执行查询时可能会导致大量的随机 I/O 操作,为了缓存这些额外读取的数据页,内存占用会显著上升。
数据库对象缓存过多
SQL Server 会缓存各种数据库对象,如表、视图、存储过程等的元数据和执行计划。当数据库中存在大量不常用或长时间未更新的对象时,这些对象的缓存会持续占用内存。例如,一些已经废弃但未及时清理的存储过程,其执行计划可能仍在内存中缓存,造成内存资源的浪费。
根据以上操作,无非就要一个一个的去尝试去解决,但过程也很漫长,先来一个直接的~~
一、设置SQL Server数据库内存回收
1、打开Microsoft SQL Server Management Studio 管理SQL Server数据库,并右键点击属性,打开服务器属性设置;
2、打开服务器属性,找到内存并点击进入,在服务器属性内存设置内,设置服务器内存;
最小服务器内存:默认为0即可;最大服务器内存:根据服务器本身内存计算出80%(1GB=1024)。
3、设置保存完成,重启服务器即可生效;
说明:也可设置“使用AWE分配内存”选项,一般用不到,设置完一定要重启服务器方可!
二、限制Reporting Services最大内存
RSReportServer.config配置文件在可以限制Reporting Services最大内存
C:\Program Files\Microsoft SQL Server\MSRS13.MSSQLSERVER\Reporting Services\ReportServer\rsreportserver.config 文件
三、DBCC管理命令来清理这些缓存:
DBCC FREEPROCCACHE 清除存储过程相关的缓存
DBCC FREESESSIONCACHE 会话缓存
DBCC FREESYSTEMCACHE('All') 系统缓存
DBCC DROPCLEANBUFFERS 所有缓存
四、升级你说SQL Server Service Pack 补丁
假设从Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 升级到Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) 版本进行观察
五、SQL Server服务分离
是Window本身的服务,有些小服务他放在一个进程号里面,不太好判断是什么服务引起的内存增长,分离开之后,能够监测,最终禁用。
C:\Users\Administrator>sc config seclogon type= own [SC] ChangeServiceConfig 成功 C:\Users\Administrator>sc config SENS type= own [SC] ChangeServiceConfig 成功 C:\Users\Administrator>sc config SessionEnv type= own [SC] ChangeServiceConfig 成功 C:\Users\Administrator>sc config ShellHWDetection type= own [SC] ChangeServiceConfig 成功 C:\Users\Administrator>sc config Themes type= own [SC] ChangeServiceConfig 成功 C:\Users\Administrator>sc config UserManager type= own [SC] ChangeServiceConfig 成功 C:\Users\Administrator>sc config Winmgmt type= own [SC] ChangeServiceConfig 成功
六、电源计划问题
平衡模式下,cpu降频了;改成性能模式速度就上来了
七、SQL Server 数据更新
--更新统计信息 DECLARE @SqlStr NVARCHAR(max) SET @SqlStr='' SELECT @SqlStr=@SqlStr+ + 'UPDATE STATISTICS '+name+ CHAR(10) FROM sysobjects WHERE xtype='U' AND (name NOT LIKE 'TMP%') ORDER BY name EXEC (@SqlStr)
八、自动强制释放内存的SQL脚本
---自动强制释放内存的SqlScript脚本
DECLARE @TargetMemory decimal(19,2),@TotalMemory decimal(19,2),@UseMemoryPecent decimal(19,2)
SELECT @TargetMemory=cntr_value FROM sys.dm_os_performance_counters
WHERE counter_name='Target Server Memory (KB)'
SELECT @TotalMemory=cntr_value FROM sys.dm_os_performance_counters
WHERE counter_name='Total Server Memory (KB)'
SET @UseMemoryPecent=@TotalMemory/@TargetMemory
SELECT @UseMemoryPecent
IF @UseMemoryPecent>0.1
BEGIN
--清除存储过程缓存
DBCC FREEPROCCACHE
--清除会话缓存
DBCC FREESESSIONCACHE
--清除系统缓存
DBCC FREESYSTEMCACHE('All')
--清除所有缓存
DBCC DROPCLEANBUFFERS
--打开高级配置
EXEC sp_configure 'show advanced options', 1
--设置最大内存值,清除现有缓存空间 1000 M (根据实际情况设置,具体思路是最大值先调小,然后再设回合适的值。)
EXEC sp_configure 'max server memory', 1000
EXEC ('RECONFIGURE')
--设置等待时间,强制释放内存需等待一些时间
WAITFOR DELAY '00:01:30'
--重新设置最大内存值 3000 M 根据实际情况设置,具体思路是最大值先调小,然后再设回合适的值。)
EXEC sp_configure 'max server memory', 3000
EXEC ('RECONFIGURE')
--关闭高级配置
EXEC sp_configure 'show advanced options', 0
END
九、想起来再整理吧~~~~~~
问题未解决?付费解决问题加Q或微信 2589053300 (即Q号又微信号)右上方扫一扫可加博主微信
所写所说,是心之所感,思之所悟,行之所得;文当无敷衍,落笔求简洁。 以所舍,求所获;有所依,方所成!
支付宝赞助
微信赞助



