SQL Server 2014 の In Memory OLTP (メモリ最適化テーブル : Hekaton) ですが、メモリ管理が従来のテーブルとは変わってきます。
In Memory OLTP のメモリ使用量を確認するための情報をメモとして。
CTP2 ベースの内容ですので、RTM 時には変わっているかもしれませんが。
技術文書としてまとまっているのは、How to: Monitor and Troubleshoot Memory Usage でしょうか。
従来までのディスクベーステーブルのテーブルサイズを確認するためには、sys.dm_db_partition_stats を使うことがあるかと思います。
私の場合は以下のようなクエリを使っています。
SELECT so.name , si.name , sdp.row_count , sdp.used_page_count , sdp.used_page_count * 8 AS PageKB FROM sys.objects so LEFT JOIN sys.dm_db_partition_stats sdp ON sdp.object_id = so.object_id LEFT JOIN sys.indexes si ON si.object_id = sdp.object_id AND si.index_id = sdp.index_id WHERE so.type = 'U' ORDER BY so.Name
このクエリの実行結果がいかになります。
すべてのテーブルに同じ件数のデータを格納しているのですが、In Memory OLTP のテーブルについては、件数を取得することができません。
また、sys.dm_os_buffer_descriptors でメモリの使用量をバッファプールから確認をした場合も同様で、In Memory OLTP のテーブルについてはカウントされていません。
SELECT CASE [database_id] WHEN 32767 THEN 'ResourceDb' ELSE DB_NAME([database_id]) END AS [Database_name], [page_type], count(*) AS [Page Count], count(*) * 8.0 AS [Page Size (KB)] FROM [sys].[dm_os_buffer_descriptors] WITH (NOLOCK) WHERE database_id = DB_ID() GROUP BY DB_NAME([database_id]), [database_id], [page_type] ORDER BY [database_id] ASC
これはパフォーマンスモニターのカウンターでも同様となり、SQL Server:Memory ManagerDatabase Cache Memory (KB) / SQLServer:Buffer ManagerDatabase pages でも In Memory OLTP のテーブルのメモリ消費量は確認をすることができません。
In Memory OLTP ですがラッチフリーモデルを採用しており、メモリについてもバッファプールが使用されていません。
In Memory OLTP のメモリ使用量ですが以下のクエリで確認をすることができます。
-- DB 単位で確認 SELECT name, xtms.* FROM sys.dm_db_xtp_table_memory_stats xtms LEFT JOIN sys.objects so ON so.object_id = xtms.object_id -- DB 単位でメモリが管理されている SELECT * FROM sys.dm_os_memory_clerks WHERE type LIKE '%XTP%'
sys.dm_xtp_system_memory_consumers ではテーブル単位でメモリの使用量を確認することができます。
また、sys.dm_os_memory_clerks からも確認をすることができます。
In Memory OLTP 向けのメモリークラークは MEMORYCLERK_XTP となり、これはデータベース単位で管理がされています。
以下でもメモリの状態を確認できます。
# DBCC MEMORYSTATUS でも XTP は確認できます。
SELECT * FROM sys.dm_os_memory_objects WHERE type LIKE '%xtp%'
In Memory OLTP 用のパフォーマンスモニターのカウンターについても XTP 系のカウンターから取得できます。
SELECT * FROM sys.dm_os_performance_counters WHERE object_name LIKE '%XTP%'
パフォーマンスモニターのカウンターについては処理系のカウンターが多いようでメモリ系に関してはあまり見れなさそうでした。
In Memory OLTP の性能評価をする際に見ないといけない項目の整理はこれからしていかないといけないなと。