將包含記憶體最佳化資料表的資料庫繫結至資源集區

適用於:SQL Server

資源集區代表可受管制的實體資源子集。 根據預設,SQL Server 資料庫會繫結至預設資源集區並取用其資源。 為了防止一個或多個經記憶體最佳化的資料表取用 SQL Server 的所有資源,以及避免其他記憶體使用者耗用記憶體最佳化資料表所需的記憶體,您應該針對具有記憶體最佳化資料表的資料庫建立另一個資源集區來管理記憶體耗用量。

一個資料庫只能繫結至一個資源集區。 不過,您可以將多個資料庫繫結至相同的集區。 SQL Server 允許將不含記憶體最佳化資料表的資料庫繫結至資源集區,但是這樣卻毫無效用。 如果您日後想要在資料庫中建立記憶體最佳化資料表,就可以將該資料庫繫結至具名資源集區。

資料庫與資源集區都必須事先存在,然後您才能將資料庫繫結至資源集區。 繫結會在下一次資料庫重新上線時生效。 如需詳細資訊,請參閱 資料庫狀態

如需有關資源集區的詳細資訊,請參閱 Resource Governor 資源集區

將資料庫繫結至資源集區的步驟

  1. 建立資料庫和資源集區

    1. 建立資料庫

    2. 決定 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的最小值

    3. 建立資源集區和設定記憶體

  2. 將資料庫繫結至集區

  3. 確認繫結

  4. 使繫結生效

本主題的其他內容

建立資料庫和資源集區

您可以按照任何順序建立資料庫和資源集區。 重點在於這兩者必須事先存在,才能將資料庫繫結至資源集區。

建立資料庫

下列 Transact-SQL 會建立名為 IMOLTP_DB 的資料庫,其中將包含一個或多個經記憶體最佳化的資料表。 執行此命令之前,路徑 <driveAndPath> 必須存在。

CREATE DATABASE IMOLTP_DB  
GO  
ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_fg CONTAINS MEMORY_OPTIMIZED_DATA  
ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_fg' , FILENAME = 'c:\data\IMOLTP_DB_fg') TO FILEGROUP IMOLTP_DB_fg;  
GO  

決定 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的最小值

判斷出記憶體最佳化資料表的記憶體需求之後,您必須決定所需數量佔可用記憶體的百分比,並將記憶體百分比設定為該值或更高。

範例︰
此範例假設您經過計算後,判斷出記憶體最佳化資料表和索引需要 16 GB 的記憶體。 假設您已獲認可使用 32 GB 的記憶體。

乍看之下,您似乎必須將 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 設定為 50 (16 等於 32 乘以 50%)。 不過,這樣並不會使您的記憶體最佳化資料表擁有足夠的記憶體。 看看下面表格 (記憶體最佳化資料表和索引可用的記憶體百分比) 我們得知假設有 32 GB 的認可記憶體時,只有 80% 可用於記憶體最佳化資料表和索引。 因此,最小和最大百分比要依據可用的記憶體來計算,而不是依據認可的記憶體。

memoryNeedeed = 16
memoryCommitted = 32
availablePercent = 0.8
memoryAvailable = memoryCommitted * availablePercent
percentNeeded = memoryNeeded / memoryAvailable

代入實際數字:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625

換言之,您至少需要 62.5% 的可用記憶體,才會符合記憶體最佳化資料表和索引的 16 GB 需求。 由於 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的值必須是整數,您就要將兩者設定為至少佔 63%。

建立資源集區和設定記憶體

設定記憶體最佳化資料表的記憶體時,應該依據 MIN_MEMORY_PERCENT 規劃容量,而不是依據 MAX_MEMORY_PERCENT。 如需 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的相關資訊,請參閱 ALTER RESOURCE POOL (Transact-SQL)。 這樣可以為記憶體最佳化資料提供更可預測的記憶體可用性,因為 MIN_MEMORY_PERCENT 會對其他資源集區造成記憶體壓力,以確保記憶體可被接受。 若要確保記憶體可用,並幫助避免記憶體不足狀況,MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的值應相同。 如需以認可記憶體數量為基礎,可用於記憶體最佳化資料表的記憶體百分比,請參閱以下的 可用記憶體最佳化資料表和索引的記憶體百分比

請參閱最佳做法:在 VM 環境使用記憶體內部 OLTP,以了解有關在 VM 環境下作業的詳細資訊。

下列 Transact-SQL 程式碼會建立名為 Pool_IMOLTP 的資源集區,而且一半的記憶體可供它使用。 建立集區之後,資源管理員會重新設定為包含 Pool_IMOLTP。

-- set MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value  
CREATE RESOURCE POOL Pool_IMOLTP   
  WITH   
    ( MIN_MEMORY_PERCENT = 63,   
    MAX_MEMORY_PERCENT = 63 );  
GO  
  
ALTER RESOURCE GOVERNOR RECONFIGURE;  
GO  

將資料庫繫結至集區

您可以使用系統函數 sp_xtp_bind_db_resource_pool ,將資料庫繫結至資源集區。 此函數會採用兩個參數:資料庫名稱和資源集區名稱。

下列 Transact-SQL 會定義 IMOLTP_DB 資料庫與 Pool_IMOLTP 資源集區的繫結。 在您讓資料庫重新上線之前,此繫結不會生效。

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

系統函數 sp_xtp_bind_db_resourece_pool 會採用兩個字串參數:database_name 和 pool_name。

