Sql-Server

我是否需要向我的 SQL Server 2008 R2 實例添加更多記憶體?

  • December 11, 2019

有人問我,我們的 SQL Server 實例之一是否有足夠的記憶體。這是在具有 40 個 CPU 和 64 GB RAM 的 x64 電腦上執行的 SQL Server 2008 R2 標準版。

此實例下執行的所有數據庫的總大小略大於 300 GB。

該實例已配置為最小伺服器記憶體為 4096 MB,最大伺服器記憶體為 24000 MB。

到目前為止,我已經設法收集了以下資訊:

正在使用的物理記憶體:

SELECT physical_memory_in_use_kb, 
  process_physical_memory_low, 
  process_virtual_memory_low
FROM sys.dm_os_process_memory 

physical_memory_in_use_kb process_physical_memory_low process_virtual_memory_low
------------------------- --------------------------- --------------------------
25657180                  0                           0

性能計數器:

SELECT counter_name , cntr_value 
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Total Server Memory (KB)', 
'Target Server Memory (KB)', 'Granted Workspace Memory (KB)',
'Maximum Workspace Memory (KB)',
'Memory Grants Outstanding', 'Memory Grants Pending')

counter_name                                cntr_value
-----------------------------------     --------------------
 Granted Workspace Memory (KB)                1024
 Maximum Workspace Memory (KB)                17714520
 Memory Grants Outstanding                    1
 Memory Grants Pending                        0
 Target Server Memory (KB)                    24576000
 Total Server Memory (KB)                     24576000

緩衝池:

select count(*) AS Buffered_Page_Count
,count_big(*) * 8192 / (1024 * 1024) as Buffer_Pool_MB
from sys.dm_os_buffer_descriptors

Buffered_Page_Count Buffer_Pool_MB
------------------- --------------------
2499693             19528

緩衝池大小圖:

在此處輸入圖像描述

BPHR:

在此處輸入圖像描述

裝滿:

在此處輸入圖像描述

計劃記憶體大小:

在此處輸入圖像描述

每秒頁面讀取次數

在此處輸入圖像描述

每秒頁面寫入次數

在此處輸入圖像描述

總 IO 等待時間: 在此處輸入圖像描述

我的問題是:

我應該看的其他東西是什麼?

如果以上就足夠了,我是否必須建議添加更多記憶體(可能是 50 GB),因為 PLE 會隨著時間的推移而下降(而總 IO 等待時間顯示會增加)?

目標伺服器記憶體等於最大記憶體集。如果配置了實例,這是否表明實例可以利用更多記憶體?

那麼,我如何知道我的 SQL Server 是否需要更多記憶體?或者它沒有

我應該看的其他東西是什麼?

前幾句

這是在具有 40 個 CPU 和 64 GB RAM 的 x64 電腦上執行的 SQL Server 2008 R2 標準版。

為什麼你的最大記憶只有在24000MB你有64GB物理記憶的時候?是否有其他實例/服務/…在其上執行?

如果答案是否定的,那麼您可以將 max memory 設置為 about 56GB = 57344 MB

附帶說明一下,sql server 2008 R2 沒有擴展支持。最好考慮遷移到更新的版本。

哪些對象正在消耗緩衝池記憶體

由於您的 PLE 一直很低,並且隨著時間的推移變得更低,您可以查看在一天中的不同時間點究竟是什麼在使用此 BP 記憶體。

首先看看哪些數據庫消耗最多:

-- get memory usage per database
SELECT
[DatabaseName] = CASE [database_id] WHEN 32767
THEN 'Resource DB'
ELSE DB_NAME([database_id]) END,
COUNT_BIG(*) [Pages in Buffer],
COUNT_BIG(*)/128 [Buffer Size in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY [database_id]
ORDER BY [Pages in Buffer] DESC;

之後,您可以在數據庫級別更深入地了解哪些對像在記憶體中,以及這些對像在記憶體中擁有多少頁。

-- get memory usage for objects in a database

select
      count(*)as cached_pages_count,
      obj.name as objectname,
      ind.name as indexname,
      obj.index_id as indexid
from sys.dm_os_buffer_descriptors as bd
   inner join
   (
       select       object_id as objectid,
                          object_name(object_id) as name,
                          index_id,allocation_unit_id
       from sys.allocation_units as au
           inner join sys.partitions as p
               on au.container_id = p.hobt_id
                   and (au.type = 1 or au.type = 3)
       union all
       select       object_id as objectid,
                          object_name(object_id) as name,
                          index_id,allocation_unit_id
       from sys.allocation_units as au
           inner join sys.partitions as p
               on au.container_id = p.partition_id
                   and au.type = 2
   ) as obj
       on bd.allocation_unit_id = obj.allocation_unit_id
left outer join sys.indexes ind 
 on  obj.objectid = ind.object_id
and  obj.index_id = ind.index_id
where bd.database_id = db_id()
 and bd.page_type in ('data_page', 'index_page')
group by obj.name, ind.name, obj.index_id
order by cached_pages_count desc;

如果更精細的查詢報告更少,則必須刪除and bd.page_type in ('data_page', 'index_page')以包含 LOB 數據頁。

下一步

您應該將此資訊與系統上執行的查詢放在一起,您可能能夠優化某些查詢/添加索引,從而減少記憶體中需要的數據。

如果你想走得更遠,ROW / PAGE如果你有 CPU 能力,可以考慮壓縮。

壓縮數據在記憶體中保持壓縮狀態。

另請注意,如果您使用的是 sql server 2008 R2 標準版,則只能轉到64GBmax memory。從 sql server 2014 開始,這會達到128GB最大記憶體。這也是遷移的另一個原因。


如果以上就足夠了,我是否必須建議添加更多記憶體(可能是 50 GB),因為 PLE 會隨著時間的推移而下降(而總 IO 等待時間顯示會增加)?

僅基於 PLE,這不是唯一需要考慮的因素,我會說您的頁面過於頻繁地被刷新到記憶體之外。優化您的查詢或增加您的記憶體。

目標伺服器記憶體等於最大記憶體集。如果配置了實例,這是否表明實例可以利用更多記憶體?

目標伺服器記憶體 (KB) 是 SQL Server 在其目前負載下願意(可能)分配給緩衝池的記憶體量。Total Server Memory (KB) 是 SQL 目前已分配的記憶體。

來源

它已將所有可能的記憶體分配給最大記憶體允許的緩衝池,它不會超過這個數量的緩衝池分配。

那麼,我如何知道我的 SQL Server 是否需要更多記憶體?或者它沒有

同樣,查看記憶體中的對像以及負責它的查詢是否可以優化將是一個好的開始。

此外,如果您有空間,我會增加最大記憶體(如果您實際上在機器上有 64GB 記憶體)或增加機器上的記憶體。

再次記住,64GBsql server 2008 R2 標準版有最大記憶體限制,並且128GB從 sql server 2014 標準版開始增加。

企業版沒有限制。

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