💾

今更聞けないDBMSのメモリ管理について

2024/04/28に公開

DBMSのメモリ管理について

データベース管理システム(DBMS)の設計では、大量のデータと複雑なクエリを処理するために、ハードウェアの特性を最大限引き出すことが求められます。

この記事では、DBMSがどのようにメモリを使ってデータアクセスの速度を向上させ、同時にデータの安全性を確保しているのかを解説します。

DBMSと記憶装置の関係について

DBMSが使う記憶装置は次の2つです。

HDD


HDDは磁気ディスクを使用してデータを記録・読み取りする記憶装置です。その主な特徴は大容量であり、コスト効率が良いことです。DBMSでは、データの永続的な保存にHDDが用いられます。これにより、システムがシャットダウンされた後もデータが保持され、必要に応じて再びアクセス可能となります。

しかし、HDDのデータアクセス速度はメモリに比べて遅いため、リアルタイム処理や高速なトランザクションが求められるアプリケーションには不向きです。

そのため、DBMSではデータの読み書きに時間がかかる問題を軽減するためにキャッシュを導入しています。データキャッシュにより頻繁にアクセスされるデータをメモリ上に一時的に保持し、ディスクへのアクセス回数を減らすことで全体のパフォーマンスを向上させています。

メモリ


メモリ(RAM)は、揮発性の記憶装置であり、データへのアクセス速度が非常に高いため、即時性が求められる処理に適しています。

DBMSはデータキャッシュ、ログバッファ、ワーキングメモリ領域としてメモリを利用し、クエリの処理速度を向上させるためにデータアクセスを最適化します。(後述参照)

メモリの主な利点は、その高速アクセスですが、コストが高く、電源がオフになるとデータが失われるという欠点もあります。このため、DBMSではメモリ内で処理されるデータを定期的にディスクに書き戻し、データの永続性を確保する必要があります。

ストレージとメモリの基本的な違いについてまとめると

HDDなどのストレージは大容量で低コストですが、アクセス速度はメモリに比べて遅いです。

一方、メモリはアクセスが高速であるものの、価格が高く、電源が切れるとデータが失われる揮発性があります。

ここには容量と永続性を取れば、速度が犠牲になり、速度を取れば容量と永続性が犠牲になるというトレードオフの関係が成立しています。

これらの特性を考慮し、DBMSはメモリとディスク(ストレージ)の両方を効果的に利用しているのです。

バッファ(キャッシュ)の役割について

DBMSはデータキャッシュログバッファの二つの主要なバッファをメモリ上に持っています。

これらを使い分けることでデータへの迅速なアクセスとシステムへの耐障害性を大幅に向上させています。

データキャッシュについて

データキャッシュは、ディスク上のデータの一部をメモリに保存することで、データベースへのクエリ応答を高速化します。キャッシュにデータが存在する場合、DBMSはディスクへのアクセスを避けて迅速に応答できます。

一方、キャッシュにないデータが要求された場合は、ディスクへのアクセスが必要となり、応答が遅くなります。

ログバッファについて

更新処理に関しては、DBMSは受け取った更新命令を直ちにディスクに書き込むのではなく、ログバッファに一時的に蓄積します。これにより、ディスクへのアクセスを抑え、一定のタイミングでまとめて書き込みを行うことで、パフォーマンスを向上させています。

また、コミットの際は、必ずディスクへの書き込みが発生するので遅延が発生する可能性があります。

トレードオフの関係

メモリからディスクへ同期処理をすればデータ整合性と耐障害性が高まりますが、パフォーマンスが低くなります。一方で、非同期処理にすればパフォーマンスは高くなりますが、データ整合性と耐障害性が犠牲になります。

また、データキャッシュとログバッファはメモリの使用量においても差があります。
多くのDBMSでは、データベースの操作が読み取り中心であることを前提として、データキャッシュにより多くのメモリを割り当てます。しかし、大量の更新を行うシステムでは、ログバッファのサイズを増やす調整が必要になります。ここには検索と更新をどちらを優先するかのトレードオフが存在します。

ワーキングメモリ領域

データキャッシュやログバッファ以外にも、DBMSは「ワーキングメモリ領域」を保持しています。この領域は、クエリの処理中にソートやハッシュ操作など特定の計算に利用され、処理完了後には解放されます。メモリ不足時はディスクを使用するため、swapのようなものと捉えられます。

ディスクが使われることを「TEMP落ち」と呼び、ディスクが使われるので低速になります。

参考

SQL実践入門

Discussion