Save 37% off PRO during our Black Friday Sale! »

空間データのためのRツリー

 空間データのためのRツリー

GeoLogicの社内勉強会でRツリーについて発表しました。
Rツリーは空間データのインデックスで使われており、Bツリーを拡張したデータ構造です。このRツリーは空間データを扱うシステムでも使われており、PostgreSQLのプラグインであるPostGISでもGiSTインデックスでRツリーのデータ構造が実装されております。

5df92c9a1b7abbf03f7b32a4f137441a?s=128

KentarouSuzuki

October 10, 2021
Tweet

Transcript

  1. R-Tree for Spatial Data

  2. みなさんはデータベースで検索性能を向上させる時に、どんなことをしますか?

  3. より効率的なクエリを書いたり、マシンのスペックをあげることなどいろんな方法があると 思いますが、一番はじめに思いつく方法として インデックスを張る という方法があると思い ます。

  4. 例えば、PostgreSQLでは以下のようなインデックスが用意されています。 B-Tree: みんなご存知のB-Tree Hash: ハッシュ関数を使ってキーのHash値を作り、それに対応する値を持ってくる GiST: 高さが可能な限りバランスがいい木構造を使って検索を実行するインデックスで B+木を一般化したもの SP-GiST: GiSTとは違い、分割されたサイズが等しくないものも許容した木構造を使っ

    て検索を行うインデックス GIN: 配列などの複合型に対して張るインデックス BRIN: テーブルの連続的なブロック範囲に格納された値についてデータを格納するイン デックス
  5. では、空間データでインデックスを張るには?

  6. R木を使います

  7. R木とは? 1984年にAntonin Guttmanの論文、R-Trees: A Dynamic Index Structure for Spatial Searchingによって、提唱されたデータ構造。B-Treeと同じように平衡木の構造になってい

    る。 PostgreSQLの空間データ拡張版であるPostGISでもこのR-Treeのアルゴリズムをもとに実装 されている。実際にはR木をそのまま実装しているのではなく、GiSTに沿って実装されたも のを使っている。
  8. R木の構造 (画像はWikipediaより引用) 各階層のノードは子ノードを完全 に含む最小面積の矩形になる 葉ノードは対象の地物最小で覆う 最小面積の矩形になる ノードが含む子ノード or 地物の数 の範囲はあらかじめ決められてい

    る R木の高さは以下の式で求められる h = ∣ log ​ N∣ − m 1 m: ノードが含む最小の数 N: 地物の数
  9. 検索アルゴリズム 木構造の根から葉に向かって降下していく 1. 検索したい範囲が根ノードに含まれるか調べる 2. 範囲がノードに含まれる場合は、その配下にある子ノード全てを対象に検索したい範囲 に含まれるか否かを調べる 3. 2の結果、一致したノードについてはさらにその子ノード全てを対象に一致するかどうか を調べる

    4. それを葉ノードに至るまで降下していって、条件に合う地物を結果として返す 検索アルゴリズム
  10. 緑色のポリゴンと交差している地物を検 索する場合 1. 黒い根ノードのうち、緑のポリゴ ンと交差している矩形を調べる -> R1とR2のうち、R1が緑と交差 している 検索アルゴリズム

  11. 緑色のポリゴンと交差している地物を検 索する場合 2. 青色のノードのうち、R1が含んでい る全ての矩形で緑色のポリゴンと交差し ているものを調べる -> R3, R4, R5のうち、R3とR4が緑と交

    差している 検索アルゴリズム
  12. 緑色のポリゴンと交差している地物を検 索する場合 3. 赤色のノードのうち、R3とR4が含ん でいる全ての矩形で緑色のポリゴンと交 差しているものを調べる -> R8 ~ R12のうち、R8とR10が含んで

    いる 検索アルゴリズム
  13. 挿入アルゴリズム R木に対して挿入する地物( I )を覆う葉ノードを見つけるがその時の条件によって、その後の 処理が変わる 挿入アルゴリズム

  14. 1. 葉ノードに追加できる場合 i. 緑の星を追加する場合、検索 アルゴリズムを利用し、星が 重なるR15ノードを見つける ii. (一つの矩形に入る最大の地 物数を3とした時)R15に星が 入るので、R15に緑の星を追

    加する 挿入アルゴリズム
  15. 2. 葉ノードに追加できる数を超えた 場合 i. 緑の星を追加する場合、検索 アルゴリズムを利用し、星が 重なるR16ノードを見つける ii. (一つの矩形に入る最大の地 物数を3とした時)R16に入れ

    られる地物の数が超える iii. 新しく緑の葉ノードをR6の下 に分割し、作成して、星を追 加する。 挿入アルゴリズム
  16. 3. 追加できる葉ノードがない場合 i. 緑の星を追加する場合、検索 アルゴリズムを利用しても星 と重なる葉ノード(赤のノー ド)が見つからない ii. 星の周辺にある葉ノードを拡 張し、かつ拡張する面積が最

    も小さいものを選択する。 iii. この場合は、R8が一番拡張す る面積が少ないので、R8を選 択する。 挿入アルゴリズム
  17. 削除アルゴリズム 1. R木から該当の地物を削除する 2. 矩形が含む最少の地物数を下回る 場合、周囲のノードを拡張し、残 っている地物を含める この例の場合はR16を拡張するが、R6 が含む葉ノードの数が1になるため、緑 のように新しく葉ノードを作成する

    削除アルゴリズム