web-dev-qa-db-ja.com

ソリッドステートドライブの登場により、Bツリーやその他のデータ構造は廃止されますか?

今日、多くの(おそらくほとんど?)データベースアプリケーションは、Bツリーとバリエーションを使用してデータを格納しています。これは、このデータ構造がハードディスクの読み取り、書き込み、シーク操作を最適化するためです(これらの操作は、全体の効率において重要な役割を果たします)データベース)。

ソリッドステートドライブ(SSD)が従来のハードディスク(HDD)に完全に取って代わる必要がありますが、Bツリーとバリエーションは時代遅れになり、ダイレクトアクセスメモリでより効率的に動作するデータ構造のための余地を与えると言えますか?もしそうなら、それらの構造はどうなりますか? (例:ハッシュテーブル、AVLツリー)

15
Daniel Scocco

Bツリーは、ハードディスクのデータベースインデックスに最もよく使用されますが、複数のキャッシュレイヤーと仮想メモリを備えた最新のメモリ階層を考えると、インメモリデータ構造としても利点があります。仮想メモリがSSDにある場合でも、変更されません。

私はC++でかなり多く書いたインメモリB +スタイルのマルチウェイツリーライブラリを使用しています。それはできますパフォーマンスの利点があります-それがもともと書かれた理由はより良いキャッシュを使おうとすることでした-しかし私はそれがしばしばうまくいかないことを認めなければなりません仕方。問題はトレードオフです。つまり、アイテムは挿入および削除時にノード内を移動する必要がありますが、これはバイナリツリーでは発生しません。また、私がそれを最適化するために使用した低レベルのコーディングハックのいくつか-まあ、それらはおそらくオプティマイザを混乱させ、打ち負かしている、と真実は語った。

とにかく、データベースがSSDに保存されている場合でも、それはstillブロック指向のストレージデバイスであり、Bツリーを使用することには利点があります。他の多方向木。

[〜#〜] but [〜#〜]約10年前に、キャッシュを意識しないアルゴリズムとデータ構造が発明されました。これらは、キャッシュのサイズや構造などに気づいていません-それらは、(漸近的に)メモリ階層の可能な限り最良の使用を行います。 Bツリーは、最大限に活用するために特定のメモリ階層に「調整」する必要があります(ただし、非常に広範囲のバリエーションでかなりうまく機能します)。

キャッシュオブリビュデータストラクチャは、実際のところほとんど見られませんが、通常のインメモリバイナリツリーが時代遅れになる可能性があります。また、クラスターサイズやハードディスクキャッシュページサイズが何であるかを気にしないため、ハードディスクやSSDにも価値があることがわかります。

Van Emde Boasのレイアウトは、キャッシュを意識しないデータ構造では非常に重要です。

MIT OpenCoursewareアルゴリズムコースには、キャッシュ忘却データ構造のカバレッジが含まれています。

21
Steve314

先験的に、はい、ディスクがゆっくり移動してデータがフェッチされるハードドライブでは局所性がすべて重要であることを考えると、Bツリーはデータを格納するための最も効率的なデータ構造ではなくなるため、ほとんどのデータベースエンジンを書き換える必要があります。ブロック単位。つまり、データの変更には次のことが必要です。

  1. ヘッドをディスク上の適切な場所に移動します(約10ミリ秒)。
  2. ディスクが回転するのを待ちます(10,000 rpmの場合、1秒あたり167回の回転を意味しますが、平均して半分の回転を待つだけなので、約3ms)。
  3. ブロックを読み取ります(〜3ms)。
  4. RAMで変更します。 (〜10ns)
  5. ヘッドを再びディスク上の正しい位置に移動します(再び〜10ms)。
  6. ディスクが再び回転するのを待ちます(再び3ミリ秒)。
  7. ブロックを書き込みます(〜3ms)。

つまり、10 + 3 + 3 + 10 + 3 + 3 = 34 msです。

ディスク上の位置に関係なく、平均してSSDで同じことを行うのはわずか1msです。

また、ハッシュテーブルの方がはるかに高速なので、ハッシュテーブルの方がより良い代替品になると考えることができます。

唯一の問題は、ハッシュテーブルが順序を維持しないため、Van Emde Boasのように前後を見つけることができないことです。

見る:

  1. http://en.wikipedia.org/wiki/Van_Emde_Boas_tree
  2. http://bryanpendleton.blogspot.com/2009/06/cache-oblivious-data-structures.html

次と前を見つけることが重要なのはなぜですか? xより大きくzより小さいすべての要素を取得することを想像してください。findpreviousとfind nextでインデックスを使用する必要があります。

さて、唯一の問題は、順序保持機能を持つハッシュテーブルが見つからないことです。 Bツリーのバケットのサイズが重要になる可能性がありますが、それはキャッシュ忘却アルゴリズムで解決されます。

だから私はこれがオープンエンドの問題だと思います。