LENMAN-YAO concurrent  B-Tree (a.k.a B-Link-Tree) 油井 誠  (Makoto YUI)
<ul><li>  BEGIN; </li></ul>
B-Link Tree とは (history) <ul><li>A variant of B*-Tree (they call)  actually.. a B+-tree? (data stored in leaf only) </li><...
B*-Tree <ul><li>an elegant(?) variant on B+-tree </li></ul><ul><li>keep  pages at least 2/3 full, guaranteed .  </li></ul>...
B-Link-Tree (Key issue) <ul><li>No Read-Lock !! </li></ul><ul><ul><li>複数のプロセスが同時に更新した場合に,少数のノードをロックする </li></ul></ul><ul><...
デッドロック ( 待ちグラフ ) T2 T1 T3 2 層ロック ( トランザクション内で処理する オブジェクトを順にロックする ) では, 巡回経路ができ,デッドロックが発生する. 巡回閉路
B-link-Tree Structure <ul><li>(a) Leaf( 実際のデータへのポインタを有す ) への </li></ul><ul><li>距離は一定 (of course, well balanced) </li></ul>...
B*-Tree Node Structure (with no  “ high key ” ) Internal use only.
Leaf
<ul><li>P i は Subtree T i を指す  T i に含まれるキー値は K i-1  < v <= K i </li></ul><ul><li>Leaf と non-leaf ノードの構造が同一 ( シンプル ) </li><...
High-key ノードが溢れる時 (Split) ,ノードの右端に付加される Rightmost-link を辿る時に使われる.
Set (51, 74) High-Key
更新時の処理 (basis) <ul><li>x: 物理ページ (Logical ノードと呼んでいる ) </li></ul><ul><li>Lock(x); //  ページ X を更新する際にマーキング </li></ul><ul><li>/...
Native approach ロックする必要がある. (read rock) Top-Down locking. 操作ノード下子孫をロック 15 の探索中に 9 が Insert され, Split されたケース Wait
Rightmost-link B-link-Tree は各ノードに Single Link Pointer を持つ. 各レベルが単方向リスト . 目的 目的のノードに到達するための Alternative way を提供する どのノードもたどり...
Use high-key 74 74 63 HighKey HighKey Split 直後 ( 親へのリンクポインタが修正されていない ) 72 を探すケースを考えてみる. ここの中に High Key があるはずだが, Split されてな...
An structure example of B-link-Tree Additional advantage: level-major order での取得が早い (Leaf をすべて取得する場合など )
Search Algorithm current = root; /* root の pointer を設定  */ A = get(current); /*  ノードを memory に読み込む */   while (current is ...
Insert Algorithm <ul><li>基本的に , Search と似たような下準備をする. </li></ul><ul><li>Step 1. </li></ul><ul><li>木を辿ってキー値 v を含む (should in...
Insert(1) initialize stack; /* to remember ancestors */ current = root; A = get(current); /* scan down the tree */ while (...
// current node の update. // Split Node // for locking.. Remember the oldnode and the parent. // lock parent, oldnode, and...
A B C D E F G H splited A Bottom-up Stack (right-most-link) B E Leaf Found G
D E G H Leaf A Bottom-up Stack (right-most-link) B E If need to Split Flush Flush B Lock Flush Un Lock Finish! G I ’ G’ I ...
P A C Leaf Insert algorithm(Write lock / no read lock) B ’ A ’ P Bottom-up Stack Insert(Split) A ’ Flush Lock A B ’ Flush
Delete <ul><li>Too simple </li></ul><ul><li>(leaf のエントリが K 以下なら,この論文は primary index を前提 ) </li></ul><ul><ul><li>Just remov...
problems <ul><li>Livelock </li></ul><ul><li>multiprocesser system,  </li></ul><ul><li>where one process runs indenfinitely...
<ul><li>  END; </li></ul>
Upcoming SlideShare
Loading in …5
×

B-link-tree

17,767 views
17,579 views

Published on

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total views
17,767
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
48
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

B-link-tree

  1. 1. LENMAN-YAO concurrent B-Tree (a.k.a B-Link-Tree) 油井 誠 (Makoto YUI)
  2. 2. <ul><li> BEGIN; </li></ul>
  3. 3. B-Link Tree とは (history) <ul><li>A variant of B*-Tree (they call) actually.. a B+-tree? (data stored in leaf only) </li></ul><ul><li>1981 年 PHILIP.L. LEHMAN , S.BING YAO ” Efficient Locking for Concurrent Operations on B-Trees ” という論文で発表 </li></ul><ul><li>当時,複数の プロセス で同時実効性を持つデータベースの構築が流行りだった ( らしい </li></ul><ul><li>論文の主眼は如何に効率のよく高い同時実効性を有する索引を構築するか. </li></ul>
  4. 4. B*-Tree <ul><li>an elegant(?) variant on B+-tree </li></ul><ul><li>keep pages at least 2/3 full, guaranteed . </li></ul><ul><li>The benefit over B+-trees is not large, a worst case reduction in page usage of 16.67% </li></ul><ul><li>メモリが安く早くなりつつあるので、メモリスペースを節約するアルゴリズムから脱却すべきではないだろうか. 沢山のメモリを利用することで、レイテンシーが問題がなることがある.よりエレガントなアルゴリズムが必要になってくる. これは既に、バスのキャパシティを CPU スピードが追い越すことで起こっていることである. </li></ul><ul><li>http://www.cise.ufl.edu/~jhammer/classes/b_star.html </li></ul>
  5. 5. B-Link-Tree (Key issue) <ul><li>No Read-Lock !! </li></ul><ul><ul><li>複数のプロセスが同時に更新した場合に,少数のノードをロックする </li></ul></ul><ul><ul><li>ロックの競合は稀である </li></ul></ul><ul><ul><li>ロックの粒度が高く,開放が早い (non-2PL) </li></ul></ul><ul><ul><li>ロック自体は update 時に Binary Lock (simple) </li></ul></ul><ul><ul><ul><li>デッドロックはないが,分散システムを考えるとよくないかも (? </li></ul></ul></ul><ul><li>Additional Value to B*-Tree </li></ul><ul><li>right-link , high key </li></ul><ul><li>Breadth-first search (横型探索 ) が可能 . </li></ul><ul><li>ノードにたどり着く Alternative way が存在する . </li></ul><ul><li>Tree traversing operation </li></ul><ul><li>search: top-down, left-to-right </li></ul><ul><li>insert: bottom-up </li></ul>
  6. 6. デッドロック ( 待ちグラフ ) T2 T1 T3 2 層ロック ( トランザクション内で処理する オブジェクトを順にロックする ) では, 巡回経路ができ,デッドロックが発生する. 巡回閉路
  7. 7. B-link-Tree Structure <ul><li>(a) Leaf( 実際のデータへのポインタを有す ) への </li></ul><ul><li>距離は一定 (of course, well balanced) </li></ul><ul><li>(b) 各ノードは基本的に 最低 K+1 の子 ( への pointer) を </li></ul><ul><li>持つ ただし、 Root は常に最低 2 つの子を持つ </li></ul><ul><li>(c) 各ノードは 最高 2k+1(exclude High-Key) の子を </li></ul><ul><li>持つ </li></ul><ul><li>“ High-key ” と呼ばれる追加エントリを持つこともある (+1) </li></ul><ul><li>(d) key は leaf ノードに存在 </li></ul><ul><li>key はデータベースのレコードへのポインタを有す . </li></ul><ul><li>( 各レコードがキーと関連付けられている ) </li></ul>
  8. 8. B*-Tree Node Structure (with no “ high key ” ) Internal use only.
  9. 9. Leaf
  10. 10. <ul><li>P i は Subtree T i を指す  T i に含まれるキー値は K i-1 < v <= K i </li></ul><ul><li>Leaf と non-leaf ノードの構造が同一 ( シンプル ) </li></ul><ul><li>M は Leaf であることを識別する Marker </li></ul>
  11. 11. High-key ノードが溢れる時 (Split) ,ノードの右端に付加される Rightmost-link を辿る時に使われる.
  12. 12. Set (51, 74) High-Key
  13. 13. 更新時の処理 (basis) <ul><li>x: 物理ページ (Logical ノードと呼んでいる ) </li></ul><ul><li>Lock(x); // ページ X を更新する際にマーキング </li></ul><ul><li>// もし既にロックされていたら wait() </li></ul><ul><li>A <- get(x); // Disk からメモリに読み込む </li></ul><ul><li>Modify data in A // メモリ内の A を更新 </li></ul><ul><li>Put(A, x) // メモリから Disk の sync </li></ul><ul><li>Unlock(x); // ロックを解除 </li></ul>
  14. 14. Native approach ロックする必要がある. (read rock) Top-Down locking. 操作ノード下子孫をロック 15 の探索中に 9 が Insert され, Split されたケース Wait
  15. 15. Rightmost-link B-link-Tree は各ノードに Single Link Pointer を持つ. 各レベルが単方向リスト . 目的 目的のノードに到達するための Alternative way を提供する どのノードもたどり着く為の 2 つの Pointer を持つ Overflow Replaced by two New node. (usually, the two nodes Are on the same physical page) Essentially same as A single node until the Parent pointer is added.
  16. 16. Use high-key 74 74 63 HighKey HighKey Split 直後 ( 親へのリンクポインタが修正されていない ) 72 を探すケースを考えてみる. ここの中に High Key があるはずだが, Split されてない. この時, Link Pointer を辿る必要がある. この条件を High-Key と Search Key の比較によって行う. Search key が High key 以上ならポインタを辿る
  17. 17. An structure example of B-link-Tree Additional advantage: level-major order での取得が早い (Leaf をすべて取得する場合など )
  18. 18. Search Algorithm current = root; /* root の pointer を設定 */ A = get(current); /* ノードを memory に読み込む */ while (current is not a leaf) /* leaf に到達するまでループ */ current = scannode1(v, A); /* v をキーに memory bloak A を走査 */ /* リンクポインタを返す */ A = get(current); /* リンク先のノード読み込み */ / * now reached to leaves * / * leaf 内の線形探索 */ while ((t = scannode(v,A)) == link pointer of A) current = t; A = get(current); // 値 v を持つ leaf が見つかったか ? if (v is in A) return(success); else return(failure); Simple! Only trick is to have scannode know about high-keys and right-links. Right-link か Child-link かは 問わない
  19. 19. Insert Algorithm <ul><li>基本的に , Search と似たような下準備をする. </li></ul><ul><li>Step 1. </li></ul><ul><li>木を辿ってキー値 v を含む (should include) </li></ul><ul><li>リーフノードを探す. </li></ul><ul><li>その際, Rightmost-link をスタックに積む. </li></ul><ul><li>Step2. </li></ul><ul><li>“ remembered list ” ( 辿ってきた道 ) を辿って,実際の挿入 </li></ul><ul><li>Bottom-up insert . </li></ul>
  20. 20. Insert(1) initialize stack; /* to remember ancestors */ current = root; A = get(current); /* scan down the tree */ while (current is not a leaf) { t = current; current = scannode(v,A); if (current not link pointer in A) push t; /* remember node at the level */ A = get(current); } /* reached to leaf */ lock(current); A = get(current); move_right(); /* if required, move right and lock the neighbor */
  21. 21. // current node の update. // Split Node // for locking.. Remember the oldnode and the parent. // lock parent, oldnode, and the next-sibling.
  22. 22. A B C D E F G H splited A Bottom-up Stack (right-most-link) B E Leaf Found G
  23. 23. D E G H Leaf A Bottom-up Stack (right-most-link) B E If need to Split Flush Flush B Lock Flush Un Lock Finish! G I ’ G’ I ’ G’ E E
  24. 24. P A C Leaf Insert algorithm(Write lock / no read lock) B ’ A ’ P Bottom-up Stack Insert(Split) A ’ Flush Lock A B ’ Flush
  25. 25. Delete <ul><li>Too simple </li></ul><ul><li>(leaf のエントリが K 以下なら,この論文は primary index を前提 ) </li></ul><ul><ul><li>Just remove keys from a leaf node. </li></ul></ul><ul><ul><li>(never do deletion from internal nodes) </li></ul></ul><ul><ul><li>Delete が続くとノードのエントリが k エントリ以下に </li></ul></ul><ul><ul><li>なることがある. (starvation?) </li></ul></ul>
  26. 26. problems <ul><li>Livelock </li></ul><ul><li>multiprocesser system, </li></ul><ul><li>where one process runs indenfinitely </li></ul><ul><li>( 特に processing speed に差がある時 ) </li></ul><ul><li>Following link pointer が別プロセスで作られると極端に遅くなることがある </li></ul>
  27. 27. <ul><li> END; </li></ul>

×