Sql-Server

In-Memory OLTP SQL Server 2016 - 系統記憶體不足

  • February 24, 2021

我正在嘗試放置一個記憶體中 OLTP 表,

這是您需要的記憶體估計:

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

但是當遷移開始時,會顯示以下錯誤消息:

在此處輸入圖像描述

我的表大小約為 22GB

在此處輸入圖像描述

我有一台記憶體為 64GB 的伺服器,我為 SQL 分配了 56GB,將表放入記憶體中我只需要 23GB

在此處輸入圖像描述

在此處輸入圖像描述

在此處輸入圖像描述

有誰能夠幫助我?謝謝。

所以我的猜測是你實際上可能沒有足夠的記憶體來將該表用作In-Memory Table

正如我在評論中提到的,根據這篇 Brent Ozar 文章Hekaton (In-Memory OLTP) Tables In Use ,聽起來其中一個要求是您的可用記憶體至少是In-Memory Tables大小的兩倍:

但是你需要了解這些限制,這些年來它們已經發生了很大的變化……

您的記憶體需要是數據大小的 2 倍

雖然您將 56 GB 的記憶體專用於 SQL Server 實例,但按照 Brent Ozar 的建議,將 23 GB 的表移動到記憶體表意味著您應該為該表提供至少 46 GB 的可用空間。而且因為 SQL Server 使用您分配給它的記憶體來記憶體其他內容,例如載入到記憶體中的數據頁,所以您從 56 GB 到 46 GB 剩下的 10 GB 並不是很依賴。即我不會懷疑您的實例已經消耗了超過 10 GB 的空間,因此您沒有 46 GB 可用於提供給您的In-Memory Table

Microsoft 聯機叢書中的這篇文章Estimate Memory-Optimized Tables 的記憶體要求也是關於如何估計您實際需要多少記憶體的一個很好的指南。

我建議測試一個只有幾 GB 左右的小得多的表作為概念證明。然後努力向上。如果您可以正常工作,那麼您可以在重試原始表格之前嘗試進一步增加記憶體。

您是否將數據庫綁定到特定的資源池?

嘗試增加池的可用記憶體。

將具有記憶體優化表的數據庫綁定到資源池 - 可用於記憶體優化表和索引的記憶體百分比

如果您將具有記憶體優化表和 SQL Server 工作負載的數據庫映射到同一資源池,則資源調控器會為記憶體中 OLTP 的使用設置一個內部門檻值,以便池的使用者不會在池使用方面發生衝突。一般來說,In-Memory OLTP 使用的門檻值約為池的 80%。下表顯示了各種記憶體大小的實際門檻值。

當您為 In-Memory OLTP 數據庫創建專用資源池時,您需要在考慮行版本和數據增長後估計記憶體中表需要多少物理記憶體。一旦估計了所需的記憶體,就可以創建一個資源池,其中包含 SQL 實例的送出目標記憶體的百分比,這反映在 DMV sys.dm_os_sys_info 中的列“committed_target_kb”中。例如,您可以使用實例可用總記憶體的 40% 創建資源池 P1。在這 40% 中,記憶體中 OLTP 引擎獲得了較小的百分比來儲存記憶體中 OLTP 數據。這樣做是為了確保記憶體中 OLTP 不會消耗該池中的所有記憶體。這個較小百分比的值取決於目標送出的記憶體。

使用此查詢對其進行評估

USE master 
GO

;WITH    cte
 AS ( SELECT   RP.pool_id ,
 RP.Name ,
 RP.min_memory_percent ,
 RP.max_memory_percent ,
 CAST (RP.max_memory_kb / 1024. / 1024. 
   AS NUMERIC(12, 2)) AS max_memory_gb ,
 CAST (RP.used_memory_kb / 1024. / 1024. 
   AS NUMERIC(12, 2)) AS used_memory_gb ,
 CAST (RP.target_memory_kb / 1024. / 1024. 
   AS NUMERIC(12,2)) AS target_memory_gb,
 CAST (SI.committed_target_kb / 1024. / 1024. 
   AS NUMERIC(12, 2)) AS committed_target_kb 
   FROM     sys.dm_resource_governor_resource_pools RP
   CROSS JOIN sys.dm_os_sys_info SI
 )
SELECT  c.pool_id ,
 c.Name ,
 c.min_memory_percent ,
 c.max_memory_percent ,
 c.max_memory_gb ,
 c.used_memory_gb ,
 c.target_memory_gb ,  
 CAST(c.committed_target_kb  *
 CASE WHEN c.committed_target_kb <= 8 THEN 0.7
   WHEN c.committed_target_kb < 16 THEN 0.75
   WHEN c.committed_target_kb < 32 THEN 0.8
   WHEN c.committed_target_kb <= 96 THEN 0.85
   WHEN c.committed_target_kb > 96 THEN 0.9
 END * c.max_memory_percent /100 AS NUMERIC(12,2))
  AS [Max_for_InMemory_Objects_gb]
FROM    cte c

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