參數探測(Parameter Sniffing)影響存儲過程執行效率解決方案

来源:http://www.cnblogs.com/bi-info/archive/2016/12/30/6232372.html
-Advertisement-
Play Games

如果SQL query中有參數,SQL Server 會創建一個參數嗅探進程以提高執行性能。該計劃通常是最好的並被保存以重覆利用。只是偶爾,不會選擇最優的執行計劃而影響執行效率。 SQL Server嘗試通過創建編譯執行計劃來優化你的存儲過程的執行。通常是在第一次執行存儲過程時候會生成並緩存查詢執行 ...


如果SQL query中有參數,SQL Server 會創建一個參數嗅探進程以提高執行性能。該計劃通常是最好的並被保存以重覆利用。只是偶爾,不會選擇最優的執行計劃而影響執行效率。

SQL Server嘗試通過創建編譯執行計劃來優化你的存儲過程的執行。通常是在第一次執行存儲過程時候會生成並緩存查詢執行計劃。當SQL Server資料庫引擎編譯存儲過程中偵測到有參數值傳遞進來的時候,會創建基於這些參數的執行計劃。這種在編譯存儲過程中偵測參數值的方法,通常被稱為“參數探測”。有時參數探測會產生效率低下的執行計劃;特別是當一個存儲過程調用與具有不同的基數的參數值。

什麼是參數探測

探測一詞就顯示出了更多的不可靠性,有時候會產生好的結果就不可避免的產生一些壞的結果。參數探測是在SQL SERVER通過第一次執行時調用的參數創建的最優的執行計劃。 這個第一次是指不管你執行或者是重新編譯因為在緩存中沒有一個現成的執行計劃存在。以後使用相同的參數調用同一個存儲過程的時候同樣會得到一個最佳的執行方案。但是使用不同的參數的時候可能得不到最佳的方案,就是壞的結果。

並不是所有的執行計劃是平等的,執行計劃會按照要做什麼進行一些必要的優化。SQL SERVER再去選擇並確定最優的執行策略。它著眼於做什麼樣的查詢,使用參數值來看看統計數據,做了那些計算,最終決定通過哪些步驟來解決查詢。這是如何創建一個執行計劃的比較簡單的解釋。對我們來說,重要的一點是,SQL Server通過這些參數用來確定如何處理查詢。一組參數的最優執行計劃可能是一個索引掃描操作,而另一組參數可能使用索引查找能更好地解決。

 

參數探測影響示例

假設我們有一個基於國家查詢運行銷售數據的存儲過程:

EXEC rpt_Sales @Country ='China' - SQL Server構建針對大量銷售額的國家而優化的執行計劃,並且運行時間大約為750毫秒。

EXEC rpt_Sales @Country ='Monaco' - 它重用了中國的大數據緩存執行計劃。這對於小國來說不是很好,但也沒有那麼糟糕因為只返回少量數據,所以它仍然運行在500毫秒。

現在我們重新啟動SQL Server,有人首先查詢Monaco:

EXEC rpt_Sales @Country ='Monaco' - SQL Server構建了一個針對微小數據量的國家而優化的執行計劃,它運行時間只有50毫秒 - 比摩納哥重用中國計劃時要好很多!

EXEC rpt_Sales @Country ='China' - 它重用了Monaco的緩存計劃來處理小數據。 它需要30秒,如果很多人同時運行這個存儲過程,我們的伺服器要開始崩潰了!

 

如何臨時修複參數探測問題

1. 重啟伺服器 – 新手最先想到的解決方案,遇到問題先重啟。重啟伺服器後會清除所有的緩存。重啟完後,有人首先使用'China'去運行了rpt_Sales, 它將建立一個好的執行計劃。一些初級DBA會覺得這個問題已經被修複。

2. 重啟SQL Server 實例 – 隨著工作經驗的增長,他們意識到不能隨意的重啟伺服器。發現重啟實例也可以達到重啟伺服器的效果。。

3. 運行DBCC FREEPROCCACHE - 此命令會從緩存中清除所有執行計劃,但不清除SQL Server的其他緩存和統計信息。相比重啟來說,是個比較好的方案,因為至少可以確保資料庫線上的情況下完成。

4. 重建索引 – 這其實是個意外,當SQL Server重建一個表的索引時會同時更新索引的統計信息。這也會修複了參數探測問題,因為當SQL Server意識到傳入查詢使用的對象的統計信息 (statistics)更新時,它將為該查詢構建一個新的執行計劃。

