≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 数据库 > SQL Server

sqlserver中几种典型的等待

人气:689 时间:2020-05-04

这篇文章主要为大家详细介绍了sqlserver中几种典型的等待,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!

为了准备今年的双11很久没有更新blog,在最近的几次sqlserver问题的排查中,总结了sqlserver几种典型的等待类型,类似于oracle中的等待事件,如果看到这样的等待类型时候能够迅速定位问题的根源,下面通过一则案例来把这些典型的等待处理方法整理出来:

 

第一种等待.memory等待

 

早上接到一用户反馈其RDS实例非常的慢,通过观察sqlserver活动会话监视器(active monitor)的waiting tasks(类似于mysql的thread running)可以看到有10多w的等待任务,可以明确数据库现在已经出现了较大的瓶颈,紧接着通过resource waits看到数据库中有大量的memory内存等待:

【图片暂缺】

看到是memory 资源等待后,为了立刻恢复用户应用,想到立刻去调大内存,发现该实例已经是24G了,看来一下os的空余内存,还有较多的内存剩余,所以将内存调大到36G,发现resource waits还是在memory上等待,同时这个时候的cpu使用率飙升,达到了90%左右(之前在10%左右的等待).这样解决不了根本问题,于是通过recent expensive queries,发现以下sql的逻辑读很高,执行非常频繁:

SELECT * FROM RefundOrder_Message messages0_ WHERE messages0_.Order_Id=@p0;

也可以通过如下方式获得造成内存等待的sql:
SELECT st.text FROM sys.dm_exec_query_memory_grants req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as ST where req.grant_time is NULL or req.granted_memory_kb is NULL

The columns grant_time and granted_memory_kb will be NULL for those queries which are waiting to get their requested memory

sp_helpindex RefundOrder_Message
发现该表只有一个主键索引:

【图片暂缺】

创建一下索引:
create index ind_RefundOrder_Message_order_id on RefundOrder_Message(Order_Id);

【图片暂缺】

 

第二种等待:latch等待

 


在索引加上去后,memory的等待立刻消失,但是resource waits的等待变为了 lock:

【图片暂缺】

通过以下内部视图可以发现如下调用出现了等待:
SELECT ss.host_name, req.blocking_session_id,req.wait_type ,req.wait_time ,req.wait_resource ,req.transaction_id ,st.text FROM sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as ST
cross apply sys.dm_exec_sessions ss where req.status =N'suspended' and ss.session_id=req.session_id;

得到阻塞其他会话的sql:
(@p0 int,@p1 nvarchar(4000),@p2 bit)
SELECT TOP (@p0) this.* FROM ViewSalesOrder this_ WHERE this_.MemberCode = @p1 and this_.IsObsolete = @p2 ORDER BY this_.OdCode desc;

视图ViewSalesOrder是一张非常核心的视图,里面关联了订单,订单消息,订单发货等多个业务逻辑;查询条件中代入了membercode为店铺的名称,可能操作某个店铺的订单;
通过ViewSalesOrder视图中的定义,membercode,IsObsolete ,OdCode 为salesOrder表的三个字段,查看salesOrder上并没有相应的索引,于是加上如下索引:
create index ind_salesOrder_member on salesOrder(membercode,IsObsolete,code);
在添加完索引后,数据库的waiting tasks 下降,batch requests提升:

【图片暂缺】

 

第三种等待:lock

 

第三种等待是常见的等待,常见的情况在删除,更新的时候由于条件中没有合适的索引导致锁定的记录范围太大,导致阻塞其他的会话请求:

用户在在进行压测的时候发现一条更新语句执行的非常慢,导致整个系统都卡住:

【图片暂缺】

update DD_ShenHe   set ZF = 0   where zf is null;

查看dd_shenhe表上面的索引:

【图片暂缺】

可以看到表中并没有zf字段的索引,而该表总共有400w的数据,zf 为null的有8000条,所以在zf字段添加索引是合适的:

Create index ind_dd_shenhe_zf on dd_shenhe(zf);

添加完索引后,系统恢复正常。

本文来自:http://www.q1010.com/179/8613-0.html

注:关于sqlserver中几种典型的等待的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:SQL SERVER

您可能感兴趣的文章

  • SQLServer批量更新两个关联表数据的方法
  • 获取SqlServer存储过程定义的三种方法
  • sqlserver进程死锁关闭的方法
  • 诊断SQLSERVER问题常用的日志概述及使用
  • SQLserver删除某数据库中所有表实现思路
  • SQLSERVER记录登录用户的登录时间(自写脚本)
  • SQLServer主键和唯一约束的区别
  • SQLSERVER聚集索引和主键(Primary Key)的误区认识
  • SqlServer存储过程实现及拼接sql的注意点
  • SQLSERVER对索引的利用及非SARG运算符认识
上一篇:Activiti-Explorer使用sql server数据库实现方法
下一篇:SQLServer批量更新两个关联表数据的方法
热门文章
  • SQL Server SQL获取第一条记录的方法
  • SQL Server出现System.OutOfMemoryException异常的解决方法
  • SQL Server的 update from 语句的简单示例
  • SQL Server 数据库备份方法菜鸟教程
  • SQL Server 多表关联时在where语句中慎用trim()方法
  • SQL Server数据类型及长度限制详细说明
  • mybaits非配置原因,导致SqlSession was not registered for synchronization异常解析
  • SQL Server 收缩后对数据库的使用有影响吗?
  • SQL Server 格式导致的Excel导入sql出现异常的解决方法
  • SQL Server 连接服务器出现错误 7391的解决方法
  • 最新文章
    • SQL Server存储过程基本语法的简单示例
    • sql查询时增加自动编号和分页的简单示例
    • sql轻松应付百万数据的高效数据分页存储过程的简单示例
    • sql获取一条数据中所有字段的名称和值的实现方法
    • sql分割函数的简单示例
    • SQL Server异常捕获的简单示例
    • SQL SERVER回滚恢复误操作数据的实现方法
    • SQL Server函数或存储过程中抛出异常的实现方法
    • SQL Server创建数据库的完整代码
    • SQL Server创建数据库的命令用法示例

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。