sql server查询语句阻塞优化性能

在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按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查询语句阻塞优化性能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQL Server内存机制详解

    1.前言 对于数据库引擎来说,内存是一个性能提升的重要解决手段.把数据缓存起来,可以避免在查询或更新数据时花费多余的时间,而这时间通常是从磁盘获取数据时用来等待磁盘寻址的.把执行计划缓存起来,可以避免重复分析执行计划时带来额外的CPU及各种资源的开销.通过在内存中开辟查询内存空间,可以迅速地完成排序.哈希等计算,达到快速返回运算结果的目的.若没有足够的内存空间,数据库引擎将无法快速地响应用户的请求. 2.SQL Server如何从操作系统层面分配内存 SQL Server存储引擎本身是一个Win

  • SQL Server表空间碎片化回收的实现

    目录 1 锁片化的产生 1.1 产生碎片化的原因 1.2 碎片化的影响 1.3 定位碎片化 2 碎片化处理 2.1 删除并重建聚集索引 2.2 DROP_EXISTING 2.3 DBCC DBREINDEX 2.4 DBCC INDEXDEFRAG 3 空间回收 参考链接: 1 锁片化的产生 1.1 产生碎片化的原因 1.在B-tree索引中,表数据按照聚集索引的排序进行物理存储,若聚集索引离散化比较严重,那么可能会出现较为严重的碎片化问题: 2.随着业务的DML操作,会伴随着数据页分裂的情况

  • SQLServer RANK() 排名函数的使用

    本文主要介绍了SQLServer RANK() 排名函数的使用,具体如下: -- 例子表数据 SELECT * FROM test; -- 统计分数 SELECT name,SUM(achievement) achievement FROM test GROUP BY name; -- 按统计分数做排行 SELECT RANK() OVER( ORDER BY SUM(achievement) desc) 排行,name,SUM(achievement) achievement FROM tes

  • SQL Server数据库基本概念、组成、常用对象与约束

    目录 二.基本概念 1.数据库 2.数据库管理系统 3.数据库系统 二.数据库的组成 1.文件 2.文件组 三.数据库常用对象 1.表 2.字段 3.视图 4.索引 5.存储过程 6.触发器 7.约束 8.缺省值 四.数据库约束 一.定义 二.分类 1.主键约束 2.外键约束 3.Unique约束 4.Check约束 5.Default约束 二.基本概念 1.数据库 数据库(DB):即DataBase的缩写,是按照一定的数据结构来组织.存储和管理数据的一个仓库.是存储在一起的相关数据的一个集合.

  • sql server排查死锁优化性能

    一.概述 记得以前客户在使用软件时,有偶发出现死锁问题,因为发生的时间不确定,不好做问题的重现,当时解决问题有点棘手了.现总结下查看死锁的常用二种方式. 1.1 第一种是图形化监听: sqlserver -->工具--> sql server profiler 登录后在跟踪属性中选择如下图: 监听到的死锁图形如下图 这里的描述大致是:有二个进程 一个进程ID是96, 另一个ID是348. 系统自动kill 掉了进程ID:96,保留了进程ID:348 的事务Commit. 上面死锁是由于批量更新

  • SqlServer数据库备份与还原的实现步骤

    目录 问题描述 SqlServer数据库备份步骤 SqlServer数据库还原步骤 其它 问题描述   最近需要给程序新增功能,用于将旧格式的数据转换为新格式,同时删除旧格式的数据(新旧格式的数据库表有部分重叠,同一份数据无法同时存在新旧格式的数据),由于测试环境中的测试数据不多,功能调试几次之后就没有旧格式的数据做测试了,因此想到在功能调试前先将测试数据库备份,然后功能调试之后再将测试数据库还原,这样就可以重复的进行功能调试.   数据库备份过程比较顺利,但是还原过程中出现错误,无论是还原数据

  • SQL SERVER使用表分区优化性能

    目录 1.简介 2.表分区 2.1分区范围 2.2分区键 2.3索引分区 3.创建表分区 3.1创建文件组 3.2指定文件组存放路径 3.3创建分区函数 3.4创建分区方案 3.5创建分区表 3.6创建分区索引 4.表分区的优缺点 1.简介 当一个表数据量很大时候,很自然我们就会想到将表拆分成很多小表,在执行查询时候就到各个小表去查,最后汇总数据集返回给调用者加快查询速度.比如电商平台订单表,库存表,由于长年累月读写较多,积累数据都是异常庞大的,这时候,我们可以想到表分区这个做法,降低运维和维护

  • SQL Server使用导出向导功能

    1.前言 有时候,我们需要把A库A1表某一部分或全部数据导出到B库B1表中,如果系统运维工程师没打通两个库链接,我们执行T-SQL是处理数据导入时会发生如下错误: 这时候SQL Server导出功能很好弥补这一点,而该章节重点介绍该功能. 2.操作 数据库版本:Microsoft SQL Server Management Studio 17:源头数据库:[172.168.16.xxx].[PartInChina_cn].[dbo].[PUB_Stock]目标数据库:[local].[dbo].

  • SQL Server中常用截取字符串函数介绍

    SQL Server中一共提供了三个字符串截取函数:LEFT().RIGHT().SUBSTRING(). 一.LEFT()函数 函数说明如下: 语法:LEFT(character,integer). 参数介绍:参数1:要截取的字符串,参数2:截取字符个数. 返回值:返回从字符串左边开始指定个数的字符. 示例SQL:select LEFT('SQLServer_2012',3). 返回:SQL. 二.RIGHT()函数 函数说明如下: 语法:RIGHT(character,integer). 参

  • SQL Server中函数、存储过程与触发器的用法

    一.函数 函数分为(1)系统函数,(2)自定义函数. 其中自定义函数又可以分为(1)标量值函数(返回单个值),(2)表值函数(返回查询结果) 本文主要介绍自定义函数的使用. (1)编写一个函数求该银行的金额总和 create function GetSumCardMoney() returns money as begin declare @AllMOney money select @AllMOney = (select SUM(CardMoney) from BankCard) return

  • SQL Server远程连接的设置步骤(图文)

    SQL Server正常连接时,若不需要远程操控其他电脑,可以用Windows身份验证模式,但是涉及到远程处理时,需要通过SQL Server身份验证登录.具体操作如下. 首先,我们在登录时,选择Windows身份验证,然后连接到服务器. 进入到登录主页面后,右击当前的对象资源管理器,选择属性,弹出如下图所示的页面,选择安全性,将服务器身份验证勾选为SQL Server和Windows身份验证模式,(若在安装软件时已选择第二种验证模式,可直接通过账号登录)如图2所示. 图2. 图3. 如图3所示

随机推荐