ここまで Memory Optimized Table について数回書いてきました。
ここで一度 Memory Optimized Table のデータストレージの基本構成をまとめてみたいと思います。
Memory Optimized Table の構成を理解するためには以下のポイントを押させておく必要がありそうです。
- メモリ上のデータ構成
- チェックポイントファイルのデータ構成
■メモリ上のデータ構成
Memory Optimized Table はその名の通りメモリに最適化されたテーブルとなり、データの実体はメモリ上に格納されることになります。
メモリ上のデータの構成については Memory-Optimized Tables and Indexes に記載されています。
メモリ上のデータのインデックスについてはハッシュインデックスが使用されています。
ハッシュインデックスについては格納する領域をバケットとして定義する必要があり、1 バケットで 8 バイトのサイズが必要となります。
これはインデックス部分となりレコード部分に関しては以下のように管理がされています。
Memory Optimized Table のデータは行を基本として管理がされています。
行の先頭には行ヘッダー (Row Header) が付与されています。
行ヘッダーについてはホワイトペーパー (SQL Server In-Memory OLTP Internals Overview for CTP1) に詳細な情報が記載されています。
行ヘッダーではそのレコードの有効期間を示す開始と終了のタイムスタンプ (Begin Timestamp / End Timestamp) インデックスのポインターが付与されています。
# インデックスのポインターの数は設定しているハッシュインデックスの個数によって変わってきます。Memory Optimized Table では後からインデックスの付与をすることができないことはこの辺の行構造にも起因しているのかと。
StmtId は同一のステートメントで操作されたレコードを判断するために使用されれるものとなるようです。
Memory Optimized Table ではレコードの削除が行われた場合、レコード自体を削除するのではなく、終了をタイムスタンプを設定することでレコードを管理しています。
有効なレコードに関しては、終了のタイムスタンプが ∞ (Infinity) に設定されています。
データが削除されることで終了のタイムスタンプが更新され、そのレコードの有効期限が切れているという判断となります。
INSERT / DELETE / UPDATE については以下のように処理がされます。
- INSERT : 新規の行を挿入
- DELETE : 終了のタイムスタンプを設定しデータを有効期限切れとする
- UPDATE : 新規の行を挿入、更新前の行は終了のタイムスタンプを設定しデータを有効期限切れとする
# DELETE & INSERT をする
メモリサイズの試算については Microsoft SQL Server In-Memory OLTP Project "Hekaton": Management Deep Dive に以下のように紹介されています。
テーブルのデータは更新や削除によって同じ行レコードが複数世代存在することがありますので、単純にテーブルのサイズを確保するのではなく、レコードのメンテナンス分を考慮する必要があります。
古くなったデータに関してはガーベージコレクションによって回収がされ、領域が再利用されていくことになるようです。
■チェックポイントファイルのデータ構成
Memory Optimized Table は永続化をするかの設定 (DURABILITY ) をすることができます。
永続化をした場合にはチェックポイントファイルが使用され、サービスの再起動が行われた時などの復旧が行われます。
チェックポイントファイルの構成については Storage に記載がされています。
チェックポイントファイルについてはデータファイルと差分ファイル (Delta File) により構成がされており、データファイルと差分ファイルはペアとなるように管理がされています。
ファイルに格納されるデータについてはタイムスタンプの範囲に応じて管理がされており、データファイルには新規に INSERTされたレコードが格納され、差分ファイルにはそのデータファイル内の削除されたレコードの情報が格納されていくようです。
データファイルに関しては INSERT による新規行だけが格納されていき、差分ファイルには削除や更新により変更された行の最小限の情報のみ ({inserting_tx_id, row_id, deleting_tx_id } ) が格納されていきます。
このあたりの構成については Tech Ed の Microsoft SQL Server In-Memory OLTP Project "Hekaton": Management De
ep Dive にも記載されています。
チェックポイントファイルについては隣接するファイル同士でマージをすることでメンテナンスをすることができます。
チェックポイントファイルを使用して Memory Optimized Table の耐久性が担保されいるため、再起動時には差分ファイルをフィルターとしてデータを読み込むことでデータをメモリ上に再ロードが行われることになります。
この辺りの構成を把握しておくことが Memory Optimized Table を理解するための一歩となりそうですね。
いちからはじめる Memory Optimized Table その 1
いちからはじめる Memory Optimized Table その 2
いちからはじめる Memory Optimized Table その 3
いちからはじめる Memory Optimized Table その 4
いちからはじめる Memory Optimized Table その 5
いちからはじめる Memory Optimized Table その 6 ←今回の投稿