1.为了防止服务器因为sqlserver内存溢出造成卡顿或死机的情况,需设置数据库的内存限制大小,20G
2.程序找导出数据流的时候报错,这个时候就要对sqlserver做对应的处理了:
c#:System.OutOfMemoryException: 内存不足。
3.对sqlserver的内存资源进行释放
--use master
--go
--强制释放内存
alter procedure [dbo].ClearMemory
as
begin
--清除所有缓存
DBCC DROPCLEANBUFFERS
--打开高级配置
exec sp_configure 'show advanced options', 1
--设置最大内存值,清除现有缓存空间 ,10Gb
exec sp_configure 'max server memory', 10000
EXEC ('RECONFIGURE')
--设置等待时间
WAITFOR DELAY '00:00:05'
--重新设置最大内存值 ,20Gb
EXEC sp_configure 'max server memory', 20000
EXEC ('RECONFIGURE')
--关闭高级配置
exec sp_configure 'show advanced options',0
END
--执行存储过程
EXEC ClearMemory
--其他参数参考
--清除存储过程缓存
DBCC FREEPROCCACHE
--清除会话缓存
DBCC FREESESSIONCACHE
--清除系统缓存
DBCC FREESYSTEMCACHE('All')
--清除所有缓存
DBCC DROPCLEANBUFFERS
-- 查看最小最大内存
select configuration_id,name 名称,minimum 配置最小值,maximum 配置最大值,
is_dynamic 是否动态值,is_advanced 是否优先权,value_in_use 运行值,
description 描述
from sys.configurations
--查询内存使用情况,1000000kb=1Gb
select * from sys.dm_os_performance_counters
where counter_name IN('Target Server Memory (KB)','Total Server Memory (KB)')
-- 内存状态
DBCC MemoryStatus
操作:
①.可以看到,设置的最小内存为10G,最大为20G,在跑程序的同时,同时观察服务器内存持续爬升中sqlserver所占内存的大小,占到12G左右了就执行ClearMemory存储过程来清除sqlserver中所占用的内存资源;
②.在程序导出数据是,内存占用10G以上,执行存储过程进行sqlserver的内存空间缓存数据的释放(这个释放过程:清空内存中所存在的数据缓存,将新的数据继续填充内存位置中,不会开辟新的内存空间来存放新的数据,新的数据会填充到已经释放数据的内存地点)
③.建议配合代码用,在做节流导出的时候去执行,每次循环节流导出时执行ClearMemory就可释放双手了(记得先创建这个存储过程)
方法体代码参考:
/// <summary>
/// 执行存储过程强制清除sqlserver缓存
/// </summary>
public static void SqlClear()
{
string connectionStrClear = ConfigurationManager.ConnectionStrings["master2016"].ConnectionString;
using (SqlConnection conn =new SqlConnection(connectionStrClear))
{
try
{
SqlCommand cmd = new SqlCommand("ClearMemory", conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
cmd.ExecuteNonQuery(); // 无返回值
conn.Close();
logger.Info("执行存储过程ClearMemory成功");
}
catch (Exception ex)
{
logger.Info(ex.Message);
}
}
}