Bツリーの目標は、ディスクアクセスの数を最小限に抑えることです。ファイルシステムのクラスターサイズが4kの場合、ノードの理想的なサイズは4kです。また、ノードは適切に配置されている必要があります。ノードの位置がずれていると、2つのクラスターが読み取られ、パフォーマンスが低下します。
ログベースのストレージスキームでは、アライメントを改善するためにログにギャップが作成されない限り、4kノードサイズを選択することはおそらく最悪の選択です。それ以外の場合、99.98%の時間で1つのノードが2つのクラスターに格納されます。ノードサイズが2kの場合、これが発生する確率は50%弱です。ただし、ノードサイズが小さい場合は問題があります。つまり、bツリーの平均の高さが高くなり、ディスククラスターの読み取りに費やされる時間が十分に活用されません。
ノードサイズを大きくするとツリーの高さが低くなりますが、ディスクアクセスの数も増えます。ノードが大きくなると、ノード内のエントリを維持するためのオーバーヘッドも増加します。ノードサイズがデータベース全体をカプセル化するのに十分な大きさのBツリーを想像してみてください。ノード自体、おそらく別のBツリー内に、より良いデータ構造を埋め込む必要がありますか?
私は、追加のみのログ形式でb-tree実装のプロトタイプを作成することに時間を費やし、最終的にはその概念を完全に拒否しました。ノード/クラスターの不整合によるパフォーマンスの低下を補うために、非常に大きなキャッシュが必要です。従来のストレージアプローチでは、RAMをより有効に活用できます。
最後の打撃は、ランダムに並べられたインサートのパフォーマンスを評価したときでした。これにより、ディスクでバックアップされたストレージシステムのパフォーマンスが低下しますが、ログベースの形式ではさらに多くの問題が発生します。最小のエントリでも書き込むと、複数のノードがログに書き込まれ、内部ノードは書き込まれた直後に無効になります。その結果、ログは急速にゴミでいっぱいになります。
BerkeleyDB-JE(BDB-JE)もログベースであり、そのパフォーマンス特性も調べました。それは私のプロトタイプがしたのと同じ問題、つまりゴミの急速な蓄積に苦しんでいます。BDB-JEには、残っているレコードをログに再追加する「よりクリーンな」スレッドがいくつかありますが、ランダムな順序は保持されます。その結果、新しい「クリーンな」レコードは、ゴミでいっぱいのログファイルをすでに作成しています。システムの全体的なパフォーマンスが低下し、実行されているのはよりクリーンなものだけになり、すべてのシステムリソースが占有されます。
ログベースの形式は、堅牢なデータベースをすばやく実装できるため、非常に魅力的です。アキレス腱はクリーナーであり、重要です。キャッシング戦略も正しく行うのが難しいです。