SE の雑記

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

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

leave a comment

前回は基本的な構成について確認してみました。
今回はログファイルについてみていきたいと思います。

Memory Optimized Table もトランザクションログを書き出し、ログファイルに関しては通常のログファイル (ldf) を使用します。

image

通常のテーブルの動作としては WAL (Write Ahead Log : 先行ログ書き込み) が行われ、操作ログが最初にログファイルに書き込みが行われます。

以下のようなテーブルを作成してみます。

CREATE TABLE DataTable
(
    Col1 int NOT NULL,
    Col2 nchar(450) NOT NULL,
    Col3 int,
   CONSTRAINT PK_DataTable PRIMARY KEY CLUSTERED  (Col1)
)
GO

 

このテーブルにデータを挿入してトランザクションログの状態を確認してみたいと思います。

SET NOCOUNT ON
GO
BEGIN TRAN
DECLARE @i int = 1
WHILE (@i <= 10)
BEGIN
    INSERT INTO DataTable VALUES(@i, NEWID(), @i)
    SET @i += 1
END

 

トランザクションを開始していますが、COMMIT はしていない状態です。
この状態のレコードに関してはロールバックにより破棄される可能性があることになります。
それではこの操作をした場合のトランザクションログの状態を sys.fn_dblog から確認してみます。
image

通常のテーブルではトランザクション中の操作もトランザクションログに書き込みが行われます。

次に以下のような Memory Optimized Table を作成してみます。

CREATE TABLE MemTable
(
    Col1 int NOT NULL,
    Col2 nchar(450) COLLATE Japanese_XJIS_100_BIN2 NOT NULL INDEX NCIX_MemTable_col2 HASH (Col2) WITH (BUCKET_COUNT = 1024),
    Col3 int,

   CONSTRAINT PK_MemTable PRIMARY KEY NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 1024)
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
GO

このテーブルに対して先ほどと同じようにデータを挿入してみます。

SET NOCOUNT ON
GO
BEGIN TRAN
DECLARE @i int = 1
WHILE (@i <= 100)
BEGIN
    INSERT INTO MemTable VALUES(@i, NEWID(), @i)
    SET @i += 1
END

この状態で確認したトランザクションログがこちらです。
以下のトランザクションログはログレコードの末尾付近の情報となるのですが INSERT に関してのログレコードが記録されていません。
image

sys.fn_dblog_xtp という関数が SQL Server 2014 で追加されているのでこちらでも確認してみます。
こちらでも INSERT のログは確認できませんね。
image

それではトランザクションを確定するための COMMIT をしてみます。
コミットをしたタイミングで Memory Optimized Table に対しての操作が LOP_HK として記録されていきます。
Memory Optimized Table ではコミット時にログに記録がされます。 

コミットをしたタイミングでログファイル / チェックポイントファイルへの書き込みも発生するようです。
実際にはログファイルに書き込みが終われば復旧できる状態は整うため、チェックポイントファイルへの書き込みはバックグラウンドのオフラインチェックポイント処理で操作されているようですね。
Memory Optimized Table 用に XTP_LOG_FLUSH_THREAD / XTP_LOG_COMPLETION / XTP_CKPT_AGENT / XTP_THREAD_POOL / XTP_OFFLINE_CKPT というようなバックグラウンドプロセスが動作していますので、このあたりでチェックポイントファイルへの書き込みも行われていそうですね。

ショートトランザクションの処理であればそれほど気にしないでよいかもしれませんがトランザクションが長い場合にはコミット時のディスク I/O の集中と処理時間については意識しておいたほうがよさそうですね。
ロールバックの際はメモリ上のデータを破棄すればよいだけになるので、WAL を使用していないことの処理性能はこの辺に現れてきそうですね。

この際には、ログレコードをグループ化して、書き込んでいるようで単純な行単位のレコード記録ではないようです。
# LOP_FS_DOWNLEVEL_OP などもストリームデータの書き込みですので Memory Optimized Table の操作になります。
image

上記の画像は sys.fn_dblog のものですので sys.fn_dblog_xtp でも情報を確認してみます。
こちらでも操作がされたことが確認できますね。
Memory Optimized Table についてのログはこちらのほうがレコード数が多いため、確認はこの関数から行ったほうがよさそうです。
image

トランザクションログの書き込みについても今までの動作とは少し異なってきますのでこの辺もしっかり意識しておきたいですね。


いちからはじめる Memory Optimized Table その 1
いちからはじめる Memory Optimized Table その 2 ←今回の投稿
いちからはじめる Memory Optimized Table その 3

Written by masayuki.ozawa

7月 10th, 2013 at 9:49 am

Posted in SQL Server

Tagged with ,

Leave a Reply

*