佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > sqlserver中幾種典型的等待

sqlserver中幾種典型的等待

熱門標(biāo)簽:鐵路電話系統(tǒng) 地方門戶網(wǎng)站 網(wǎng)站排名優(yōu)化 AI電銷 服務(wù)外包 Linux服務(wù)器 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求

為了準(zhǔn)備今年的雙11很久沒有更新blog,在最近的幾次sqlserver問題的排查中,總結(jié)了sqlserver幾種典型的等待類型,類似于oracle中的等待事件,如果看到這樣的等待類型時(shí)候能夠迅速定位問題的根源,下面通過一則案例來把這些典型的等待處理方法整理出來:

第一種等待.memory等待

早上接到一用戶反饋其RDS實(shí)例非常的慢,通過觀察sqlserver活動(dòng)會(huì)話監(jiān)視器(active monitor)的waiting tasks(類似于mysql的thread running)可以看到有10多w的等待任務(wù),可以明確數(shù)據(jù)庫現(xiàn)在已經(jīng)出現(xiàn)了較大的瓶頸,緊接著通過resource waits看到數(shù)據(jù)庫中有大量的memory內(nèi)存等待:

看到是memory 資源等待后,為了立刻恢復(fù)用戶應(yīng)用,想到立刻去調(diào)大內(nèi)存,發(fā)現(xiàn)該實(shí)例已經(jīng)是24G了,看來一下os的空余內(nèi)存,還有較多的內(nèi)存剩余,所以將內(nèi)存調(diào)大到36G,發(fā)現(xiàn)resource waits還是在memory上等待,同時(shí)這個(gè)時(shí)候的cpu使用率飆升,達(dá)到了90%左右(之前在10%左右的等待).這樣解決不了根本問題,于是通過recent expensive queries,發(fā)現(xiàn)以下sql的邏輯讀很高,執(zhí)行非常頻繁:

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

也可以通過如下方式獲得造成內(nèi)存等待的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
發(fā)現(xiàn)該表只有一個(gè)主鍵索引:

創(chuàng)建一下索引:
create index ind_RefundOrder_Message_order_id on RefundOrder_Message(Order_Id);

第二種等待:latch等待


在索引加上去后,memory的等待立刻消失,但是resource waits的等待變?yōu)榱?lock:

通過以下內(nèi)部視圖可以發(fā)現(xiàn)如下調(diào)用出現(xiàn)了等待:
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;

得到阻塞其他會(huì)話的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是一張非常核心的視圖,里面關(guān)聯(lián)了訂單,訂單消息,訂單發(fā)貨等多個(gè)業(yè)務(wù)邏輯;查詢條件中代入了membercode為店鋪的名稱,可能操作某個(gè)店鋪的訂單;
通過ViewSalesOrder視圖中的定義,membercode,IsObsolete ,OdCode 為salesOrder表的三個(gè)字段,查看salesOrder上并沒有相應(yīng)的索引,于是加上如下索引:
create index ind_salesOrder_member on salesOrder(membercode,IsObsolete,code);
在添加完索引后,數(shù)據(jù)庫的waiting tasks 下降,batch requests提升:

第三種等待:lock

第三種等待是常見的等待,常見的情況在刪除,更新的時(shí)候由于條件中沒有合適的索引導(dǎo)致鎖定的記錄范圍太大,導(dǎo)致阻塞其他的會(huì)話請(qǐng)求:

用戶在在進(jìn)行壓測(cè)的時(shí)候發(fā)現(xiàn)一條更新語句執(zhí)行的非常慢,導(dǎo)致整個(gè)系統(tǒng)都卡?。?/p>

update DD_ShenHe   set ZF = 0   where zf is null;

查看dd_shenhe表上面的索引:

可以看到表中并沒有zf字段的索引,而該表總共有400w的數(shù)據(jù),zf 為null的有8000條,所以在zf字段添加索引是合適的:

Create index ind_dd_shenhe_zf on dd_shenhe(zf);

添加完索引后,系統(tǒng)恢復(fù)正常。

您可能感興趣的文章:
  • SqlServer中如何解決session阻塞問題
  • mysql的udf編程之非阻塞超時(shí)重傳
  • sql server 2000阻塞和死鎖問題的查看與解決方法
  • SQL Server誤區(qū)30日談 第2天 DBCC CHECKDB會(huì)導(dǎo)致阻塞
  • 利用sys.sysprocesses檢查SqlServer的阻塞和死鎖
  • SQL2008中SQL應(yīng)用之-阻塞(Blocking)應(yīng)用分析
  • SQL語句實(shí)現(xiàn)查詢當(dāng)前數(shù)據(jù)庫IO等待狀況
  • SQL語句練習(xí)實(shí)例之三——平均銷售等待時(shí)間
  • 系統(tǒng)隱形殺手——阻塞與等待(SQL)

標(biāo)簽:湘潭 黃山 崇左 湖南 蘭州 衡水 銅川 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sqlserver中幾種典型的等待》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    大方县| 古田县| 铜陵市| 湖南省| 重庆市| 江孜县| 天峨县| 屯留县| 叙永县| 望奎县| 绥芬河市| 海伦市| 泸定县| 吉木萨尔县| 贞丰县| 抚州市| 天全县| 临武县| 佛冈县| 陇川县| 长武县| 封丘县| 阿克苏市| 汉中市| 海盐县| 东辽县| 思南县| 同仁县| 吴忠市| 河北省| 南澳县| 屯昌县| 彭水| 鞍山市| 亳州市| 油尖旺区| 商洛市| 治多县| 镇赉县| 西藏| 扶沟县|