メインメモリデータベースの設計/MMDB概観
第3章:メインメモリデータベースシステムの紹介
[編集]目次 — Previous: DBMS入門 — Next: ストレージエンジン
3.1 概要
[編集]テレコム、プロセス制御、航空予約、株式市場など、多くのアプリケーションはリアルタイムのデータアクセスを必要としています。これらのアプリケーションはデータの一貫性を維持するだけでなく、データベースにアクセスするトランザクションに対して迅速な応答も求められます。大容量で安価なメモリが入手可能になったことで、メインメモリデータベースはディスクベースのデータベースシステムよりも優れたパフォーマンスと一貫したスループットを提供できるようになりました。データが永続的にメインメモリに存在するため、スループットに影響を与えるディスクI/Oが発生しません。実際、ディスクベースのシステムではスループットの標準偏差が大きく、リアルタイムアプリケーションはその予測不可能なスループットに対してベンチマークを行うことができませんでした。これが、メインメモリデータベース(MMDB)システムと呼ばれる新しいタイプのデータベース管理システムの開発につながりました。また、「インメモリデータベース(IMDB)管理システム」や「リアルタイムデータベース(RTDB)管理システム」とも呼ばれます。
このタイプのデータベース管理システムでは基本的な前提が変わったため、従来のディスクベースの管理システムのストレージ、リレーショナル、およびSQLエンジンの各コンポーネントの研究と設計が必要となりました。
ディスクブロックの転送には約5ミリ秒かかりますが、メインメモリアクセスには100ナノ秒しかかかりません。データベース全体をメモリに保持することで、これらのディスクI/Oがメモリアクセスに変換され、スループットが何倍にも向上します。これにより、「ディスクベースのシステムで全データがバッファプールにキャッシュされていれば、MMDBと同じくらいのパフォーマンスを発揮するのか?」という興味深い質問が生まれますが、残念ながら答えは「いいえ」です。これは、データ構造とアクセスアルゴリズムがディスクベースシステム用に設計されており、データベース全体が完全にメモリにある場合にはうまく機能しないためです。
メインメモリデータベースに関する一般的な誤解には次のようなものがあります。
- 耐久性のあるトランザクションをサポートしていますか?
- はい。データベース全体がメインメモリにあっても、クラッシュ時の復旧を可能にするためにバックアップコピーがディスクに保持されます。
- 複数のユーザーが同時にデータベースにアクセスできますか?
- はい。複数のユーザーと複数のスレッドがデータベースにアクセスでき、ラッチやロックを通じて同期されます。
メインメモリにデータが存在することは、以下に重要な影響を与えます:
- データ表現
- データアクセスアルゴリズム(クエリ処理)
- リカバリ
- 並行制御
この本では、DRDBとMMDBの実装の違いと、MMDBがDRDBよりも何倍も高速である理由について詳細に説明します。
図4は、メインメモリデータベース管理システムを示しています。これはディスク常駐データベース管理システムに存在するほぼすべてのコンポーネントを持っています。SQLエンジン、リレーショナルエンジン、ストレージエンジンの各コンポーネントの実装は、DRDBのコンポーネントとは大きく異なります。
図4: MMDBシステムアーキテクチャ
MMDBの場合、データベースに対応する物理的実体は共有メモリセグメントまたはメモリマップファイルです。これらのプロセス間通信(IPC)メカニズムは、プロセス間でのメモリの共有を可能にします。一部のJAVA組み込み型メインメモリデータベースは、マルチスレッドアクセスのみを必要とします。これらのDBMSはヒープメモリをデータベースとして使用します。マルチプロセスアクセスの場合は、共有メモリIPCまたはメモリマップIPCメカニズムを使用する必要があります。通常、制御情報はデータレコードとは別に保存され、制御情報のデータ破損を回避します。
3.2 メモリセグメント
[編集]メモリは主に三つのセグメントに分けられます。
- 制御セグメント: ロックテーブル、プロセステーブル、トランザクションテーブル、アンドゥログ、リドゥログを含みます。これらの構造は一時的であり、データベース管理システムの運用に必要です。
- カタログセグメント: テーブル、インデックス、フィールドなどのメタデータを含みます。
- ユーザーセグメント: すべてのテーブルのレコードと、ある場合はそれらのテーブルのインデックスレコードを含みます。
3.3 SQLエンジン
[編集]MMDBの場合、SQL文の最適化と実行は大きく変わります。コストベースの最適化は、主にCPUサイクルよりもディスクI/Oの数に基づいています。これらのコストベースの最適化は、DBMS全体で最も複雑なシステムです。DRDBの場合、コストベースとルールベースの両方の最適化が使用されますが、MMDBの場合はルールベースの最適化で十分です。
3.4 リレーショナルエンジン
[編集]すべてのリレーショナル操作アルゴリズムが変わります。2パスアルゴリズムを使用する必要がなくなるためです。さらに、DRDBの場合、最初のパスでディスクからメモリにすべてのフィールドのデータをコピーしますが、MMDBの場合、ポインタ間接参照を使用してデータコピーとディスクI/Oを回避します。
MMDBでは、Tツリーインデックス構造が、DRDBのBツリーよりもスペースとCPUサイクルに優れています。
3.5 トランザクションエンジン
[編集]MMDBトランザクションはディスクI/Oを待たなくなるため、多くの競合問題やデッドロックが発生し、スループットが低下します。これを避けることが重要であり、DRDBよりもMMDBにおいて重要です。
3.6 ストレージエンジン
[編集]DRDBでは、ディスクブロックに基づいてアロケーションが行われますが、MMDBではメモリで行われる必要があります。これにより、空間とCPUサイクルを節約するための多くの最適化が必要となります。DRDBの場合、データベースモジュールはファイルマネージャーモジュールと連携しますが、MMDBの場合はOSのIPC抽象化レイヤーと連携します。