Sql-Server

更新 18 TB 數據庫的統計資訊

  • March 5, 2017

我在這裡尋找專家關於如何管理大約 18 TB 的超大型數據庫的更新統計資訊的建議。

我們最近開始面臨性能問題,並認為這是由於舊的統計數據造成的。

實際上,我們有一個執行 exec sp_update stats 並以預設採樣率更新的作業,在我們的例子中是 1.2%。所以我們必須手動更新統計數據並看到一些改進。

我確信安排 FULL SCAN 將是一個挑戰。據我所知,我正在將行與採樣的行進行比較。例如,在一張大小為 400 GB 且行數超過 100M 的表上,我可以看到採樣行約為 2 到 4M。大表是分區的。

我們使用的是 SQL Server 2012 企業版。未啟用跟踪標誌 2371。

請建議我如何以更好的方式為如此大的數據庫利用更新統計資訊以及如何使用該採樣率?

根據您的問題,我可以想到四個可能導致您遇到的問題的統計問題。

1. 統計數據沒有足夠頻繁地自動更新。

在 SQL Server 2012 中,僅當表中 20% 或更多的行發生更改後,才會更新統計資訊。這意味著對於 10 億行表,您需要在統計資訊更新發生之前修改 2 億行。隨著表變大,您的統計資訊更新將變得越來越少,因此 SQL Server 可以多年不更新大型表的統計資訊。

TF 2371更改了門檻值,以便更頻繁地更新統計資訊。在 SQL Server 2016 中,此更改已成為我的預設設置。

2. 工作量中的查詢容易受到升序關鍵問題的影響。

考慮一個表,該表每天載入新數據,並且查詢過濾最近一天的數據。除非在數據載入後立即更新統計資訊,否則新數據不會出現在任何統計直方圖中。由於基數估計值低,這可能導致查詢性能非常差。

SQL Server 2014 中的新 CE 在這方面進行了改進。如果您要求直方圖範圍之外的數據,它可能會做出更樂觀的猜測,並假設表中有數據但直方圖中沒有。在 SQL Server 2012 中,您可以通過更頻繁地更新統計資訊或啟用TF 4139來解決此問題(如果有)。TF 4139 僅適用於帶有索引的列。SQL Server 可能會對索引執行非常快速的查詢以獲取最高或最低值,並將臨時修改相關統計對象的直方圖。這可以為某些查詢制定更好的計劃。

3. 您的查詢等待統計資訊更新。

預設情況下,如果查詢載入過時的統計資訊更新,它將在創建查詢計劃之前更新該統計資訊對象。在 SQL Server 2012 上,抽樣統計更新將使用MAXDOP 1. 如果針對大型表啟動,則該過程可能會在等待統計資訊更新完成時超時。在針對錶更新統計資訊後,查詢性能更好,因為它不再需要等待統計資訊更新。

如果您遇到此問題,可以通過使用該NORECOMPUTE選項進行更主動的統計維護來解決此問題。或者,您可以嘗試通過升級到 SQL Server 2016 來加快統計更新速度。在 SQL Server 2016 上,抽樣統計更新可以並行執行。

另一種選擇是打開該AUTO_UPDATE_STATISTICS_ASYNC選項。如果查詢計劃遇到過時的統計對象,它將將該統計對象排隊以由後台作業更新。這聽起來可能很糟糕,而且確實如此。查詢可能會使用陳舊的統計資訊執行。當您沒有更好的選擇時,您希望打開這種功能,例如在使用自動統計更新太昂貴或對計劃形狀沒有足夠幫助的大型系統時。Jack Li 在部落格中介紹了一位通過此選項獲得幫助的客戶

4. 您的工作負載將受益於手動統計更新,其採樣率高於自動採樣率。

一些查詢和工作負載需要超過預設的統計採樣率才能達到可接受的性能。這在大型數據庫上可能很難做到,但在 SQL Server 的更高版本中有一些技巧和一些增強功能會有所幫助。

如果您非常了解您的數據和工作量,您可以關閉自動統計更新。您可以收集所需的統計數據FULLSCAN並在適當的時候更新它們。這種方法需要大量的工作和對伺服器的大量關注。

如果您有一個重建索引的現有維護過程(其中的智慧存在爭議)請注意重建索引會自動更新統計資訊FULLSCAN,因此如果您建構維護解決方案來更新統計資訊,也許您可以利用這一點。

請注意,收集抽樣統計資訊可能不會比全掃描統計資訊快,尤其是在對直方圖列進行索引的情況下。SQL Server 可以並行進行全掃描統計更新。它也可以在對索引列進行全掃描時避免排序,但在對列進行採樣時不會避免排序。事實上,對於足夠大的表,如果它們填滿 tempdb,則針對未索引列的統計資訊更新可能會失敗。

SQL Server 2014 引入了增量統計。假設您有一個分區表,並且僅在一個分區中修改了大量數據。以前,要更新表上的統計資訊,您必須查看所有分區。有了這個新功能,就可以只收集有關已更改分區的新統計資訊。SQL Server 能夠將分區中的統計資訊匯總到一個表級對像中。

如果您無法升級,您可以考慮將一些表轉換為分區視圖。視圖中的每個表都會有自己的統計對象,因此如果您根據日期載入數據,您可能只需要更新視圖中最新表的統計資訊,而不是更新視圖的所有表。

最後,如前所述,SQL Server 2016 可以並行更新抽樣統計資訊

從 SQL Server 2016 開始,在使用兼容級別 130 時,並行進行數據採樣以建構統計資訊,以提高統計資訊收集的性能。每當表大小超過某個門檻值時,查詢優化器將使用並行樣本統計資訊。

引用自:https://dba.stackexchange.com/questions/166158