オブジェクトの近さによる高性能実現

db4o2007-04-13

以前、「オブジェクトの*近さ*とパフォーマンス」というエントリーを書きましたが、NANDフラッシュメモリへの最適化と合わせたソリューションがタスクに上がっています。

  1. BTrees without Slot Indirections
  2. Store object slots on BTree pages

一つ目のほうは何かというと、現在の実装ではACID確保のために更新は新しいスロットへ書き込みに行っています。そしてコミットの最後の段階でポインターを入れ替えています。こうした方式では、更新していくにつれて、新しいスロット新しいスロットへと移動していくことになり、関連するオブジェクトの近さを維持することができませんでした。今の実装では空きスロットへ新オブジェクトは格納されるので、そもそも近さは維持できていないのですが、これによって2の機能実現が可能になります。

そこで二つ目のほうですが、BTree、おそらくB+Treeの方が好ましい、のリーフノードを、NANDでいうページ、オブジェクトを格納する単位にしようというものです。こうすることで、同じ時期に格納されたオブジェクトは物理的に近くに配置されるようになり、物理的なディスクアクセスを減らせるようになります。ノードのサイズの設定によって、どれだけのオブジェクトをまとめて入れるか設定できれば、最終的なパフォーマンスチューニングで威力を発揮すること請け合いです。ちなみにこのようにせっかく近くに配置されたものが、更新によってばらばらになってしまわないよう、1があります。

前のエントリーでも書いたように、ガベッジコレクタの分野では研究されてきたもので、データベースの分野にも適用したら大変面白く、強烈な性能追求が要求されるフィールドに進出できるのではと期待しています。