5.更新統計信息 (statistics) - 當人們學習到上述額外發現,他們意識到他們可以通過只更新統計信息數據,這是一個比重建索引容易得多的操作。

6.對一個表或存儲過程運行sp_recompile - 此系統存儲過程接受表或存儲過程名稱作為參數,並將所有相關的執行計劃標記為在下次運行時強制重新編譯。

7.清除特定的執行計劃緩存 - 為單個查詢運行DBCC FREEPROCCACHE, 只清除特定(比如rpt_Sales)的執行計劃緩存。

 

禁用參數探測

既然參數探測會帶來不確定的因素,我們可以通過使用本地變數來禁止參數探測。

比如:

create procedure rpt_Sales (@Country varchar(20))

 as

 begin

 declare @LocCountry varchar(20)

 set @LocCountry = @CustID

 

select * from orders

 where Country = @LocCountry

 end

 

 

歸納總結 
參數探測(Parameter Sniffing)可以在存儲過程級別上啟用或禁用; 
如果檢索的數據列基本上平均分佈,我們不必使用本地變數(禁用Parameter Sniffing);例如,查詢主鍵列或唯一鍵列(Unique Key); 
如果檢索的數據列分佈很大,則可以使用本地變數,禁用參數探測(Parameter Sniffing);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:我們來瞭解一下MVVM模式與Databinding ,MVVM是一種模式,Databinding 是一種框架。DataBinding是一個實現數據和UI綁定的框架。而ViewModel和View可以通過DataBinding來實現單向綁定和雙向綁定,這套UI和數據之間的動態監聽和動態更新的框架 ...
  • 提到FlexboxLayout大家估計有點模糊,它是谷歌最近開源的一個android排版庫,它的前身Flexbox是2009年W3C提出了一種新的佈局,可以簡便、完整、響應式的實現頁面佈局,Flexbox 是屬於web前端領域CSS的一種佈局方案。 首先:我們看一下它的屬性。 flexDirecti ...
  • 大致分為以下幾個方面: 一些查詢指令整理 使用SQL語句進行特殊查詢 檢測表欄位是否存在 資料庫升級 資料庫表欄位賦初始值 一、查詢指令整理 1.鏈式執行的指令 一般的查詢語句會在中間xxx的位置加上各種判斷和過濾的方法指令,除了最後的終結指令list()或unique()返回的是集合或業務對象,其 ...
  • 微信的張小龍也說了,小程式主要是通過二維碼進行傳播,那麼小程式的二維碼如何統計各個渠道的值呢? 微信小程式開發了帶參數二維碼,而帶參數二維碼就可以進行渠道統計 不然我有3個人,讓3個人使用不同的小程式二維碼進行地推 地推人員A 二維碼A 參數hotapp=a 地推人員B 二維碼B 參數hotapp= ...
  • 最近在學習安卓APP的開發,用到了toolbar這個控制項, 最開始使用時include layout這種方法,不過感覺封裝性不好,就又改成了自定義組合控制項的方式。 使用的工具為android studio 2.2,簡稱AS吧 1.首先創建一個新的自定義控制項,如下圖。AS會創建3個文件, 一個java ...
  • 新項目用swift3.0開發,現在基本一個月,來總結一下遇到的問題及解決方案 1,在確定新項目用swift後,第一個考慮的問題是用純swift呢?還是用swift跟OC混編 考慮到新項目也不可避免的使用很多第三方庫,而第三方庫不一定支持swift或者有swift的替代版本,所以最終還是決定混編了; ...
  • Android游戲開發實踐(1)之NDK與JNI開發03 前面已經分享了兩篇有關Android平臺NDK與JNI開發相關的內容。以下列舉前面兩篇的鏈接地址,感興趣的可以再回顧下。那麼,這篇繼續這個小專題,主要分享下AndroidStudio下的NDK與JNI開發的相關操作以及簡述下CMake的使用。 ...
  • 之前的博文《Android中使用ExpandableListView實現好友分組》我簡單介紹了使用ExpandableListView實現簡單的好友分組功能,今天我們針對之前的所做的仿微信APP來對ExpandableListView做一個擴展介紹,實現效果如下(通訊里使用ExpandableLis ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...