Sql-Server-2014

為什麼即使統計資訊正確,也會發生 TempDB 溢出?

  • June 30, 2020

我閱讀了 Brent Ozar 發表的一篇很棒的文章,並提出了一些與記憶體授予相關的問題。我無法在他文章的評論部分解決我的問題,所以我想從這裡獲得任何幫助。

  1. 問題:有多少數據溢出到磁碟中? 400 MB還是60 MB (7643KB*8)?

他在文章中說:

而且無論我更新多少次統計數據,我仍然會得到大約400MB的磁碟溢出。

我在這裡有點困惑(

在此處輸入圖像描述 在此處輸入圖像描述

  1. 問題:如果估計一切正常,統計數據是最新的,盒子有足夠的記憶體,並且當時沒有執行任何查詢,那麼為什麼會發生溢出到磁碟?

查看估計的行數與實際的行數。它們是相同的。統計數據很好。

我也沒有使用小型伺服器:我的虛擬機有 32GB 記憶體,我已將其中的 28GB 分配給 SQL Server。沒有其他查詢同時執行——它只是一個孤獨的查詢,溢出到磁碟……

在此處輸入圖像描述

如工具提示所示,溢出了 7643 個 8KB 頁面 = 59.71MB。其餘的排序發生在分配的記憶體中。

排序溢出有兩個原因:

  1. 排序是並行的。準確的記憶體估計在排序執行緒之間平均分配,並且不能在執行時線上程之間動態重新分配。如果行分佈不均勻,一個或多個排序執行緒可能溢出。這在低DOP時更有可能發生,例如 4 而不是 8。

> > 掃描和排序執行緒 > > >

  1. SQL Server 在估計記憶體需求時不考慮溢出管理成本。這在FIX 中有詳細說明:當估計的行數和行大小正確時,排序運算符溢出到 SQL Server 2012 或 SQL Server 2014 中的 tempdb。

在 SQL Server 2019 上,可以通過行模式記憶體授予回饋機制自動調整執行之間授予的記憶體以避免溢出。

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