- ベストアンサー
B+木 逆順に効率よく取り出すには?
- B+木のリーフ部分を昇順で連続アクセスするのは容易ですが、降順に順次アクセスしたい場合はB木のように枝を探索しながらでないと無理です。
- 双方向リンクでリーフ部分をつなげれば降順でキーを順次取り出すことができますが、ポインタの増加やブロックサイズの変化が懸念されます。
- B+木で降順でキーを順次取り出す場合は、リーフ部分に双方向リンクを持たせるのが一般的です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>「ページ」はいわゆるファイルシステムにおける「ブロック」にあたるようなものであるというなイメージを持ちました。 そう考えていいと思います。 >その辺の定義はデータベースによって変わるのでしょうか? RDBMSにより、4KB、8KBなど利用者側で指定できるものもあれば、固定のものもあります。 >もし前者であればkey長によってページあたりのkey数が変わることになるのでしょうか? そういうことです。 >仮に > ページ長 (4 Kbyte) > key int型 (4byte) > ポインタ (4byte) >だとすれば、 >1ページ中のkey数は500個くらいになるというこでしょうか? 各ページ中には、そのページ中の情報に関する管理情報、下位方向ポインタ、水平方向ポインタ等の情報があります。この情報は、大きくても100バイト未満だとは思います。 1ページで管理できるキー数 =(ページ長-ページ管理情報)/(キー長+ポインタ長) 500件くらいは、管理できますね。
その他の回答 (2)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#1回答者です。 リンクを貼り忘れました。 参考URLは、SQL Serverのインデクスの概要説明です。
- chukenkenkou
- ベストアンサー率43% (833/1926)
RDBMS等で実装しているB-TREEインデクスは、リーフページ間に双方向の水平ポインタを持っている場合が殆どだと思います。 RDBMSにもよりますが、ページ長は4KBくらいあるので、双方向の水平ポインタを持っても、1ページ辺り8バイト~16バイト程度、使用量が増えるだけです。
お礼
なるほど、ありがとうございます。 リーフノードについては双方向でリンクさせてしまうことにしました。 > ページ長は4KBくらいあるので ここで「ページ」というものがいまいちイメージがつきませんでした 参考に頂いたページだと、「ページ」自体がB+木の各ノード(複数のkey値と下位ノードへのポインタで構成)という風に受け取りました。 一方でPostgreSQLについてのページですが、 http://www.postgresql.jp/document/pg820doc/html/storage-page-layout.html をみると、「ページ」はいわゆるファイルシステムにおける「ブロック」にあたるようなものであるというなイメージを持ちました。 その辺の定義はデータベースによって変わるのでしょうか? また、もし前者であればkey長によってページあたりのkey数が変わることになるのでしょうか? 仮に ページ長 (4 Kbyte) key int型 (4byte) ポインタ (4byte) だとすれば、 1ページ中のkey数は500個くらいになるというこでしょうか? (質問に乗せたwikipediaを倣って、key数は4個にしています)
お礼
参考URLありがとうございます。 かなり参考になるページで勉強になります。