確認繫結

確認繫結,並記下 IMOLTP_DB 的資源集區識別碼。 它不應該是 NULL。

SELECT d.database_id, d.name, d.resource_pool_id  
FROM sys.databases d  
GO  

使繫結生效

將資料庫繫結至資源集區之後,您必須讓資料庫離線再恢復上線,以使繫結生效。 如果您的資料庫先前已繫結至不同的集區,這樣做便會從先前的資源集區移除已配置的記憶體,而且記憶體最佳化資料表和索引的記憶體配置現在將由最近剛與資料庫繫結的新資源集區提供。

USE master  
GO  
  
ALTER DATABASE IMOLTP_DB SET OFFLINE  
GO  
ALTER DATABASE IMOLTP_DB SET ONLINE  
GO  
  
USE IMOLTP_DB  
GO  

此時,資料庫已繫結至資源集區。

變更現有集區上的 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT

如果您為伺服器另外再加入記憶體,或是您的記憶體最佳化資料表所需的記憶體數量已變更,可能就必須更改 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的值。 下列步驟將為您示範如何更改資源集區的 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 值。 請參閱下一節提供的指引,以得知 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 應該使用哪些值。 請參閱最佳做法:在 VM 環境使用記憶體內部 OLTP主題,以了解詳細資訊。

  1. 使用 ALTER RESOURCE POOL 變更 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的值。

  2. 使用 ALTER RESOURCE GOVERNOR ,以新的值重新設定資源管理員。

範例程式碼

ALTER RESOURCE POOL Pool_IMOLTP  
WITH  
     ( MIN_MEMORY_PERCENT = 70,  
       MAX_MEMORY_PERCENT = 70 )   
GO  
  
-- reconfigure the Resource Governor  
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

可用於記憶體最佳化資料表和索引的記憶體百分比

如果您將具有記憶體最佳化資料表的資料庫和 SQL Server 工作負載對應至相同的資源集區,資源管理員就會設定記憶體內部 OLTP 使用的內部閾值,避免集區的使用者在集區使用量上發生衝突。 一般而言,記憶體內部 OLTP 使用的閾值大約是集區的 80%。 下表顯示各種記憶體大小的實際臨界值。

您為記憶體內部 OLTP 資料庫建立專用資源集區時,在考量資料列版本和資料成長之後,需要估計記憶體中資料表所需的實體記憶體數量。 估計需要的記憶體之後,請建立資源集區,且其中有一定比例的認可目標記憶體可用於 SQL 執行個體,如 DMV sys.dm_os_sys_info 中的 'committed_target_kb' 資料行所反映。 例如,您可以建立資源集區 P1,其中有 40% 的總記憶體可供執行個體使用。 在這 40% 中,記憶體內部 OLTP 引擎會取得較小的比例來儲存記憶體內部 OLTP 資料。 這樣做可確保記憶體內部 OLTP 不會耗用此集區中的所有記憶體。 這個較小的百分比值取決於目標認可的記憶體。 下表描述在 OOM 錯誤引發之前,資源集區 (具名或預設) 中可供記憶體內部 OLTP 資料庫使用的記憶體。

目標認可的記憶體 記憶體中資料表可用的百分比
<= 8 GB 70%
<= 16 GB 75%
<= 32 GB 80%
<= 96 GB 85%
>96 GB 90%

例如,如果您的「目標認可的記憶體」為 100 GB,而您估計經記憶體最佳化的資料表和索引需要 60GB 的記憶體,則您可以建立一個 MAX_MEMORY_PERCENT = 67 的資源集區 (需要 60GB / 0.90 = 66.667GB - 四捨五入為 67GB;已安裝 67GB / 100GB = 67%),確保您的記憶體內部 OLTP 物件擁有所需的 60GB。

資料庫繫結至具名的資源集區後,請使用下列查詢查看跨不同資源集區的記憶體配置。

SELECT pool_id  
     , Name  
     , min_memory_percent  
     , max_memory_percent  
     , max_memory_kb/1024 AS max_memory_mb  
     , used_memory_kb/1024 AS used_memory_mb   
     , target_memory_kb/1024 AS target_memory_mb  
   FROM sys.dm_resource_governor_resource_pools  

此範例輸出表示,記憶體最佳化物件在資源集區 PoolIMOLTP 中取用的記憶體為 1356 MB,上限為 2307 MB。 此上限可控制對應至此集區的使用者和系統記憶體最佳化物件能夠取用的記憶體總數。

範例輸出
這個輸出來自前面所建立的資料庫和資料表。

pool_id     Name        min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb  
----------- ----------- ------------------ ------------------ ------------- -------------- ----------------   
1           internal    0                  100                3845          125            3845  
2           default     0                  100                3845          32             3845  
259         Pool_IMOLTP 0                  100                3845          1356           2307  

如需詳細資訊,請參閱 sys.dm_resource_governor_resource_pools (Transact-SQL)

如果您無法將資料庫繫結至具名資源集區,則資料庫會繫結至「預設」集區。 由於 SQL Server 在大多數其他配置中會使用預設資源集區,因此您將無法針對所需資料庫精確使用 DMV sys.dm_resource_governor_resource_pools 監視記憶體最佳化資料表所耗用的記憶體。

另請參閱

sys.sp_xtp_bind_db_resource_pool (Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool (Transact-SQL)
資源管理員
資源管理員資源集區
建立資源集區
變更資源集區設定
刪除資源集區