2023年3月31日 星期五

維護計畫重建索引比更新統計值快?


客戶有提到他們有一個「重建索引」的維護計畫,每次都跑很久,有時候會跑到上班時間還在跑,造成DB LOCK嚴重,問我們有沒有什麼辦法。

依微軟官方說明

https://learn.microsoft.com/zh-tw/sql/relational-databases/indexes/reorganize-and-rebuild-indexes?view=sql-server-ver16 






























重建索引會一併執行該索引的統計值更新,依官方的說明,重建索引之所以會有明顯的效能提升,大多不在於索引重建本身,而是在於索引重建後的統計值更新 

所以,當時我建議客戶將重建索引,改成統計值更新即可,執行時間會快很多,既達到效能優化的目地,又節省時間,可以避免凌晨跑不完造成上班時間DB-LOCK。


但奇怪的是,客戶依我的建議改了之後說,統計值更新執行時間竟然是原本重建索引的3倍。反而跑更久了~~


照理說,只做統計值更新,應該會比重建索引快很多。後來去查才看到有個選項沒說清楚。

 我們知道統計值有兩種

一、索引統計值:索引建立或重建時由系統自動產生,它的統計值名稱通常即為索引名稱。

二、非索引統計值:系統依查詢的where條件去找相應的統計值,如果找不到,則會依where條件建立一個統計值。例如你用身份證號建了一個索引,但有人在查詢時用生日當where條件。由於並沒有生日的索引統計值,故系統將自動建立一個生日的統計值,這就是非索引統計值,它的命名都是以「_WA_SYS_....」開頭,如下圖。












重建索引時確實會一併執行統計值更新,但它只更新該索引的統計值,而不包含非索引統計值。 

執行計畫中的「更新統計值」(如下圖),預設是更新所有的統計值,包含索引及非索引統計值

















由於客戶TABLE中「非索引統計值」的數量幾乎是索引統計值的5倍,因此如果以上圖預設「所有現有的統計資料」,確實有可能會比重建索引要慢。

 

經跟客戶說明,並請客戶改維護計畫,勾選「僅限索引統計值」,執行時間由原本「重建索引」的3倍,降為1/2

沒有留言:

張貼留言