前章ではSQL ServerがCPUを効率的に使用するために内部に保持しているSQLOSスケジューラについて紹介しました。この章ではSQLOSスケジューラに管理される側の動作の1つであるデータファイルやトランザクションログファイルといった物理ファイルへのディスクI/O(入出力)操作について詳しく見ていきます。SQL Serverが管理するデータベースと物理ファイルの関連から始めて、I/Oを行う内部コンポーネント、アクセスに使用しているAPI、さらにモニタリング(監視)方法まで紹介します。SQL Serverが実行するI/O操作を、前章と同様に論理的かつ物理的な視点からとらえます。
2.1 SQL Serverが管理するデータベースの実体
ユーザーアプリケーションが比較的大きな量のデータを長期的に保持する必要がある場合には、どのような手段をとるのが現実的でしょうか。おそらくほとんどの場合 は、ファイルを作成して保存する必要があるデータを、ディスクなどの記憶メディアに書き出すという手段が選ばれるように思います。SQL Serverも例外ではありません。SQL Serverは長期的に膨大なデータを保存管理するデータベース管理システムです。またSQL Serverは、Windowsというオペレーティングシステムの観点から見た場合、ほとんどすべての点において一般的なユーザーアプリケーションと変わりありません。
それでは、データベースの実体とはいったいどのようなものでしょうか。それは、Windowsが管理するフォルダに作成されたファイルです(エクスプローラーにも、ごく普通のファイルとして表示されます)。データベースは、データファイルとトランザクションログファイルという2種類の物理ファイルで構成されています(本書では、この2つのファイルを総称してデータベースファイルと言います)。データベースを配置したフォルダにはデータファイル(拡張子が.mdfや.ndf)とトランザクションログファイル(拡張子が.ldf)が格納されます(図2.1)。ここからは、それぞれのファイルについて少し詳しく見ていきましょう。
2.1.1 データファイル(拡張子.mdf、.ndf)
ユーザーが参照/挿入/更新/削除を行うデータ本体が格納されています。SQL Serverはデータファイルの中を8KBのブロックに分割して使用しています。分割した8KBのブロックは、ページという論理的な単位として管理されます。またページは、SQL Serverが物理ディスクから読み込んだデータを処理する際に、あるいは物理ディスクへデータを書き込む際の最小の論理的な単位でもあります(図2.2)。
1つのデータベースに対して、1つのデータファイルを指定することも、複数のデータファイルを割り当てることもできます。一般的に複数のスピンドル[※1]を持つディスク装置にデータベースを配置する場合は、データファイルを複数に分割したほうが物理アクセスの速度が向上します(図2.3)。
[※1]ここでのスピンドルとは、回転軸を保持するディスク装置を意味します。ディスクが複数のスピンドルを保持す る場合、それぞれが独自にアクセスを行うことができます。そのため、単一のスピンドルしか保持しないディスクと比較すると、一般的にI/O速度が速くなります。