SE の雑記

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

SQL Server のファイル I/O サイズを確認してみる

leave a comment

SQL Server は操作の方法によってデータベースのファイルに対しての I/O のサイズが変わってきます。
今回の投稿ではその確認方法を書いてみたいと思います。
# 以前書いたような記憶があったのですが、見つからなかったので。

ファイルに対しての I/O サイズのパターンを確認する場合は、Sysinternals の Process Monitor を使用するよとよいかと思います。

Process Monitor ではファイルに対しての読み込みや書き込みが発生した場合の Length を確認することができます。

以下は DB を格納しているフォルダに対しての ReadFile と WriteFile の操作についてキャプチャした内容になります。
image

この操作を取得した際には、ディスクベースのテーブルに対して 10 件程度のレコードを INSERT しています。
ディスクベースのテーブルは WAL (先行ログ書き込み) で動作しますので、データを挿入してもバッファキャッシュに余裕があれば、データファイルへの書き込みはチェックポイント時に発生し、ディスクの I/O はログファイルだけで完結します。
今回の操作については、ログファイルには 4KB 単位での書き込みが行われたことが Detail の Length から確認することができます。
上記の操作は、暗黙のトランザクションでステートメント単位に COMMIT をしていた場合のログ書き込みになりますので、明示的なトランザクションを設定して、1,000 件程度データを挿入してみます。
この場合はある程度まとまったサイズをログファイルに書き込む動きになるようで、Length が高い値となっています。
image

メモリベースのテーブル (Hekaton : メモリ最適化テーブル) にデータを挿入した場合は以下のようになります。
# ネイティブコンパイルされたストアドプロシージャで挿入しています。
image

メモリベーステーブルではコミット時に論理ログをまとめて書き込む動作になっているはずですので、書き込みの操作の回数がディスクベースとは異なっていることが確認できます。
# サイズについても異なっているようですね。

メモリベーステーブルのチェックポイントファイルへの操作は以下のようになります。
大きめの I/O サイズで処理をするようになっているようですね。
image

今回は I/O サイズということで確認をしましたが、操作による I/O パターン (SQL Server で、どの操作をしたら、ディスクにどのような操作 (書き込み/読み込み) が行われるか) を確認する場合も Process Monitor は便利かと思います。
# SQL Server 以外でも、どのプロセスがどの資格情報を使用して、ファイルにアクセスをしに行ったかを確認するためにもちょいちょい使います。

Share

Written by Masayuki.Ozawa

2月 3rd, 2014 at 8:48 am

Posted in SQL Server

Tagged with

Leave a Reply