业务场景:因设备端测试程序是供应商写的程序,但有个低级的问题就是每次执行完SQL后会话不进行关闭,导致SQL服务端会话进程高达30000个,这也进一步的使SQL SERVER服务器性能大大降低并有可能宕机。
解决方案:因没有供应商Labview源代码,无法修改程序。只能退而求其次,从SQL SERVER服务器端找到解决此问题的方法。即本文主题->SQL SERVER数据库创建定时清除状态的Sleeping的会话job。
具体方法如下:
1、进入Microsoft SQL Server Management Studio界面即SSMS
2、找到SQL Server代理选项
3、找到作业新增作业
4、自定义作业名称
5、在步骤中添加新建一个作业步骤
6、添加T-SQL命令,点确定
declare @deleteSleepSession nvarchar(100) --申明一个变量
declare tablelist cursor local --申明一个本地游标
for
select 'kill '+rtrim(spid)
from master.dbo.sysprocesses --数据库系统进程表
where status='sleeping' --状态为休眠状态
and spid>=50 --因spid<=50的为SQL Server本身的系统进程
and last_batch< DATEADD(MINUTE,-10,GETDATE()) --最后批处理时间大于当前时间10分钟
and login_time< DATEADD(MINUTE,-10,GETDATE()) --提交时间大于当前时间10分钟
open tablelist
fetch tablelist into @deleteSleepSession --执行查询,返回结果集插入至游标中
while @@fetch_status=0
-- 0 FETCH 语句成功
-- -1 FETCH 语句失败或此行不在结果集中
-- -2 被提取的行不存在
begin
exec(@deleteSleepSession) --执行变量
fetch tablelist into @deleteSleepSession
end
close tablelist --关闭游标
deallocate tablelist --删除游标引用
7.新建作业计划-频率与每天频率及开启时间自定义,注:频率与每天频率是同时生效的。
8.最后点确认就关闭,等待测试执行效果即可。