共用方式為


監視記憶體使用量並進行疑難解答

SQL Server In-Memory OLTP 會以與磁碟數據表不同的模式取用記憶體。 您可以使用針對記憶體和垃圾收集子系統提供的動態管理檢視表(DMV)或效能計數器,監視資料庫中記憶體優化的資料表和索引所配置和使用的記憶體數量。 這可讓您在系統和資料庫層級看到問題,並可讓您防止記憶體耗盡所造成的問題。

本主題涵蓋監視您的 In-Memory OLTP 記憶體使用量。

建立具有記憶體優化數據表的範例資料庫

如果您已經有具有記憶體優化數據表的資料庫,則可以略過本節。

下列步驟會建立一個資料庫,其中包含三個記憶體優化數據表,您可以在本主題的其餘部分使用。 在此範例中,我們已將資料庫對應至資源集區,以便控制記憶體優化數據表可取用多少記憶體。

  1. 啟動 SQL Server Management Studio。

  2. 按一下 [新增查詢]

  3. 將此程式代碼貼到新的查詢視窗中,然後執行每個區段。

    -- create a database to be used
    CREATE DATABASE IMOLTP_DB
    GO
    
    ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_xtp_fg CONTAINS MEMORY_OPTIMIZED_DATA
    ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_xtp' , FILENAME = 'C:\Data\IMOLTP_DB_xtp') TO FILEGROUP IMOLTP_DB_xtp_fg;
    GO
    
    USE IMOLTP_DB
    GO
    
    -- create the resoure pool
    CREATE RESOURCE POOL PoolIMOLTP WITH (MAX_MEMORY_PERCENT = 60);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    GO
    
    -- bind the database to a resource pool
    EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'PoolIMOLTP'
    
    -- you can query the binding using the catalog view as described here
    SELECT d.database_id
         , d.name
         , d.resource_pool_id
    FROM sys.databases d
    GO
    
    -- take database offline/online to finalize the binding to the resource pool
    USE master
    GO
    
    ALTER DATABASE IMOLTP_DB SET OFFLINE
    GO
    ALTER DATABASE IMOLTP_DB SET ONLINE
    GO
    
    -- create some tables
    USE IMOLTP_DB
    GO
    
    -- create table t1
    CREATE TABLE dbo.t1 (
           c1 int NOT NULL CONSTRAINT [pk_t1_c1] PRIMARY KEY NONCLUSTERED
         , c2 char(40) NOT NULL
         , c3 char(8000) NOT NULL
         ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
    GO
    
    -- load t1 150K rows
    DECLARE @i int = 0
    BEGIN TRAN
    WHILE (@i <= 150000)
       BEGIN
          INSERT t1 VALUES (@i, 'a', replicate ('b', 8000))
          SET @i += 1;
       END
    Commit
    GO
    
    -- Create another table, t2
    CREATE TABLE dbo.t2 (
           c1 int NOT NULL CONSTRAINT [pk_t2_c1] PRIMARY KEY NONCLUSTERED
         , c2 char(40) NOT NULL
         , c3 char(8000) NOT NULL
         ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
    GO
    
    -- Create another table, t3 
    CREATE TABLE dbo.t3 (
           c1 int NOT NULL CONSTRAINT [pk_t3_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 1000000)
         , c2 char(40) NOT NULL
         , c3 char(8000) NOT NULL
         ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
    GO
    

監視記憶體使用量

使用 SQL Server Management Studio

SQL Server 2014 隨附內建標準報告,以監視記憶體內部數據表所耗用的記憶體。 您可以使用 [物件總管] 來存取這些報表。 您也可以使用物件總管來監控個別記憶體最佳化資料表所使用的記憶體。

資料庫層級的取用

您可以監視資料庫層級的記憶體使用量,如下所示。

  1. 啟動 SQL Server Management Studio 並連接至伺服器。

  2. 在 [物件總管] 中,右鍵點選您想要報告的資料庫。

  3. 在上下文選單中,選取報表 ->標準報表 ->記憶體優化物件的記憶體使用量

HK_MM_SSMS

此報表顯示我們上面所建立之資料庫的記憶體耗用量。

HK_MM_SSMS

使用 DMV

有許多 DMV 可用來監視記憶體優化數據表、索引、系統物件和運行時間結構所耗用的記憶體。

記憶體最佳化表格及索引的記憶體使用量

您可以藉由查詢 sys.dm_db_xtp_table_memory_stats 來尋找所有用戶數據表、索引和系統物件的記憶體耗用量,如下所示。

SELECT object_name(object_id) AS Name
     , *
   FROM sys.dm_db_xtp_table_memory_stats

範例輸出

Name       object_id   memory_allocated_for_table_kb memory_used_by_table_kb memory_allocated_for_indexes_kb memory_used_by_indexes_kb
---------- ----------- ----------------------------- ----------------------- ------------------------------- -------------------------
t3         629577281   0                             0                       128                             0
t1         565577053   1372928                       1200008                 7872                            1942
t2         597577167   0                             0                       128                             0
NULL       -6          0                             0                       2                               2
NULL       -5          0                             0                       24                              24
NULL       -4          0                             0                       2                               2
NULL       -3          0                             0                       2                               2
NULL       -2          192                           25                      16                              16

如需詳細資訊,請參閱 sys.dm_db_xtp_table_memory_stats

內部系統結構的記憶體耗用量

系統物件也會取用記憶體,例如交易結構、用於數據和增量檔案的緩衝區、垃圾回收結構等等。 您可以藉由查詢 sys.dm_xtp_system_memory_consumers 來尋找這些系統物件所使用的記憶體,如下所示。

SELECT memory_consumer_desc
     , allocated_bytes/1024 AS allocated_bytes_kb
     , used_bytes/1024 AS used_bytes_kb
     , allocation_count
   FROM sys.dm_xtp_system_memory_consumers

範例輸出

memory_consumer_ desc allocated_bytes_kb   used_bytes_kb        allocation_count
------------------------- -------------------- -------------------- ----------------
VARHEAP                   0                    0                    0
VARHEAP                   384                  0                    0
DBG_GC_OUTSTANDING_T      64                   64                   910
ACTIVE_TX_MAP_LOOKAS      0                    0                    0
RECOVERY_TABLE_CACHE      0                    0                    0
RECENTLY_USED_ROWS_L      192                  192                  261
RANGE_CURSOR_LOOKSID      0                    0                    0
HASH_CURSOR_LOOKASID      128                  128                  455
SAVEPOINT_LOOKASIDE       0                    0                    0
PARTIAL_INSERT_SET_L      192                  192                  351
CONSTRAINT_SET_LOOKA      192                  192                  646
SAVEPOINT_SET_LOOKAS      0                    0                    0
WRITE_SET_LOOKASIDE       192                  192                  183
SCAN_SET_LOOKASIDE        64                   64                   31
READ_SET_LOOKASIDE        0                    0                    0
TRANSACTION_LOOKASID      448                  448                  156
PGPOOL:256K               768                  768                  3
PGPOOL: 64K               0                    0                    0
PGPOOL:  4K               0                    0                    0

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

存取記憶體優化數據表時,運行時間的記憶體耗用量

您可以使用下列查詢來判斷運行時間結構所耗用的記憶體,例如程式快取:執行此查詢以取得運行時間結構所使用的記憶體,例如程式快取。 所有運行時間結構都會以 XTP 標記。

SELECT memory_object_address
     , pages_in_bytes
     , bytes_used
     , type
   FROM sys.dm_os_memory_objects WHERE type LIKE '%xtp%'

範例輸出

memory_object_address pages_ in_bytes bytes_used type
--------------------- ------------------- ---------- ----
0x00000001F1EA8040    507904              NULL       MEMOBJ_XTPDB
0x00000001F1EAA040    68337664            NULL       MEMOBJ_XTPDB
0x00000001FD67A040    16384               NULL       MEMOBJ_XTPPROCCACHE
0x00000001FD68C040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD284040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD302040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD382040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD402040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD482040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD502040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD67E040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001F813C040    8192                NULL       MEMOBJ_XTPBLOCKALLOC
0x00000001F813E040    16842752            NULL       MEMOBJ_XTPBLOCKALLOC

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

實例上 In-Memory OLTP 引擎所耗用的記憶體

分配給 In-Memory OLTP 引擎和記憶體優化物件的記憶體,其管理方式與 SQL Server 實例中的任何其他記憶體使用者相同。 MEMORYCLERK_XTP 類型的 clerk 會計算分配給 In-Memory OLTP 引擎的所有記憶體。 使用下列查詢來尋找 In-Memory OLTP 引擎所使用的所有記憶體。

-- this DMV accounts for all memory used by the hek_2 engine
SELECT type
     , name
     , memory_node_id
     , pages_kb/1024 AS pages_MB 
   FROM sys.dm_os_memory_clerks WHERE type LIKE '%xtp%'

範例輸出顯示配置的總記憶體是 18 MB 的系統層級記憶體耗用量,以及配置給資料庫編號為 5 的 1358 MB。 由於此資料庫會對應至專用的資源集區,因此此記憶體會計入該資源集區中。

範例輸出

type                 name       memory_node_id pages_MB
-------------------- ---------- -------------- --------------------
MEMORYCLERK_XTP      Default    0              18
MEMORYCLERK_XTP      DB_ID_5    0              1358
MEMORYCLERK_XTP      Default    64             0

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

管理記憶體優化物件所消耗的記憶體

您可以將記憶體優化資料表所耗用的總記憶體系結至具名資源集區,如主題將資料庫與 Memory-Optimized 資料表系結至資源集區所述。

針對記憶體問題進行疑難解答

記憶體問題的疑難排解過程分成三個步驟:

  1. 識別資料庫或實例中物件所耗用多少記憶體。 您可以使用適用於記憶體優化數據表的豐富監視工具集,如先前所述。 例如 DMV sys.dm_db_xtp_table_memory_statssys.dm_os_memory_clerks

  2. 了解記憶體使用量的增長情況以及還剩多少空間餘裕。 藉由定期監視記憶體耗用量,您可以了解記憶體使用量的成長方式。 例如,如果您已將資料庫對應至具名資源集區,您可以監視性能計數器 Used Memory (KB) 以查看記憶體使用量的成長方式。

  3. 採取動作來減輕潛在的記憶體問題。 如需詳細資訊,請參閱 解決記憶體不足問題

另請參閱

將具有 Memory-Optimized 數據表的資料庫系結至現有集區上的資源集區變更MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT