SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

いちからはじめる Memory Optimized Table その 8

leave a comment

Memory Optimized Table は全データをメモリ上で処理することを前提として使用することになります。
チェックポイントファイルでサポートされる最大のサイズは 512GB 、メモリのデータに関しては 256GB となりそれ以上のサイズはサポートされていないようです。
Hardware Considerations for In-Memory OLTP in SQL Server 2014
# これ以上のサイズはデータベースをわける等で対応できるかもしれませんが。

Memory Optimized Table はテーブルで使用されるメモリのサイズには十分に気を付ける必要があります。

Memory Optimized Table は列ストアインデックス (Column store Index) のような列単位での圧縮はされていませんが、Estimating Memory Requirements When Migrating To Memory-Optimized Tables に記載されているような固定長文字列 (char / nchar) の末尾の空白省略 (スペース除去) の圧縮が行われます。

A memory-optimized table does not store trailing blanks. This is like ROW compression CHAR columns.

データをメモリ上に確保しておける余裕がなくなると以下のようなエラーになります。

Msg 701, Level 17, State 123, Line 9
There is insufficient system memory in resource pool ‘default’ to run this query.

今回は Max Server Memory を 4,096 MB に設定しているのですがこの場合は、3.6 GB 程度までは Memory Optimized Table にデータを格納することができましたが、それ以上のデータを格納しようとすると上記のエラーとなり、default のリソースプールが枯渇したことにより SQL Server へのクエリ実行が不安定になりました。

Memory Optimized Table については DURABILITY を SCHEMA_AND_DATA に設定している場合、SQL Server が起動したタイミングで Memory Optimized Table のデータロードが行われますので、サービスを再起動しても格納したデータに応じたメモリが消費されることになります。
そのため、サービス再起動後にデータベースの復旧が終わってもリソースプールのメモリ枯渇が再発する可能性があります。

この場合、専用管理者接続 (DAC) を使用して接続を行い、該当のテーブルのデータを削除するか Max Server Memory を増やす (sp_configure ‘max server memory (MB)’, 2147483647) 必要が出てきます。

下のスライドは Microsoft SQL Server In-Memory OLTP Project “Hekaton”: Management Deep Dive のスライドなのですが、CTP1 の後のバージョンでは Memory Optimized Table とリソースガバナーの統合が予定されているようです。
# SQL Server 2014 は CTP2 が出るようですので、CTP2 で実装されてくるのかもしれないですね。
メモリが不足しても安定して稼働するようにハードリミットとして 80% の制限がかかるようになるようです。

image

現在のバージョンではMax Server Memory の値を下げて、Memory Optimized Table のデータがメモリ上にフィットしなくなった場合も同様の状況になってきます。

Memory Optimized Table では UPDATE をした場合には、

  • 既存データの有効期限を終了
  • 新規にデータを INSERT

というような動作を行います。

そのため全件更新が行われる場合などはテーブルのサイズが 2 倍になる可能性があります。
この点も考慮したうえでメモリサイズを検討する必要が出てきます。

Native コンパイルされたストアドプロシージャーでも大量のデータ挿入 / 更新を行う場合にもメモリにフィットするかは重要になってきます。
メモリが不足した場合は以下のようにエラーとなります。
# Native コンパイルされたストアドプロシージャのエラーメッセージは日本語にしています。

image

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
いちからはじめる Memory Optimized Table その 7
いちからはじめる Memory Optimized Table その 8 ←今回の投稿

Written by masayuki.ozawa

7月 28th, 2013 at 10:53 pm

Posted in SQL Server

Tagged with

Leave a Reply

*