緩衝池的數據庫頁中有大量 <free_space_in_bytes>
我們正在
sys.dm_os_buffer_descriptors
使用以下查詢查看select d.[name] [Database_Name], (count(file_id) * 8) / 1024 [Buffer_Pool_Size_MB], sum(cast(free_space_in_bytes as bigint)) / 1024 / 1024 [Free_Space_MB] from sys.dm_os_buffer_descriptors b join sys.databases d on b.database_id = d.database_id group by d.[name] order by [Buffer_Pool_Size_MB]
對於我的一個數據庫,它顯示
$$ Buffer_Pool_Size_MB $$= 77325 兆字節,並且$$ Free_Space_MB $$= 15849 兆字節 因此,緩衝池中大約 20% 的頁面空間是空的。好像很浪費資源
問題:
- 這是一個問題嗎?
- 如何
free_space_in_bytes
減少數量?- 在我們的情況下還有其他需要調查/查看的事情嗎?
這是一個問題嗎?
也許,也許不是。如果您的數據庫僅佔伺服器最大伺服器記憶體的 80%,那麼這就是我期望看到的。
如果您的數據多於 RAM,則可用空間可能是由於其他要求記憶體的東西。其他可能是查詢、CHECKDB、索引重建等的記憶體授予。
它也可能代表 Windows 和 SQL Server 之間的記憶體爭鬥。當您沒有設置最大伺服器記憶體來為 Windows 提供 10% 的記憶體十分之一以便它可以正常執行時,通常會發生這種情況。
之後,其他東西佔用了記憶體,它要麼沒有被緩衝池重新使用,要麼各種其他東西繼續使用可以被緩衝池使用的記憶體。
如何減少 free_space_in_bytes 的數量?
如果您的數據庫佔最大伺服器記憶體的約 80%,則什麼也沒有。
如果他們不這樣做,您可以:
- 添加記憶體
- 嘗試讓其他東西要求更少的記憶體
添加記憶體 通常會有所幫助,如果您添加足夠的記憶體以記憶體最常查詢的對象並為需要它們的程序提供記憶體授權。弄清楚這個數字是留給你的練習。沒有通用的計算,但一個好的起點是 RAM 佔伺服器數據的 50%。簡單來說:如果你有 10GB 的數據,就有 5GB 的 RAM。
讓其他東西要求更少的記憶體歸結為弄清楚還有什麼東西在要求記憶體,並適當地調整這些東西。
在我們的情況下還有其他需要調查/查看的事情嗎?
是的!查看被盜頁面計數器:
SELECT * FROM sys.dm_os_performance_counters AS dopc WHERE dopc.counter_name LIKE 'Stolen Server Memory%';
這可以告訴您 SQL Server 從緩衝池中獲取了多少記憶體並分配給了其他東西。
您還可以查看 SQL Server 是否必須強制任何查詢記憶體授予:
SELECT * FROM sys.dm_exec_query_resource_semaphores AS deqrs WHERE deqrs.forced_grant_count > 0;
由於您使用的是 SQL Server 2017,因此可以使用sp_BlitzCache:
EXEC sp_BlitzCache @SortOrder = 'memory grant';
這將向您顯示要求最大記憶體授予的查詢。當然,如果您的伺服器記憶體非常低,您的計劃記憶體數據可能會很糟糕,因為那裡的周轉率可能非常高。如果是這種情況,請在此處停止並添加記憶體,然後再繼續。
如果已打開,您可以嘗試使用 Query Store。Proc 可從與上述相同的連結獲得。
EXEC sp_BlitzQueryStore @DatabaseName = 'Your Important Database';
然後在結果中尋找“記憶體授予”模式。對於那些帶回的查詢,請在計劃中查找排序和雜湊。這些通常代表索引或查詢調整機會。如果您需要幫助調整這些問題,請隨時將它們作為新問題發布。不要把它們粘在這個上面。
而且,當然,也可能是您從不使用該記憶體。不過,我不會管它,因為有一天你可能會增長到那 20%。