SQL调优日记--sleeping进程导致的性能问题

原创 2017年07月18日 10:41:49
背景

在数据库出现的大量的问题中,阻塞占据在很大的比例。而所有的阻塞中,sleeping进程造成阻塞是非常严重但是,能够完全搞明白的人,并不多。我的很多客户对于sleeping 的由来,和他可能导致的问题都知之甚少。今天我就分享下关于sleeping进程

什么是sleeping

其实我们经常可以在数据库中看到“”sleeping“状态的连接,但是这个sleeping 的状态是怎么来的,如果有很多sleeping状态的连接对数据库有什么影响吗?sleeping 代表建立了数据库连接,但是,程序段没有发出SQL命令. 因为很多应用程序为了减少打开和关闭连接的开销,在完成数据库中的操作后,仍然保持数据库的连接。这些连接最主要的目的是重用。举例:如果一个应用程序使用数据库连接提取数据,如果已经存在一个连接可以重用,那么建立连接的消耗当然能够最小化。那么,维护大量的sleeping连接会是一种开销吗?虽然,它相对来说是比较低的,但的确也是有开销的。如果代码编写的合适,我们不应该看到大量的sleeping连接。

举个栗子
新建一个控制台应用程序,先加入下面的代码
1.建立连接并打开
SqlConnection sqlConnection = new SqlConnection("Server=(local);Database=Mydb;UId=test;Pwd=password;");
sqlConnection.Open();
查看数据库会看到,此时就会出现SLEEPING状态。这就是建立了连接但是没有发出任何SQL命令



2.SQL执行语句完成
我们执行下面的代码 。在执行的过程中可能有(running,suspened,runnale状态)等他执行完。查看数据库中的状态变为sleeping.
SqlCommand sqlCommand = new SqlCommand("select name from dbo.Student", sqlConnection);
sqlCommand.ExecuteScalar();




问题

到目前为止,sleepig是怎么来的应该很清楚了,,但他可能到导致的问题是什么呢。具体看下面案例,
会话77就是sleeping操作,他阻塞了会话81,81又阻塞了75. 看看等待时间,,有点不忍直视了,数学好的同学可以数一下。

这个问题怎么产生的呢? 其实就是在运行 sqlCommand.ExecuteScalar(); 的时候开启了事务,但是这个语句由于超时或者查询被取消了,会话变成了sleeping状态。但是事务在数据库中中还是开启的状态。


解决

通过查看上面图中的工具,查看77 执行的语句,定位对应到程序中的代码段,然后进行下面的改善措施:
1.在代码中加入try catch的异常处理,在处理的的代码中加入 :IF @@TRANCOUNT > 0 ROLLBACK TRAN
2.找到对应的执行的SQL,找出他执行超时的原因加以解决。
3.使用 SET XACT_ABORT ON; 他表示 如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
版权声明:本文为博主原创文章,未经博主允许不得转载。

SQL Server KILL Sleeping进程

DECLARE @SPID AS INT DECLARE @COUNT AS INT=0 DECLARE curSPID CURSOR FOR SELECT A.SPID --,DB_NAME(A....
  • Burgess_Liu
  • Burgess_Liu
  • 2016年12月13日 15:50
  • 1083

查看数据库死锁的进程及清除sleeping进程(Kill__Sleeping_Processes)

例28.49  查看数据库死锁的进程(proc_who_lock) 用proc_ find _lock过程查看数据库死锁的进程。 if exists (SELECT *            ...
  • xushichang
  • xushichang
  • 2011年08月21日 16:05
  • 6205

sql中睡眠的进程定时删除的方法

企业管理器     --管理     --SQL   Server代理     --右键作业     --新建作业     --"常规"项中输入作业名称     --"步骤...
  • heizistudio
  • heizistudio
  • 2012年11月29日 09:24
  • 1408

SQL SERVER中 性能问题

1.对查询进行优化,应尽量避免全表扫描,考虑在 where 及 order by 涉及的列上建立索引。  2.避免使用 left join 和 null 值判断。left join 比 inner j...
  • oqqKen12345
  • oqqKen12345
  • 2017年09月09日 09:15
  • 82

jboss性能调优

编辑server/slim/jbossweb-tomcat55.sar/server.xml; * 检查server.xml文档中使用的连接器,例如:http连接器:            ...
  • gzh0222
  • gzh0222
  • 2011年09月20日 09:36
  • 3262

Linux性能及调优指南(翻译)之Linux进程管理

本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap...
  • ljianhui
  • ljianhui
  • 2015年07月02日 01:55
  • 5313

redis-cluster 性能调优

redis-cluster #关闭RDB 防止fork进程的内存溢出问题 save "" appendonly=yes #防止某个节点挂掉,整个cluster挂掉的问题 cluster-r...
  • qiushi888
  • qiushi888
  • 2017年06月09日 15:10
  • 791

提高存储性能的十大方案

优化存储容量还是优化存储性能?假设只能二选一的话,大多数存储管理员也许会选择前者。说到性能问题,我们随手就可以找到大量的关于优化存储性能的秘籍,但这些技巧或方法并不总是那么有效,还要看现实的应用环境。...
  • yazhiye
  • yazhiye
  • 2014年09月17日 10:33
  • 2031

oracle 性能调优之数据库中的常见性能问题

oracle 性能调优之数据库中的常见性能问题 转自:http://blog.csdn.net/huzia/article/details/8807383     在Oracle数据库中找...
  • yongjiao124
  • yongjiao124
  • 2016年04月05日 19:36
  • 2459

Spark性能优化:开发调优篇

前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作...
  • u012102306
  • u012102306
  • 2016年05月05日 13:36
  • 18711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL调优日记--sleeping进程导致的性能问题
举报原因:
原因补充:

(最多只允许输入30个字)