zoukankan      html  css  js  c++  java
  • 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://hidba.org/?p=859

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/YuanZhaoBest/p/5278906.html
Copyright © 2011-2022 走看看