在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后。就需要检查数据库是否有出现阻塞

当时数据库的生产环境中主表数据量超过2000w,子表数据量超过1亿,且更新和新增频繁。再加上做了同步镜像,很消耗资源。

这时就要新建一个会话,大概需要了解以下几点:

1.当前活动会话量有多少?

2.会话运行时间?

3.会话之间有没有阻塞?

4.阻塞时间 ?

查询阻塞的方法有很多。有sql 2000 的sp_lock, 有sql 2005及以上的dmv

一. 阻塞查询 sp_lock

执行 exec sp_lock  下面列下关键字段

spid 是指进程ID,这个过滤掉了系统进程,只展示了用户进程spid>50。

dbid 指当前实例下的哪个数据库 , 使用DB_NAME() 函数来标识数据库

type 请求锁住的模式

mode 锁的请求状态

GRANT:已获取锁。

CNVRT:锁正在从另一种模式进行转换,但是转换被另一个持有锁(模式相冲突)的进程阻塞。
                     WAIT:锁被另一个持有锁(模式相冲突)的进程阻塞。

总结:当mode 不为GRANT状态时, 需要了解当前锁的模式,以及通过进程ID查找当前sql 语句

例如当前进程ID是416,且mode状态为WAIT 时,查看方式 DBCC INPUTBUFFER(416)

用sp_lock查询显示的信息量很少,也很难看出谁被谁阻塞。所以当数据库版本为2005及以上时不建议使用。

 二.阻塞查询  dm_tran_locks      

 SELECT
t1.resource_type,
t1.resource_database_id,
t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.blocking_session_id
FROM sys.dm_tran_locks as t1
INNER JOIN sys.dm_os_waiting_tasks as t2
ON t1.lock_owner_address = t2.resource_address;

上面查询只显示有阻塞的会话, 关注blocking_session_id 也就是被阻塞的会话ID,同样使用DBCC INPUTBUFFER来查询sql语句

三.阻塞查询 sys.sysprocesses

 SELECT
spid,
kpid,
blocked,
waittime AS 'waitms',
lastwaittype,
DB_NAME(dbid)AS DB,
waitresource,
open_tran,
hostname,[program_name],
hostprocess,loginame,
[status]
FROM sys.sysprocesses WITH(NOLOCK)
WHERE kpid>0 AND [status]<>'sleeping' AND spid>50
AND spid<>@@SPID

sys.sysprocesses  能显示会话进程有多少, 等待时间, open_tran有多少事务, 阻塞会话是多少. 整体内容更为详细。
  关键字段说明:

spid 会话ID(进程ID),SQL内部对一个连接的编号,一般来讲小于50

  kipid 线程ID
  blocked: 阻塞的进程ID, 值大于0表示阻塞, 值为本身进程ID表示io操作
  waittime:当前等待时间(以毫秒为单位)。
  open_tran: 进程的打开事务数
  hostname:建立连接的客户端工作站的名称
  program_name 应用程序的名称。
  hostprocess 工作站进程 ID 号。
  loginame 登录名。
  [status]
    running = 会话正在运行一个或多个批
    background = 会话正在运行一个后台任务,例如死锁检测
    rollback = 会话具有正在处理的事务回滚
    pending = 会话正在等待工作线程变为可用
    runnable = 会话中的任务在等待,由scheduler来运行的可执行队列中。(重要)
    spinloop = 会话中的任务正在等待调节锁变为可用。
    suspended = 会话正在等待事件(如 I/O)完成。(重要)
    sleeping = 连接空闲

wait resource 格式为 fileid:pagenumber:rid 如(5:1:8235440)

kpid=0, waittime=0 空闲连接

kpid>0, waittime=0 运行状态
              kpid>0, waittime>0 需要等待某个资源,才能继续执行,一般会是suspended(等待io)
              kpid=0, waittime=0 但它还是阻塞的源头,查看open_tran>0 事务没有及时提交。

如果blocked>0,但waittime时间很短,说明阻塞时间不长,不严重
              如果status 上有好几个runnable状态任务,需要认真对待。 cpu负荷过重没有及时处理用户的并发请求

sql server 阻塞查询的更多相关文章

  1. SQL Server 阻塞分析

    一.加锁(locking).阻塞(blocking).死锁(deadlock)定义        加锁:用于管理多个连接的进程.当连接需要访问一块数据时,在这些数据上放置某种类型的锁.      阻塞 ...

  2. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...

  3. 需要我们了解的SQL Server阻塞原因与解决方法

    需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...

  4. sql server 阻塞与锁

    SQL Server阻塞与锁 在讨论阻塞与加锁之前,需要先理解一些核心概念:并发性.事务.隔离级别.阻塞锁及死锁. 并发性是指多个进程在相同时间访问或者更改共享数据的能力.一般情况而言,一个系统在互不 ...

  5. SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...

  6. Sql Server中查询今天、昨天、本周、上周、本月、上月数据

    Sql Server中查询今天.昨天.本周.上周.本月.上月数据 在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及 ...

  7. Sql Server参数化查询之where in和like实现详解

    where in 的参数化查询实现 首先说一下我们常用的办法,直接拼SQL实现,一般情况下都能满足需要 string userIds = "1,2,3,4"; using (Sql ...

  8. 【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参

    转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/29/2475427.html 在上一篇Sql Server参数化查询之where in和li ...

  9. 【转】Sql Server参数化查询之where in和like实现详解

    转载至:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARINDE ...

随机推荐

  1. 数据结构---队列C语言实现

    #include <stdio.h> #include <stdlib.h> //队列大小 #define SIZE 1024 static int queue[SIZE] = ...

  2. Android的Binder的起源-android学习之旅(100)

    George Hoffman任职1991年Be公司的工程师,他启动了一个"openBinder"的项目,该项目的宗旨是研究一个高效的信号传递工具,允许多个软件相互合作,构成一个软件 ...

  3. bash配置文件说明

    login shell: /etc/profile 所有用户全局设定,它首先会调用以下文件:     /etc/inputrc     /etc/profile.d/*.sh     /etc/sys ...

  4. HTML5的canvas标签制作黑客帝国里的简单画面

    1.加入canvas标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> ...

  5. java设计原则---开闭原则

    开闭原则:指的是一个软件实体应对对扩展开发,对修改关闭(Software entities should be open for extension, but closed for modificat ...

  6. Memcache 运行情况

    Memcache Memcache是danga.com的一个开源项目,它是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的Hash表,能够用来存储各种格式的数据. 查看当前的me ...

  7. 最全的 Swift 4 新特性解析

    转自: http://www.jianshu.com/p/f35514ae9c1a WWDC 2017 带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特 ...

  8. 【js-xlsx和file-saver插件】前端html的table导出数据到excel的表格合并显示boder

    最近在做项目,需要从页面的表格中导出excel,一般导出excel有两种方法:一.习惯上是建模版从后台服务程序中导出:二.根据页面table中导出:综合考虑其中利弊选择二.根据页面table中导出ex ...

  9. Apriori算法思想和其python实现

    第十一章 使用Apriori算法进行关联分析 一.导语 "啤酒和尿布"问题属于经典的关联分析.在零售业,医药业等我们经常需要是要关联分析.我们之所以要使用关联分析,其目的是为了从大 ...

  10. 分享一下 常用的转换方法(例如:数字转金钱,文本与html互转等)

    public sealed class SAFCFormater { /// <summary> /// 文本格式到HTML /// </summary> /// <pa ...