1. ホーム
  2. データベース
  3. エスキューエルライト

SQLiteのWAL機構を詳しく紹介

2022-01-19 21:03:55

I. WALとは何ですか?

WAL の正式名称は Write Ahead Logging で、多くのデータベースでアトミックトランザクションを実装するために使われている機構で、SQLite ではバージョン 3.7.0 から導入されました。

II. WALはどのように機能するのか?

WAL機構が導入される以前は、SQLiteはアトミックトランザクションを実装するためにロールバックジャーナル機構を使用していました。

ロールバックジャーナル機構は、データベースファイルに変更を書き込む前に、変更が行われたページングのデータを別の場所にバックアップし、トランザクションが失敗した場合はバックアップデータをコピーバックして変更を取り消し、トランザクションが成功した場合はバックアップデータを削除して変更をコミットすることで機能します。

WALの仕組みの原理は、変更をデータベースファイルに直接書き込まず、WALと呼ばれる別のファイルに書き込むこと、トランザクションが失敗した場合はWALのレコードを無視して変更を取り消し、トランザクションが成功した場合はその後のタイミングでデータベースファイルに書き戻し、変更をコミットすることである。

WAL ファイルとデータベースファイルを同期させる行為をチェックポイントと呼び、SQLite ではデフォルトで、WAL ファイルに 1000 ページの変更が蓄積されると自動的に実行されます。もちろん、適切な場合には、チェックポイントは手動で実行でき、SQLite はそのためのインターフェイスを提供します。チェックポイントが実行された後、WAL ファイルはクリアされます。

読み込み時に、SQLite は WAL ファイルを検索し、最後の書き込みポイントを見つけ、それを記憶し、それ以降の書き込みを無視します(これにより、読み込みと書き込みと読み込みを並行して実行することができます)。次に、データを読み込みたいページが WAL ファイルにあるかどうかを判断し、ある場合は WAL ファイルのデータを読み、ない場合はデータベースファイルから直接データを読み込みます。

書き込みに関しては、SQLiteは単純にWALファイルに書き込むだけですが、排他的書き込みを保証しなければならないので、書き込みと書き込みを並列に実行することはできません。

WALは、その実装に共有メモリ技術を使用しているため、すべての読み取りと書き込みのプロセスが同じマシン上になければならず、そうでなければデータの一貫性を保証することはできません。

III. WALのメリット・デメリット

長所

1. リードとライトは互いにブロックすることなく完全に同時実行できる(ただし、ライトはまだ互いに同時実行できない)。
2. WALはほとんどの場合、パフォーマンスが向上します(書き込みのたびに2つのファイルを書き込む必要がないため)。
3. ディスクI/Oの動作がより予測しやすくなる。

デメリット

1. データベースにアクセスするすべてのプログラムは、同じホスト上にあり、共有メモリ技術をサポートしている必要があります。
2. 2. 各データベースは、<yourdb>.db, <yourdb>-wal, <yourdb>-shm の3つのファイルに対応するようになりました。
3. GBレベルまでデータを書き込むと、データベースのパフォーマンスが低下します。
4. 3.7.0 以前の SQLite は、WAL メカニズムを有効にしたデータベースファイルを認識しません。

IV. WALがもたらす互換性の問題

WALを有効にすると、データベースファイル形式のバージョン番号が1から2にアップグレードされるため、3.7.0以前のSQLiteでは、WAL機構が有効なデータベースファイルを認識することができません。

WALを無効にすると、データベースファイル形式のバージョン番号が1に戻り、3.7.0より前のバージョンのSQLiteで認識できるようになります。

V. WALがもたらすパフォーマンスの問題

一般に、WAL は SQLite トランザクションのパフォーマンスを向上させますが、極端な例では SQLite トランザクションのパフォーマンスを低下させることがあります。

1. トランザクションの実行に時間がかかったり、変更するデータ量がGBレベルになると、WALファイルが占有され、一時的にチェックポイントの実行ができなくなる(チェックポイントでWALファイルが空になる)ため、WALファイルが非常に大きくなり、アドレス時間が増加し、最終的にリード・ライト性能の劣化につながる。
2. チェックポイントが実行されると、その時の読み込み・書き込み性能が低下するため、WALによって周期的な性能低下が発生する可能性があります。

VI. PRAGMAとWALに関連するインターフェース

コピーコード コードは以下の通りです。

PRAGMA journal_mode
PRAGMA wal_checkpoint
PRAGMA wal_autocheckpoint
sqlite3_wal_checkpoint
sqlite3_wal_autocheckpoint
sqlite3_wal_hook