這篇文章將為大家詳細(xì)講解有關(guān)如何解決SQL語句中執(zhí)行超時(shí)引發(fā)網(wǎng)站首頁訪問故障的問題,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
10余年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站建設(shè),個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對(duì)廣告推廣等多個(gè)方面,擁有多年的營(yíng)銷推廣經(jīng)驗(yàn)。
故障的情況是這樣的。
故障期間日志中記錄了大量下面的錯(cuò)誤。
2020-02-03 06:37:24.635 [Error] An unhandled exception has occurred while executing the request./Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareSystem.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (258): Unknown error 258 at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result)
數(shù)據(jù)庫服務(wù)器(阿里云 RDS SQL Server 2016 實(shí)例)的 CPU 消耗突增。
數(shù)據(jù)庫服務(wù)器的 IOPS 暴增。
通過阿里云 RDS 控制臺(tái)的 CloudDBA 可以查看到故障期間獲取首頁博文的 SQL 語句被執(zhí)行了3萬多次,執(zhí)行這么多次是由于查詢超時(shí),無法建立緩存,每次請(qǐng)求都要訪問數(shù)據(jù)庫。
發(fā)現(xiàn)故障后,我們通過阿里云 RDS 的主備切換恢復(fù)了正常。
經(jīng)過對(duì)故障的排查分析,鎖定的最大嫌疑對(duì)象是 SQL Server 參數(shù)嗅探(詳見園子里的博文 什么是 SQL Server 參數(shù)嗅探)。
對(duì)于這種因?yàn)橹赜盟松傻膱?zhí)行計(jì)劃而導(dǎo)致的水土不服現(xiàn)象,SQL Server 有一個(gè)專有名詞,叫“參數(shù)嗅探 parameter sniffing”。
而且我們找到了引發(fā) SQL Server 參數(shù)嗅探問題的條件。
在我們的 open api 中提供了獲取首頁博文列表的 web api ,但沒有限制可以獲取的最大博文數(shù),也就是下面的 ItemCount 參數(shù)(除了 open api ,其他地方調(diào)用時(shí) ItemCount 值都是 20 )。
SELECT TOP (@ItemCount)
假如有人調(diào)用 open api 時(shí)給 ItemCount 傳了一個(gè)很大的值,比如 20000 ,雖然調(diào)用的是同樣的 SQL 語句,但由于 ItemCount 的值不同, SQL Server 可能會(huì)生成相差很大的執(zhí)行計(jì)劃,對(duì)于 ItemCount 20000 性能比較好的執(zhí)行計(jì)劃,對(duì)于 ItemCount 20 可能性能極差。如果查詢 ItemCount 20000 時(shí)生成的執(zhí)行計(jì)劃被緩存下來,查詢 ItemCount 20 時(shí)繼續(xù)使用這個(gè)執(zhí)行計(jì)劃,就會(huì)出現(xiàn)本來好好的 SQL 查詢突然變得性能極差。我們今天遇到的故障很可能就是這個(gè)原因,而且故障時(shí)就一個(gè) SQL 語句出現(xiàn)問題(正好就這個(gè) SQL 查詢緩存了水土不服的執(zhí)行計(jì)劃),其他都正常,也驗(yàn)證了這個(gè)猜測(cè)。
通過這次故障,我們吸取的教訓(xùn)是一定要在代碼中對(duì) ItemCount 與 PageSize 的最大值進(jìn)行限制,它不僅僅是帶來不必要的低性能查詢,而且可能會(huì)因?yàn)?SQL Server 參數(shù)嗅探問題拖垮整個(gè)數(shù)據(jù)庫。
關(guān)于“如何解決SQL語句中執(zhí)行超時(shí)引發(fā)網(wǎng)站首頁訪問故障的問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
分享標(biāo)題:如何解決SQL語句中執(zhí)行超時(shí)引發(fā)網(wǎng)站首頁訪問故障的問題
標(biāo)題來源:http://chinadenli.net/article44/poopee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、商城網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站制作、定制網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)