ディスク読み書きが不要であることが直接の理由ではないらしい、と目にしたので備忘録をまとめます。
はじめに
イノシシ本こと"データ指向アプリケーションデザイン"を読んでいて、インメモリDBが速い理由はディスク読み取りが原因ではない、という面白い記述を見つけました。
インメモリデータベースが速いのは普通にディスクよりメモリの方がI/Oが速いから、と思ってたのですが、もう少し深い事情があったようです。
備忘録のメモを残します。
インメモリデータベースが速いのは、ディスクにアクセスする必要がないから、ではなかったらしい.
— BioErrorLog (@bioerrorlog) April 23, 2023
「むしろメモリ内のデータ構造をディスクに書き込める形式にエンコードするというオーバーヘッドを回避できることによります」
データ指向アプリケーションデザイン よりhttps://t.co/BLhVc5CDkT
インメモリDBが速い理由
※引用はデータ指向アプリケーションデザインp95より
直感に反しますが、インメモリデータベースのパフォーマンス上のメリットは、ディスクから読み取りせずにすむことによるものではありません。 ディスクベースのストレージエンジンであっても、十分なメモリがあれば直近で使われたディスク上のブロックをオペレーティングシステムがメモリにキャッシュしてくれるので、ディスクから読み取りする必要が全くない場合もあります。
なるほど、ディスクベースの普通のDBであっても、メモリアクセスで完結することが多い、ということですね。 (そこにインメモリDBの速度上の優位性はない)
インメモリデータベースが高速なのは、むしろメモリ内のデータ構造をディスクに書き込める形式にエンコードするというオーバーヘッドを回避できることによります。
直接の原因はディスクアクセス/メモリアクセスの速度の違い、ではなく、それに伴うオーバーヘッドの問題である、ということのようです。
この記述の根拠として引用されている論文はこちらです:
OLTP Through the Looking Glass, and What We Found There
この論文では、データベースの処理の中でのボトルネックが調査/解析されています。
上の図のように、実際にクエリを処理する"useful work"は全体の1/60程度しか占めていません。
大半の処理はそれ以外のオーバヘッドに費やされており、インメモリDBではこのオーバーヘッドを回避できるため速い、ということのようです。
なるほど、勉強になりました。
おわりに
印象で物事の仕組みを捉えていると、このような誤解があるので注意したいところですね。
どなたかの参考になれば幸いです。
[関連記事]