sqlserver中几种典型的等待
为了准备今年的双11很久没有更新blog,在最近的几次sqlserver问题的排查中,了sqlserver几种典型的等待类型,类似于oracle中的等待事件,如果看到这样的等待类型时候能够迅速定位问题的根源,狼蚁网站SEO优化通过一则案例来把这些典型的等待处理方法整理出来
第一种等待.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);
添加完索引后,系统恢复正常。
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指