天天看點

RDS SQL Server - 專題分享 - 巧用執行計劃緩存之統計資訊缺失警告問題引入場景重制發現問題解決問題最後總結

SQL Server 資料庫查詢優化器對執行計劃成本的評估是基于統計資訊的,換句話說,統計資訊的準确與否直接關系着查詢語句是否能夠高效運作。那麼,在SQL Server中,表對象中統計資訊的缺失是一個影響查詢語句性能的風險點,我們如何能夠通過非常自動化的方式來偵查,發現統計資訊的缺失呢?這個問題的答案就是我們今天這篇文章要分享的内容 - 使用執行計劃緩存來發現統計資訊的缺失警告。

為了模拟統計資訊缺失的場景,我們建立測試資料庫,建立測試表,執行查詢語句,然後通過執行計劃圖像化界面發現統計資訊缺失警告。

建立測試資料庫并且關閉該資料庫的自動建立統計資訊的選項設定。

建立測試表,并初始化2萬條資料。

查詢測試,這裡請打開實際執行計劃選項,方法如下截圖:

RDS SQL Server - 專題分享 - 巧用執行計劃緩存之統計資訊缺失警告問題引入場景重制發現問題解決問題最後總結

或者使用快捷鍵Ctrl + m,然後執行下面的查詢語句。

查詢語句執行完畢後,實際執行計劃截圖如下:

RDS SQL Server - 專題分享 - 巧用執行計劃緩存之統計資訊缺失警告問題引入場景重制發現問題解決問題最後總結

從執行計劃截圖,我們可以發現以下規律:

實際行數與預估行數相差甚遠:實際滿足條件行數為0,而執行計劃預估滿足條件行數為905,說明統計資訊不準确。

統計資訊缺失警告:存在WHERE語句中的字段ItemID,UserID缺少統計資訊警告。

将執行計劃圖形化界面生成XML格式,XML格式中的統計資訊缺失警告如下截圖:

RDS SQL Server - 專題分享 - 巧用執行計劃緩存之統計資訊缺失警告問題引入場景重制發現問題解決問題最後總結

在“場景重制”小節,我們是通過手動分析執行計劃來發現統計資訊缺失(我們可以叫手動模式),我們如何實作無人值守,自動偵查,自動發現統計資訊缺失呢?我們稱之為自動模式。要實作統計資訊缺失的自動發現和跟蹤,我們可以通過搜尋執行計劃緩存的方式來實作,代碼如下:

執行查詢語句的部分結果截圖展示如下:

RDS SQL Server - 專題分享 - 巧用執行計劃緩存之統計資訊缺失警告問題引入場景重制發現問題解決問題最後總結

我們通過自動化的方式來跟蹤和發現了統計資訊缺失的問題,我們将如何解決這個問題呢?

由于為了場景重制統計資訊缺失的目的,在資料庫建立完畢後,我們手動關閉了資料庫統計資訊自動建立的功能,為了解決統計資訊缺失的問題,我們需要打開這個選項(當然建立資料庫系統預設是自動打開的)。這個選項打開後,SQL Server在發現查詢語句有統計資訊缺失的情況下,會自動為相應的字段建立統計資訊。打開選項的方法如下:

在我們的工作過程中,我們發現在極少情況下,即使自動建立統計資訊選項是打開的,也會出現統計資訊缺失的情況,在這種場景下,就需要我們根據“發現問題”小節的方法(字段名為Refer_Columns)找到統計資訊缺失的字段,手動建立統計資訊。比如:

這篇文章分享了如何通過執行計劃緩存來查找統計資訊缺失的方法,并提出來解決這類問題的途徑,進而解決了因為統計資訊缺失而導緻SQL Server優化器對執行計劃評估不準确的風險點,保證資料庫系統高效率運作。