第3回のCOMMITのところで,『トランザクションを確定するとき,なぜトランザクションログ・ファイルへの書き込みのみなのか。更新データをデータベース・ファイルへ書き込んだ方がよいのではないか』という疑問がありました。今回はこの疑問に対する回答を説明します。

 データベースの処理性能は,ディスク入出力の回数に依存することを以前の連載で説明しました(関連記事)。ディスク入出力はブロックという単位で行い,ディスク入出力の回数が少ないほど処理性能は高くなります。これは更新処理でも同じです。アプリケーションがトランザクションを確定するためにCOMMITを実行した際,できるだけディスク入出力を減らすことができれば,それだけ早くアプリケーションに終了を通知できるのです。

 では,データベース・ファイルへの書き込みとトランザクションログ・ファイルへの書き込みについて,具体的な例で説明しましょう。本連載で使用しているトランザクションの例は「2007年11月20日に顧客番号1001の日経太郎さんに商品番号3000の商品を500円で販売した」です。このトランザクションでは顧客テーブルを1件更新し,販売実績テーブルに1件レコードを挿入する必要があります。ここで,顧客テーブルと販売実績テーブルのデータベース・ファイルがディスク上どのように配置されているかを考えます。

 データベース・ファイルの構造はRDBMSによって異なります。テーブル単位にファイルを作成するものもあれば,一つの大きなファイル内にいくつものテーブル・データを格納する方式のものもあります。使用するRDBMSがテーブル単位にファイルを作成するものであれば,顧客テーブルと販売実績テーブルのデータは間違いなく別々のブロックに格納されているはずです。もしRDBMSが一つのファイル内に複数のテーブル・データを格納する方式であっても,顧客テーブルと販売実績テーブルのデータが同一のブロック内に格納されている可能性は極めて少ないと思います。

 つまり,先述した一つのトランザクションを確定するには,最低2ブロックへの書き込みが必要になるということです。一般に,トランザクション内で実行する更新処理の量が多くなればなるほど,メモリー・バッファ内の多くのブロックが更新され,ディスクに書き込む対象となるブロック数がどんどん多くなります(図1)。

図1●データベース・ファイルのブロックの配置
図1●データベース・ファイルのブロックの配置

 一方のトランザクションログ・ファイルは,テーブル単位に作られるものではなく,複数テーブルで共通したファイルです。実際は複数のファイルに分かれていることも多いと思いますが,あるログ・データを書き込む際には,特定の一つのファイルに書き込むだけで良いようになっています。

 トランザクション内で異なるテーブルを更新しても,トランザクションログ・ファイルにとってそのログ・データは一連のものであり,連続した領域に書き込めばいいわけです。また,更新したテーブル・データと比べ,そのログ・データのサイズはたいていの場合小さくなります。

 つまり,更新されたテーブル・データをデータベース・ファイルに書き込む際のブロック数より,ログ・データをトランザクションログ・ファイルに書き込む際のブロック数の方が少なくて済むのです。

 トランザクションを保証するという点では,データベース・ファイルを更新するかトランザクションログ・ファイルを更新するかのどちらかをすればよいわけで,ならば,ディスク入出力数の少ないトランザクションログ・ファイルへの書き込みの方が性能面でよいということになります。

 また,トランザクションログ・ファイルへのブロックの書き込みは,データベース・ファイルのそれより高速に行われます。それを理解するには,ディスクの仕組みを知らなければなりません。ディスクにはヘッドと呼ぶ部分があり,ブロック内のデータを読み込んだりブロック内へデータを書き込んだりするには,このヘッドが対象のブロック上に移動する必要があります。

 このヘッドの移動時間はCPUがメモリー内のデータを読み書きする時間に比較して非常に遅いのです。ですから,ディスクへの書き込みにかかる時間は,対象となるブロック数だけでなく,ヘッドの移動時間にも大きく影響します。

 トランザクションログ・ファイルは次々と情報を書き加えていけばいいファイルなので,一連の更新処理のログ・データを書き込む際のヘッドの移動時間は短くなります(図2)。対してデータベース・ファイルへの書き込みは,更新SQL文によって異なりますが,ディスクにとって連続したデータとして扱うことはできないでしょう。別々のブロックに書き込む必要があれば,そのたびにヘッドは移動し,書き込み処理に時間がかかります。

図2●トランザクションログファイルの構造
図2●トランザクションログファイルの構造

 ヘッドの動きまで考えた場合,トランザクションログ・ファイルは専用のディスクに配置した方がよいということが分かるでしょう。これは,一般に『トランザクションログ・ファイルはデータベース・ファイルとは別のディスクに配置しなさい』と同じことを指しています。


藤塚 勤也(ふじづか きんや)
NTTデータ 基盤システム事業本部
オープンソース開発センタ 技術開発担当
シニアスペシャリスト
 沖電気工業,タンデムコンピューターズ(現日本HP)を経て,2003年より株式会社 NTTデータに勤務。現在は,オープンソース・ソフトウエアを活用したエンタープライズ・システム向けの技術開発・技術支援に従事しており,特にシステムの中核であるRDBMSに注力している。「RDBMS解剖学」(翔泳社)を共著