JP2004185617A - 左リンクを使用してツリーをトラバースするアルゴリズム - Google Patents

左リンクを使用してツリーをトラバースするアルゴリズム Download PDF

Info

Publication number
JP2004185617A
JP2004185617A JP2003396398A JP2003396398A JP2004185617A JP 2004185617 A JP2004185617 A JP 2004185617A JP 2003396398 A JP2003396398 A JP 2003396398A JP 2003396398 A JP2003396398 A JP 2003396398A JP 2004185617 A JP2004185617 A JP 2004185617A
Authority
JP
Japan
Prior art keywords
node
handle
procedure
key
tree
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2003396398A
Other languages
English (en)
Other versions
JP4542769B2 (ja
Inventor
Marc A Najork
エー.ナジョーク マーク
Chandramohan A Thekkath
エー.テカス チャンドラモハン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2004185617A publication Critical patent/JP2004185617A/ja
Application granted granted Critical
Publication of JP4542769B2 publication Critical patent/JP4542769B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/912Applications of a database
    • Y10S707/918Location
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99941Database schema or data structure
    • Y10S707/99944Object-oriented database structure

Landscapes

  • Engineering & Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

【課題】 同時実行性Bツリーアルゴリズムの効率を高めるための方法を提供すること。
【解決手段】 情報管理システムは、コンピュータと、ディスクブロックに関連付けられた複数のノード、およびノード内に記憶されたハンドルを備えるBツリーデータ構造を含むデータベースとを備える。1つの左リンクハンドルhleftが、そのノードの左兄弟への各ノード点内に記憶される。キーkに対してルックアップ動作を行う機構は、Bツリーをトラバースし、ノードの左リンクハンドルを参照し、キーkが、そのノード内に記憶された値kmin以下である場合に、そのノードの左兄弟にアクセスする。挿入動作および削除動作を行うための機構もまた提供され、ルックアップ動作、挿入動作、削除動作は、インデックスノードAのキー範囲に、その動作が突き止めようとしているキーkが含まれないかどうか検出し、k≦A.kminのとき左兄弟へのハンドルA.hleftに従う。
【選択図】 図4

Description

本発明は一般に、それだけには限らないが、データベース管理システムおよびファイルシステムを含む、データを記憶し、編成し、取り出す情報管理システム(情報検索システムとも呼ばれることがある)の分野に関し、より詳細には、そのようなシステム内で使用するための新規なデータ構造およびアルゴリズムに関する。本発明は、それだけには決して限らないが、特に、Bツリーデータ構造およびその変形形態、ならびにSQLタイプのデータベースと共に使用するのに適している。
Bツリーは、リレーショナルデータベースおよび非リレーショナルデータベースに対する、またさらに、大量のデータをインデックスしそれにアクセスするための方法として1組のリンクされたノードを含むデータ構造が使用されるファイルシステムおよび他のシステムに対するコア技術である。データベース管理システムは、本発明が適している種類の情報管理/検索システムの一例である。しかし、本発明は、それだけには決して限らないが、データベースと共に使用するのに十分適しているため、本発明の背景と例示的な実施形態について、データベースを参照して述べることにする。
最小限のロックを有する同時実行性Bツリー(concurrent B−Tree)は、分散データベースを構築するための手段となり、単一の関係が複数のマシンに跨ることができる。複数のマシンにわたって関係を分散することにより、スケーラブルなデータベースを構築することが可能になり、データベースのサイズは、さらにハードウェアを追加することによって簡単に増大することができる。
R. Bayer and E. McCreight. Organization and Maintenance of Large Ordered Indexes. Acta Informatica, 1(3):173-189, 1972 D. Comer. The Ubiquitous Bツリー. ACM Computing Surveys, 11(2):121-128, June 1979 P.L. Lehman and S.B. Yao. Efficient Locking for Concurrent Operations on Bツリーs. ACM Transactions on Information retrieval systems, 6(4):650-670, December 1981 Yehoshua Sagiv. Concurrent Operations on Bツリーs with Overtaking. Journal of Computer and System Sciences, Vol. 3, No. 2, Oct. 1986. Paul Wang. An In-Depth Analysis of Concurrent Bツリー Algorithms. Technical report MIT/LCS/TR-496, Laboratory for Computer Science, Massachusetts Institute of Technology, Feb. 1991. H. Wedekind. On the selection of access paths in an information retrieval system. In J.W. Klimbie and K.L. Koffman, editors, Database Management, pages 385-397. North Holland Publishing Company, 1974.
本発明は、特に、同時実行性Bツリーアルゴリズムの効率を高めるための方法に関する。
以下でより詳しく論じるように、本明細書で開示されている主題は、(a)ロック動作の強引な最小限化により現況技術で発生する可能性のある、Bツリー動作がツリーの中で「迷子」になることを防止する追加データを維持すること、(b)余分な同期を必要とすることなしに削除済みノードをガーベッジコレクションすること(現況技術のアルゴリズムは、ガーベッジコレクションのためにタイムスタンプをベースとする手法を使用し、残りのBツリー動作すべての開始時間を追跡するために余分な同期を必要とする)を対象とする。
Bツリーについての他の背景情報は、文書に見出すことができる(たとえば、非特許文献1、2、3、4、5、6参照)。
本発明の第1の態様による情報管理システムは、コンピュータとデータベースとを含み、データベースは、ディスクブロック(または、より一般的には、本発明がディスク以外の記憶媒体と共に使用される場合「記憶ブロック」)に関連付けられた複数のノードと、ノード内に記憶されたハンドルと(任意選択で、ハンドルおよびノードのそれぞれに関連付けられたバージョン番号と)をそれぞれが備える1つまたは複数のBツリーデータ構造を備える。少なくとも1つの左リンクハンドルhleftが、各ノード点内で、そのノードの左兄弟(left sibling)に記憶される。キーkに対してルックアップ動作を行う機構は、Bツリーをトラバースし、ノードの左リンクハンドルhleftを参照し、キーkが、ノード内に記憶された値kmin以下である場合に、ノードの左兄弟にアクセスする。挿入動作および削除動作を行うための機構もまた提供され、ルックアップ動作、挿入動作、削除動作は、インデックスノードAのキー範囲が、その動作が突き止めようとしているキーkを含まないかどうか検出し、k≦A.kminのとき左兄弟へのハンドルA.hleftに従う。
「ノード」は、複数のディスクまたは記憶ブロックに跨ることができること、リンクおよびバージョン番号は、個々のディスクブロックではなくノードに論理的に関連付けることができることに留意されたい。
本発明のこれらや他の特徴について、以下で述べる。
以下、本発明の現在好ましい実施について述べる。最初に、セクションAでは、主に、本発明を多種多様な方法、たとえば、コンピュータ可読媒体に記憶されたデータ構造、および/または汎用コンピュータ上で実行されるソフトウェアをベースとするプロセスで実施することができることを示すために、図1を参照しながら例示的なコンピューティング環境について述べる。Bツリーアルゴリズムは、コードと、このコードが操作するデータ構造という2つの基本的なものを必要とすることは周知である。コードは、プロセス内またはファームウェア内を含む様々な所で実施することができる。データは、(たとえば、RAM、ディスク、取外し式媒体など、持続度の異なる)どこにでも保持することができる。この説明に続いて、セクションBでは、本明細書で開示されている本発明のデータ構造および方法の2つの主な態様について概要を提供する。これら2つの主な態様は、(1)削除および圧縮動作を容易にするバージョン付きノードと、(2)ツリーのトラバース動作を容易にする左リンクとを含む。セクションCからFは、本発明を実施することができる例示的な方法のさらなる詳細について述べる。最後に、セクションGは、結論を提供する。
A.例示的なコンピューティング環境
図1は、本発明を実施することができる好適なコンピューティングシステム環境100の一例を示す。コンピューティングシステム環境100は、好適なコンピューティング環境の一例にすぎず、本発明の使用または機能の範囲についてどんな制限も暗示しないものとする。コンピューティング環境100は、例示的な動作環境100に示されている構成要素のいずれか1つまたは組合せに関してどんな依存性も要件も有すると解釈すべきでない。
本発明は、多数の他の汎用または専用コンピューティングシステム環境または構成と共に動作可能である。本発明と共に使用するのに適している可能性のある周知のコンピューティングシステム、環境、および/または構成の例には、それだけには限らないが、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサをベースとするシステム、ディスクコントローラ、セットトップボックス、プログラム可能な家電、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれる。
本発明について、コンピュータによって実行される、プログラムモジュールなどコンピュータ実行可能命令の全体的な状況で述べる。一般に、プログラムモジュールは、特定のタスクを実行する、あるいは特定の抽象データタイプを実施するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。本発明はまた、通信ネットワークまたは他のデータ転送媒体を介してリンクされた遠隔処理デバイスによってタスクが実行される分散コンピューティング環境内で実施することができる。分散コンピューティング環境では、プログラムモジュールや他のデータは、メモリ記憶装置を含むローカルと遠隔双方のコンピュータ記憶媒体内に位置する可能性がある。
図1を参照すると、本発明を実施するための例示的なシステムが、コンピュータ110の形態で汎用コンピューティングデバイスを含む。コンピュータ110の構成要素には、それだけには限らないが、処理装置120、システムメモリ130、およびシステムメモリを含む様々なシステム構成要素を処理装置120に結合するシステムバス121が含まれる。システムバス121は、メモリバスまたはメモリコントローラ、周辺機器バス、および様々なバスアーキテクチャのいずれかを使用するローカルバスを含むいくつかのタイプのバス構造のいずれかとすることができる。限定ではなく例を挙げると、そのようなアーキテクチャには、ISA(Industry Standard Architecture)バス、MCA(Micro Channel Architecture)バス、EISA(Enhanced ISA)バス、VESA(Video Electronics Standards Association)ローカルバス、およびPCI(Peripheral Component Interconnect)バス(メザニンバスとしても知られる)が含まれる。
コンピュータ110は、一般に、様々なコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ110によってアクセスすることができる任意の入手可能な媒体とすることができ、揮発性媒体と不揮発性媒体、取外し式と非取外し式の媒体を共に含む。限定ではなく例を挙げると、コンピュータ可読媒体は、コンピュータ記憶媒体と通信媒体を含む。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなど、情報を記憶するための任意の方法または技術で実施される揮発性と不揮発性、取外し式と非取外し式の媒体が共に含まれる。コンピュータ記憶媒体には、それだけには限らないが、RAM、ROM、EEPROM、フラッシュメモリもしくは他のメモリ技術、CD−ROM、デジタル多用途ディスク(DVD)もしくは他の光ディスク記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置もしくは他の磁気記憶デバイス、または、所望の情報を記憶するために使用することができ、コンピュータ110によってアクセスすることができる他の任意の媒体が含まれる。通信媒体は、一般に、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを、搬送波または他の移送機構など変調データ信号に統合し、任意の情報送達媒体を含む。「変調データ信号」という用語は、情報を信号に符号化するようにその特性の1つまたは複数が設定された、または変化した信号を意味する。限定ではなく例を挙げると、通信媒体は、有線ネットワークまたは直接配線接続など有線媒体と、音響、RF、赤外線および他の無線媒体など無線媒体とを含む。上記のいずれかの組合せもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
システムメモリ130は、ROM131およびRAM132など揮発性および/または不揮発性メモリの形態でコンピュータ記憶媒体を含む。起動中などにコンピュータ110内の要素間で情報を転送するのを助ける基本ルーチンを含む基本入出力システム(BIOS133)は、一般にROM131内に記憶されている。一般にRAM132は、処理装置120によって直ちにアクセス可能な、および/または現在動作されているデータおよび/またはプログラムモジュールを含む。限定ではなく例を挙げると、図1は、オペレーティングシステム134、アプリケーションプログラム135、他のプログラムモジュール136、プログラムデータ137を示す。
コンピュータ110はまた、他の取外し式/非取外し式、揮発性/不揮発性コンピュータ記憶媒体を含むことができる。たとえば、図1は、非取外し式の不揮発性磁気媒体との間で読出しまたは書込みをするハードディスクドライブ141、取外し式の不揮発性磁気ディスク152との間で読出しまたは書込みをする磁気ディスクドライブ151、CD−ROMまたは他の光媒体など取外し式の不揮発性光ディスク156との間で読出しまたは書込みをする光ディスクドライブ155を示す。例示的な動作環境内で使用することができる他の取外し式/非取外し式、揮発性/不揮発性コンピュータ記憶媒体には、それだけには限らないが、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、固体RAM、固体ROMなどが含まれる。一般にハードディスクドライブ141は、インターフェース140など非取外し式メモリインターフェースを介してシステムバス121に接続され、磁気ディスクドライブ151および光ディスクドライブ155は、一般に、インターフェース150など取外し式メモリインターフェースによってシステムバスに接続されている。
上記で論じ、図1に示されたドライブとその関連コンピュータ記憶媒体は、コンピュータ110のためのコンピュータ可読命令、データ構造、プログラムモジュール、および他のデータを記憶する。たとえば、図1では、ハードディスクドライブ141が、オペレーティングシステム144、アプリケーションプログラム145、他のプログラムモジュール146、プログラムデータ147を記憶して示されている。これらの構成要素は、オペレーティングシステム134、アプリケーションプログラム135、他のプログラムモジュール136、プログラムデータ137と同じとすることも異なっていることもできる。ここでは、オペレーティングシステム144、アプリケーションプログラム145、他のプログラムモジュール146、プログラムデータ147は、これらが最低でも異なるコピーであることを示すために異なる番号が与えられている。ユーザは、キーボード162、および一般にマウス、トラックボール、またはタッチパッドと呼ばれるポインティングデバイス161など、入力デバイスを介してコンピュータ110にコマンドおよび情報を入力することができる。他の入力デバイス(図示せず)には、マイクロフォン、ジョイスティック、ゲームパッド、衛星パラボラアンテナ(パラボラアンテナは、コンピュータに入力すべき信号を受信するために使用される)、スキャナなどが含まれる。これらの、また他の入力デバイスは、システムバスに結合されているユーザ入力インターフェース160を介して処理装置120に接続されることがしばしばであるが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス(USB)など、他のインターフェースおよびバス構造によって接続することができる。モニタ191または他のタイプのディスプレイデバイスもまた、ビデオインターフェース190などのインターフェースを介してシステムバス121に接続することができる。モニタに加えて、コンピュータはまた、スピーカ197やプリンタ196など他の周辺出力デバイスをも含むことができ、これらは、出力周辺機器インターフェース195を介して接続することができる。
コンピュータ110は、リモートコンピュータ180など、1つまたは複数のリモートコンピュータに対する論理接続を使用してネットワーク環境内で動作することができる。リモートコンピュータ180は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイスまたは他の共通ネットワークノードとすることができ、図1には、メモリ記憶デバイス181だけが示されているが、一般に、コンピュータ110に関して上述した要素の多数または全部を含む。図の論理接続は、ローカルエリアネットワーク(LAN)171と広域ネットワーク(WAN)173を含むが、他のネットワークを含むこともできる。そのようなネットワーク環境は、事務所、全社コンピュータネットワーク、ストレージエリアネットワーク(SAN)、イントラネット、インターネットで普通である。
コンピュータ110は、LANネットワーク環境内で使用されるとき、ネットワークインターフェースまたはアダプタ170を介してLAN171に接続される。コンピュータ110は一般に、WANネットワーク環境内で使用されるとき、インターネットなどWAN173を介して通信を確立するためのモデム172または他の手段を含む。モデム172は、内部にあっても外部にあってもよく、ユーザ入力インターフェース160または他の適切な機構を介してシステムバス121に接続することができる。ネットワーク環境では、コンピュータ110に関して図示されたプログラムモジュール、またはその一部分を、遠隔メモリ記憶装置内に記憶することができる。限定ではなく例を挙げると、図1は、メモリデバイス181に常駐するリモートアプリケーションプログラム185を示す。図のネットワーク接続は例であり、コンピュータ間で通信リンクを確立する他の手段を使用することができることは理解されよう。
B.概要:バージョン付きノードおよび左リンク
本発明は、一般に、同時実行性Bツリーをトラバースするための先の方法に改良を加え、具体的には、Yehoshua Sagivによるアルゴリズム(これを「Sagivアルゴリズム」と称する)に改良を加える。上記で論じたように、Bツリーは、「値」(従業員記録など)に対する「キー」(従業員番号など)の関連付けを維持するデータ構造である。一般にBツリーは、ディスク上に記憶される。Bツリーは、大抵の情報検索システムの基礎にある。
図2は、典型的な情報検索システム200を示す。図では、そのようなシステムは、サーバ202と、データベースなど持続性ストア204とを含むことができる。さらに、ストア204内に常駐するデータは、B−リンク−ツリー206などツリーの形態に編成することができる。そのようなデータ構造は、ノードN1、N2、N3などを含み、インデックスノードの場合には、各ノードから少なくとも1つの他のノードへのリンクを含む(データノードは、一般に入来リンクを有するだけである)。ノードは、ディスクブロックに対応するようにサイズ決めすることができ、あるいは、より大きくすることも、より小さくすることもでき、データノードおよびインデックスノードとして形成することができる(図3Aと共に下記でさらに論じる)。さらに、ルートノード(図2のノードN1)と子ノードがあり、兄弟ノードは、共通の親を有するノードである(たとえば、ノードN2およびN3は兄弟である)。インデックスノードはまた、図のように、その右兄弟にリンクすることができる。
一般に情報検索システムは、情報検索システムによって維持されているデータへの同時アクセスとその更新をサポートし、これは、基礎となるBツリー上で複数の同時ルックアップ動作および更新動作が存在する可能性があることを意味する。これらの同時動作がBツリーを破損しないようにするために、何らかの同期方式が必要とされる。典型的な同時実行性Bツリーアルゴリズムは、ツリーのノードレベルで同時動作を同期する。すなわち、ツリーのノードを修正したいと望む動作は、同じノード上で別の同時更新(または他の)動作と干渉しないことを保証するために、そのノードに対してロックを獲得しなければならない。
ロック獲得は、いくつかの点に関して高価である。すなわち、(特にBツリーが複数のコンピュータを跨いで複製されるとき、ロックを遠隔ロックサーバから獲得しなければならないことを意味し)コンピュータ的に高価となる可能性があり、同時実行性を制限する。したがって、(アルゴリズムの正しさを損なうことなしに)ロック獲得数を最小限に抑えることが望ましい。多くの調査がこのテーマに対して向けられている(上記で引用した非特許文献5は、この問題に対して優れた調査を含む)。知る限りでは、ロック獲得数を最小限に抑えることに関して最も良好に動作するBツリーアルゴリズムは、Sagivアルゴリズムである(上記で引用した非特許文献4参照)。
本明細書で述べられているシステムは、2つの点でSagivのアルゴリズムを改善する。第1に、Sagivのアルゴリズムの非効率、すなわち、データレコードを突き止めようと試みる間に動作が「迷子」になる可能性があり、再開始しなければならない非効率を回避し、第2に、Sagivの技法は追加のロックを必要とするが、追加のロック獲得を必要としない、削除済みノードをガーベッジコレクションするための方式を導入する。この2つの最適化は互いに独立であり、すなわち、一方または両方を追加することによってSagivのアルゴリズムを改善することができる。
本発明について述べる前に、一般にBツリーを、また具体的にはSagivのアルゴリズムを概観するのが有用である。
C.BツリーおよびSagivアルゴリズム
Bツリーは、値とのキーの関連付けを維持するデータ構造である。キー全体にわたって全体の順序が存在すること、すなわち、一方のキーが他方より大きいかどうか判断することが常に可能であることが前提条件である。図2、参照番号208で示されているように、Bツリーは、以下の3つの基本動作をサポートする。
1)キーkを値vに関連付けるinsert(k,v)
2)キーkに関連付けられた値vを返すlookup(k)
3)キーkをその関連付けられた値から分離するdelete(k)
Bツリーは、最初にBayerおよびMcCreightによって述べられた(上記で引用した非特許文献1)。Bツリー(上記で引用した非特許文献6参照)、B+ツリー(上記で引用した非特許文献2参照)、およびB−リンクツリー(上記で引用した非特許文献3参照)を含む、Bツリーの多数の変形形態がある。Sagivのアルゴリズムは、B−リンクツリーを使用する。本発明は、すべてのタイプのBツリーとその変形形態に適用可能であり、本発明について述べる際に本明細書で使用されるBツリーという用語は、基本的なBツリー構造の変形形態すべてを包含するものとする。本発明の好ましい実施形態は、新しい形態のB−リンクツリーを使用する。
B−リンクツリーは(また実際にはどのBツリーも)、キーおよび値、ならびにメタデータをノード内に記憶する。ノードは、ディスクまたは何らかの他の記憶装置上で維持され(Bツリーは、任意の低速、安価な記憶装置について理にかなう)、要求に応じてメインメモリ内に読み込まれ、修正された場合、ディスクに書き戻される。ディスク上のノードは、ハンドルによって識別される。(本考察では、ハンドルを、記憶ブロックの連続する範囲のアドレス(たとえば、ディスクブロックアドレス)に任意選択のメタデータを加えたものと考えれば十分である。)図2、参照番号210に示されているように、アロケータは、ノードをディスク上で維持し、以下の4つの動作をサポートするソフトウェアコンポーネントである。
1)nバイトの最大サイズで、あるノードについてディスク上の空間を予約し、ノードにハンドルを返すallocate(n)
2)ハンドルhによって識別されたディスクロケーションの空間を放棄するdeallocate(h)
3)ハンドルhによって識別されたディスクロケーションからノードを読み取り、それを返すread(h)
4)メインメモリからハンドルhによって識別されたディスクロケーションにノードAを書き込むwrite(h,A)
以下の考察では、アロケータ動作が微小である、すなわち、同じハンドルに対する2つの同時動作が互いに干渉しないと仮定する。
Bツリー内のノードは、他のノードを参照するハンドルを含むことができる。大抵のBツリー変形形態では、ノード群を接続して、有向/連結/非輪状グラフであるツリー(したがって名前)を形成する。以下では、ツリー、および部分ツリー、リンク、ルート、リーフ、親、子、兄弟という用語の定義を熟知しているものと仮定する。B−リンクツリーは、親から子へのリンクに加えて、あらゆるノードがその直接隣接する右兄弟へのリンク(そのような兄弟が存在する場合)を有する点で正規のツリーと異なる。これは図3Aの例示的なB−リンクツリー300においてわかり、「右リンク」(右兄弟へのリンク)が参照番号302によって表されている。
Sagivによって使用されているB−リンクツリーは、それぞれ図3Aの参照番号304および306であるデータノードおよびインデックスノードという2つの異なる種類のノードで構成されている。データノードは、単純に<k,d>という形態のキー値の対である。インデックスノードは、
<kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright>
という形態である。
以下では、ノードAのフィールドxをAxと称する。インデックスノードA,A.h...とすると、A.hは、Aのn+1の子へのハンドルであり、A.hrightは、その右兄弟へのハンドルである。A.k(0=i<nの場合)は、ハンドルA.h部をルートとする部分ツリー内の最大キーであり、A.ki−1(または、i=0の場合A.kmin)は、ハンドルA.h部をルートとする部分ツリー内の最小キーより小さい。A.kmaxは、Aのどの部分ツリー内でも最大キー以上であり(Aが右兄弟を有していない場合には、定義8に従う)、A.kminは、BがAの左兄弟である場合、B.kmaxに等しい(または、Aが右兄弟を有していない場合には、−8)。さらに、A.kmin<A.k...<A.k=A.kmaxである。最後に、nのサイズに制限がある(nは、インデックスノード内のキーとハンドルの数を示す)。nが最大値(たとえば、2t)に達した場合には、インデックスノードが満杯であるという。同様に、nがある数(たとえば、t)に満たない場合、ノードが満杯未満であるという。
インデックスノード内のキーと、そのノード部をルートとする部分ツリー内のキーとに対する制約のため、B−リンクツリーは探索ツリー、すなわち、ツリーの中に下降することによって特定のキーを見つけることができるツリーである。直感的には、lookup(k)は、ルートハンドルで始まり、対応するノードA内で読み取り、A.ki−1(または、i=0の場合A.kmin)<k=A.k(または、i=nの場合A.kmax)のような値iを識別する。次いで、データノードBに達するまでハンドルA.hに沿って帰納的に進み、Bのキーが実際にkであった場合Bの値を返し、そうでない場合にはヌルを返す。
削除動作はルックアップ動作に似ている。すなわち、delete(k)は、キーkを有するデータノードDが発見されるまで(そのようなノードが存在する場合)ツリーの中に下降する。次いで、この動作はDを削除済みとマークし(他の進行中の動作がDへのハンドルを有しているが、依然としてDを読み取っていない可能性があるため、Dは直ちに割振り解除されない)、Dの親ノードAからDへのハンドルを除去する。これは、Aを満杯未満にする可能性がある。
挿入動作はより複雑である。すなわち、insert(k,v)は、新しいデータノードDにハンドルhを割り振り、そこに対(k,v)を書き込み、次いで、hを受け取るべきリーフインデックスノードA(子がデータノードであるインデックスノード)を見つけるまでルックアップと同じ方法でツリーの中に帰納的に下降する。Aが満杯でない場合には、insert(k,v)は、単にhおよびkを適切な場所でA内に挿入し、そうでない場合には、新しいインデックスノードAを割り振り、Aのキー−ハンドル対の半分をAの上に移動し、kおよびhをA内に挿入し、最後に、ハンドルをAに、またAの新しいkmaxをAの親に追加する(これによりAの親が満杯超過になり、ノード分割プロセスがツリーを詰めさせる可能性がある)。
上述のように、削除動作は、ノードを満杯未満にする可能性がある。(ツリーを必要とされるより深くすることになり、各動作によって必要とされるディスクアクセス数を増大させることになる)非常に多数のノードが満杯未満になるのを防止するために、バックグラウンドで圧縮スレッドが実行される。このスレッドは、ツリーを繰り返しトラバースし、満杯未満のノードを探索する。満杯未満のノードを突き止めたとき、その左兄弟または右兄弟と再平衡を取るか(これは、キー−ハンドル対をその兄弟からAに移動すること、およびキーを親ノード内で調整することを必要とする)、あるいは、Aをその左兄弟または右兄弟と完全にマージする(これは、Aの内容すべてをその兄弟に移動すること、Aを削除済みとマークすること、Aのハンドルとその対応するキーをAの親から除去することを必要とし、これにより親が満杯未満にされる可能性がある)。
Sagivのアルゴリズムでは、削除とマークされたノードは、これらのノードにハンドルを有する動作がないことが確実であるときだけ、割振り解除される。これは、各削除済みノードにタイムスタンプを追加し、削除された時間を示し、処理中のあらゆるルックアップ、挿入、削除動作の開始時間を記録するテーブルを維持することによって達成される。このシステムは、削除済みノードのリストを維持する。圧縮スレッドは、リストを周期的に調べ、タイムスタンプが進行中の動作すべての開始時間以前であるまさにそのノードを削除する。この方式の欠点は、開始時間のテーブルが多数のスレッドによってアクセスされ、これは、テーブルをロックによって保護しなければならないことを意味することである。各動作は、(1つはスレッド−開始時間対をテーブルに追加するため、1つはそれを除去するために)2つのロック獲得および解放を必要とする。
同時ルックアップ/挿入/削除動作は、互いに干渉する可能性があることにより、状況はさらに複雑化される。これは、ある動作中にアクセスを受けるあらゆるノードをロックすること、および任意の抽出されたハンドルによって参照される子または兄弟が読み取られた後だけそれをロック解除することによって回避することができるであろう(これは、文献内で「ロックカップリング」と呼ばれる)。Sagivのアルゴリズムは、動作は通常干渉しないという楽観的な仮定を使用し、この仮定が保証されない場合を検出し、誤りから回復することにより、そのような過剰なロックを回避する。
具体的にするため、動作lookup(k)が、ハンドルhに従うと判断したが、対応するノードAを読み取ることができるようになる前に、別のスレッドがキー−ハンドル対をA内に挿入し、そのプロセスにおいて、Aを2つのノードAとA(Aの新しく割り振られた右兄弟)に分割する場合を考えてみる。ルックアップ動作は、Aを読み取った後で、(k>A.kmaxであるため)Aが分割されたことを検出することができ、(実際に適切な範囲のキーを含む)Aに導くA.hrightハンドルに従うことによりこの状況から回復することができる。しかし、この高価でない回復は、常に可能であるわけではない。動作lookup(k)が、ハンドルhに従うと判断したが、対応するノードAを読み取ることができるようになる前に、圧縮スレッドがノードAを再平衡し(Aは満杯未満になる)、ルックアップが従うべきハンドルを含むAの内容の一部をAの左兄弟Aに移動する場合を考えてみる。ルックアップ動作は、Aを読み取った後で、(k=A.kminであるため)Aが再平衡されたことを検出することができるが、ルックアップはAのハンドルを知らないので、回復するための唯一の方法は、ツリーのルート部でルックアップ動作を再開始することである。
D.左兄弟へのハンドルを維持すること
本発明の第1の態様によれば、発明者等は、再開始を回避するために、インデックスノードの構造を次のように修正することを提案する。
<hleft, kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright>
ただし、hleftは、左兄弟のハンドルであり(左兄弟がある場合であり、そうでない場合はヌルである)、他のフィールドすべては、Sagivのアルゴリズムと同様に定義される。このデータ構造は図3Bに示されており、参照番号300は、修正済みB−Linkデータ構造を指し、参照番号310は、特に左リンク、すなわちhleftを指す。Sagivのアルゴリズムと同様に、ルックアップ動作、挿入動作、削除動作は、インデックスノードAのキー範囲が、その動作が突き止めようとしているキーkを含まないかどうか検出する。Sagivのアルゴリズムと同様に、動作は、右兄弟へのハンドルA.hrightに従うことによってk>A.kmaxに反応する。しかし、Sagivのアルゴリズムは、ルート部で動作を再開始することによってk=A.kminに反応したが、発明者等のアルゴリズムは、左兄弟へのハンドルA.hleftに従うことによって反応する。左兄弟へのハンドルに従うことは、1回の追加読取り動作を必要とするが、ルート部で動作を再開始することは、最大(また典型的には約)d回の読取り動作を必要とすることになり、dはツリーの深さである。
図3Cおよび3Dは、それぞれ従来技術によるSagiv式B−リンクツリー、および本発明による左リンクを含むB−リンクツリーのより詳細な例を提供する。これらは、本発明の左リンク態様をさらに例示し、従来技術から区別するように意図されている。
図3Cは、マッピング{(2,ミラー),(5,スミス),(7,ジョーンズ),(10,ブラウン),(12,レビン),(15,ダール),(17,ルイス),(20,ユ)}を含むSagiv式B−リンクツリーを示す。数はキー値であり、名前は関連データ値である。Pはツリーのプライムノードであり、I1、...、I7はインデックスノードであり、D1、...、D8はデータノードである。プライムノードは、ハンドルのアレイを含むノードであり、各ハンドルは、ツリーのあるレベルの最も左のインデックスノードを指し、プライムノード内の第1のハンドルは、最も左のリーフインデックスノードを指し、最後のハンドルは、ルートインデックスノードを指す。I1は、ツリーのルートノードである(すなわち、親を有していない1つのインデックスノード)。プライムノード内の最後のハンドル(この場合はP[2])に従うことによってルートノードに到達する。I1、I2、I3は、非リーフインデックスノードである(すなわち、インデックスノードの子を有するインデックスノード)。これは、I1.hが非ヌルであり、IsLeaf(I1)(IsLeafについては以下で述べる。セクションF参照)が偽であることを意味する(同じことがI2、I3にも当てはまる)。I4、I5、I6、I7は、リーフインデックスノード、すなわちインデックスノードの子を有していないインデックスノードである。これは、I4.hがヌルであり、IsLeaf(I4)が真であることを意味する(同じことがI5、I6、I7にも当てはまる)。このツリーでは、t=2である。すなわち、各インデックスノードは、kminおよびkmaxに加えて2つのキーを保持することができる。I1、I2、I3は、満杯でない(いくつかのフィールドは未使用であり、陰影付けされている)。Num(I1)(Numについては以下で述べる。セクションF参照)は1である(同じことがI2、I3にも当てはまる)。I1、I2、I3は、それぞれさらに1つのキー−ハンドル対を取ることができる。I4、I5、I6、I7は満杯である。すなわち、未使用のフィールドがない。Num(I4)は2である(I5、I6、I7についても同じ)。
図3Dは、図のように左リンクhleftを含むツリーを示す。このツリーは、図3Cのツリーと同じマッピング{(2,ミラー),(5,スミス),(7,ジョーンズ),(10,ブラウン),(12,レビン),(15,ダール),(17,ルイス),(20,ユ)}を含む。先と同様に、数はキー値であり、名前は関連データ値である。Pはツリーのプライムノードであり、I1、...、I7はインデックスノードであり、D1、...、D8はデータノードである。I1は、ツリーのルートノードである(すなわち、親を有していない1つのインデックスノード)。プライムノード内の最後のハンドル(この場合はP[2])に従うことによってルートノードに到達する。I1、I2、I3は、非リーフインデックスノードである(すなわち、インデックスノードの子を有するインデックスノード)。これは、I1.hが非ヌルであり、IsLeaf(I1)が偽であることを意味する(I2、I3についても同じ)。I4、I5、I6、I7は、リーフインデックスノードである(すなわち、インデックスノードの子を有していないインデックスノード)。これは、I4.hがヌルであり、IsLeaf(I4)が真であることを意味する(I5、I6、I7についても同じ)。このツリーでは、t=2である(すなわち、各インデックスノードは、kminおよびkmaxに加えて2つのキーを保持することができる)。I1、I2、I3は、満杯でない(いくつかのフィールドは未使用であり、陰影付けされている)。Num(I1)は1である(I2、I3についても同じ)。I1、I2、I3は、それぞれさらに1つのキー−ハンドル対を取ることができる。I4、I5、I6、I7は満杯である(すなわち、未使用のフィールドがない)。Num(I4)は2である(I5、I6、I7についても同じ)。
この着想をさらに例示するために、発明者等は、以下、ルックアップが道に迷った場合にルックアップ動作を再開始するためのコードを含む、Sagivのルックアップ動作(上記で引用した非特許文献4から採用)の例示的な擬似コードを作成した(ただし、動作開始時間を追跡するための機構は省略する)。
procedure Lookup(hp: ハンドル, k: キー)
var h: ハンドル, A: ノード;
label start:
P:= Read(hp)
h:= P内の最後のアイテム
repeat
A:= read(h)
if k > A. kmax then
h:= A.hright
else if k = A.kmin then
goto start
else
A.ki-1 < k= A.kiであるようなiを選択する(Num(A) = 0の場合iを0にする)。
h:=A.hi
endif
until Aがリーフである and A.kmin < k = A.kmax
if kがA内に含まれる then
対応する値を返す。
else
ヌルを返す。
endif
endproc
対照的に、以下は本発明によるルックアップルーチンの一実施に対応する例示的な擬似コードである。(図7は、別の例示的なLookupプロシージャの流れ図を示すことに留意されたい。)わかるように、このルーチンは、動作を再開始する代わりに、左リンクに従う。このプロシージャは、図3Eで再現され、ボックス320は、左リンクデータを使用するように設計されたコードの新しい行を囲んでいる。コードのこの新しい行は、キー値kが、ノードAのkminフィールド内に記憶された値以下であるかどうか判定し、そうである場合には、左リンクハンドルをハンドル変数に割り当てる(すなわち、h:=A.hleft)。
procedure Lookup(hp: ハンドル, k: キー)
var h: ハンドル, A: ノード;
P:= Read(hp)
h:= P内の最後のアイテム
repeat
A:= read(h)
if k > A.kmax then
h:= A.hright
else if k = A.kmin then
h:= A.hleft
else
A.ki-1 < k = A.ki であるようなiを選択する(Num (A) = 0の場合iを0にする)。
h:= A.hi
endif
until Aがリーフである and A.kmin < k = A.kmax
if kがA内に含まれる then
対応する値を返す。
else
ヌルを返す。
endif
endproc
E.バージョン番号をハンドルおよびディスクブロックに添着する
次いで、動作開始時間のテーブルを維持することを回避するための本発明の方法について述べる。具体的には、現在好ましい実施形態では、ハンドルおよびノードにバージョン番号、またはアロケータ210(図2)によって返された「割振り単位」を添着することによってこれを行う。上述のように、削除動作によって、または圧縮スレッドによってノードが削除されたとき、同時動作がそれに対するハンドルを有している可能性がある。Sagivのアルゴリズムは、あらゆる削除済みノードに削除時間を示すタイムスタンプを添着することによって、また、あらゆる動作の開始時間を記録することによってこの問題に対処する。削除済みノードは、ノードが削除済みとマークされたときより前に開始された進行中の動作がないときだけ、「ガーベッジコレクション」される。この解決策は、スレッドを開始時間にマッピングするテーブルをシステムが維持することを必要とし、1つはスレッド−開始時間対をテーブルに追加するため、1つはそれを除去するために2つの同期を必要とする。というのは、テーブルがクライアントスレッドによって変化させられ、圧縮スレッドによってアクセスされるからである。
本発明の現在の好ましい実施によれば、各ハンドルに、また各ノードにバージョン番号が添着される。最初に、各ノードは、バージョン番号0を有する。割振り動作(上述)は、ノードを識別するハンドルを返し、ノードのバージョン番号をハンドル内に埋め込む。割振り解除動作は、(ノードのバージョン番号を後続の再割振りに使用可能にするのに加えて)ノードのバージョン番号を増分する。読取り動作は、ノードに加えて、ノードのバージョン番号を返す。読取り動作(すなわち、ルックアップ、挿入、または削除動作)のコーラーは、読取り動作によって返されたバージョン番号が、読み取られたハンドルのバージョン番号と合致するかどうか検査する。バージョン番号が合致しない場合には、ノードが削除されており、その後で、異なるスレッドによって割振り解除されている。この場合には、ルックアップ、挿入、または削除動作が再開始される。
このバージョン採番方式を使用して、ノードが削除済みとマークされつつあるときに、ノードを割振り解除することが可能である。他の最適化として、ある固定された時間間隔の間、削除済みノードを割振り解除するのを延期することができ、これにより、大抵の実行の長い動作を除くすべてについて、再開始する必要がなくなる。
本発明のこの態様の一代替実施形態では、読取り動作は、読み取られつつあったディスクブロックのバージョン番号を返さず、その代わりに、ハンドルのバージョン番号とディスクブロックのバージョン番号が合致しないときはいつでも、例外を挙げる。読取り動作(すなわち、ルックアップ、挿入、または削除動作)のコーラーは、その例外を捕らえ、ルックアップ、挿入、または削除動作を再開始する。
この着想をさらに例示するために、以下はSagivのルックアップ動作(この場合も、上記で引用した非特許文献4から採用)の例示的な擬似コードであり、今度は、動作開始時間を追跡するための機構をも含む。Tは、スレッド識別子を動作開始時間にマッピングするテーブルを参照するグローバル変数である。
procedure Lookup(hp: ハンドル, k: キー)
var h: ハンドル, A: ノード;
label start:
P:= Read(hp)
h:= P内の最後のアイテム
repeat
lock T
insert (このスレッドのID, 現在時間) into T
unlock T
A:= read(h)
if k > A.kmax then
h:= A.hright
else if k= A.kmin then
goto start
else
A.ki-1 < k = A.kiであるようなiを選択する(Num(A) = 0の場合iを0にする)。
h:= A.hi
endif
until Aがリーフである and A.kmin < k= A.kmax
lock T
remove (このスレッドのID, 対応する時間) from T
unlock T
if kがA内に含まれる then
対応する値を返す。
else
ヌルを返す。
endif
endproc
対照的に、以下は本発明によるルックアップルーチンのための擬似コードの一例であり、このルーチンは、テーブルTに対するどんな動作も回避する(本発明は2つの独立した部分からなることを強調するために、このバージョンは、再開始を回避するために左リンクを使用することを組み込まない)。
procedure Lookup(hp: ハンドル, k: キー)
var h: ハンドル, A: ノード;
label start:
P:= Read(hp)
h:= P内の最後のアイテム
repeat
A:= read(h)
if version(A) ≠ version(h) then goto start
if k > A.kmax then
h:= A.hright
else if k = A.kmin then
goto start
else
A.ki-1 < k = A.kiであるようなiを選択する(Num(A) = 0の場合iを0にする)。
h:= A.hi
endif
until Aがリーフである and A.kmin < k = A.kmax
if kがA内に含まれる then
対応する値を返す。
else
ヌルを返す。
endif
endproc
この擬似コードは図3Fにも示され、ボックス330は、コードの新しい行(If version(A)≠version(h) then goto start)を示すことに留意されたい。さらに、この新しい擬似コードは、ロック動作に関してSagivアルゴリズムからのコードの行を含まない。換言すれば、以下のコードが省略されている。
lock T
insert(このスレッドのID,現在時間)into T
unlock T
さらに、コード
lock T
remove(このスレッドのID,対応する時間)from T
unlock T
が除去されている。
当然ながら、本明細書で開示されている2つの改良を組み合わせて、双方の利益を得ることができる。挿入動作および削除動作、ならびに圧縮スレッドの擬似コードは、より著しく複雑であるが、それでもなお十分に当業者の能力の範囲内である。さらに、本発明を組み込むために必要とされる修正は、本明細書を読んだ後で容易になるはずである。
F.例示的なプロシージャの流れ図
図4〜10は、本発明によるアルゴリズムの現在好ましい実施と共に使用することができるいくつかのプロシージャを表す流れ図である。以下の表は、これらの流れ図内で言及されるデータタイプ、表記法、関数(インデックスノードおよびアロケータ関数群)を要約する。
Figure 2004185617
図4は、GetNextHandleという名称のプロシージャの流れ図である。このプロシージャは、インデックスノードXとキーkを取り、(h,isLink)を返し、ただしhは、ツリーの中で、キーkとその関連データ値を含むデータノードにより近いXの子または兄弟を参照するハンドルであり、isLinkは、hがXの兄弟へのリンクであるかどうかを示すブール値である。図4に示すように、このプロシージャは、GetNextHandle(X,k)のためのエントリポイント402で始まる。ステップ404で、このプロシージャは、kがX.kmin以下であるかどうか判定し、ただしX.kminは、インデックスノードXのフィールドkminを指す。X.kmin以下である場合には、このプロシージャは(X.hleft,true)を返し、Xの左兄弟が所望のデータノードにより近いことを示す。X.kmin以下でない場合には、このプロシージャは、kがX.kmaxより大きいかどうか判定し、大きい場合には(X.hright,true)を返し、Xの右兄弟が所望のデータノードにより近いことを示す(ステップ410)。ステップ408で決定され、kがX.kmaxより大きくない場合には、このプロシージャは、Num(X)が0に等しいかどうか判定し(ステップ412)、等しい場合には、ステップ414で(X.h,false)を返す。ステップ416に移動して、このプロシージャは、X.kn−1がk未満であるかどうか判定する。k未満である場合には、このプロシージャは、ステップ418で(X.h,false)を返す。k未満でない場合には、このプロシージャはステップ420に移動し、kがX.k以下であるような最小のiを見つける。次いで、ステップ422で、このプロシージャは、IsLeaf(X)が真であるかどうかテストする。真である場合には、(X.hi+1,false)を返し(ステップ424)、真でない場合には、(X.h,false)を返す(ステップ426)。要するに、図4のプロシージャは、ハンドルと、そのハンドルがノードXの兄弟へのリンクであるかどうかを示すブールフラグとを返す。
図5は、インデックスノードX、キーk、ハンドルhを取り、キーkおよびハンドルhをXに挿入するInsertPairという名称のプロシージャの流れ図である。このプロシージャは、何も返さない。
図5に示すように、このプロシージャは、エントリポイントInsertPair(X,k,h)で始まる(ステップ502)。次いで、ステップ504で、このプロシージャは、Num(X)が0に等しいかどうか判定する。等しい場合には、ステップ506で、図のようにキーkおよびハンドルhがノードXに挿入される。Num(X)が0に等しくない場合には、ステップ508で、このプロシージャはX.kがk未満であるかどうか判定し、k未満でない場合にはステップ510に進み、ここで図のようにキーkおよびハンドルhがノードXに挿入される。一方、このプロシージャは、X.kがk未満であると決定した場合にはステップ512に進み、ここでX.ki−1がk未満であるような最大のiを見つけ、次いでステップ514で、図のようにキーkおよびハンドルhをノードXに挿入する。最後に、ステップ516で、プロシージャが戻る。要するに、キーkおよびハンドルhは、Num(X)が0に等しいかどうか、およびX.kがk未満であるかどうかに応じて、ステップ506、510、または514でノードXに挿入される。
図6は、CreateTreeという名称のプロシージャの流れ図である。このプロシージャは引数を受け取らず、新しいツリーを識別するプライムノードハンドルhを返す。図のように、CreateTreeプロシージャ600は、エントリポイントCreateTree()で始まる(ステップ602)。ステップ604で、ノードXが、(null,−inf,null,+inf,null)と定義される。ステップ606で、ハンドルhが、Alloc(Xのための空間)と定義され、ただし、関数Alloc()は、引数によって与えられたサイズのブロックを割り振り、そのブロックへのハンドルを返す。次に、ステップ608で、このプロシージャは、ハンドルhによって参照されるブロックにノードXを書き込むためにWrite(X,h)を呼び出す。ステップ610で、このプロシージャは、ハンドルhを容れるようにプライムノードPを定義する。ステップ612で、このプロシージャは、Pを記憶するのに十分な大きさのブロックを割り振るために、再び関数Alloc(Pのための空間)を呼び出し、Alloc()は、そのブロックへのハンドルhを返す。ステップ614で、このプロシージャは、ハンドルhによって参照されるブロックにノードPを書き込み、ステップ616で、このプロシージャは、ハンドルhを返すことによって終わる。要するに、このプロシージャは、新しいツリーを識別するプライムノードハンドルhを返す。
図7は、プライムノードハンドルhおよびキーkを取り、データアイテムdまたはヌルを返すLookupという名称のプロシージャの流れ図である。Lookupプロシージャ700は、エントリポイントLookup(h,k)で始まる(ステップ702)。ステップ704で、このプロシージャは、ハンドルhによって指されるブロックを読み取るために、関数Read(h)を呼び出す。Read関数は、(v,P)すなわちブロックのバージョン番号vと、ブロック内に記憶されたプライムノードPとを返す。次に、ステップ706で、ハンドルhが、プライムノードP内の最後のハンドルとして定義され、それによってツリーのルートノードを参照する。ステップ708で、このプロシージャは、ハンドルhによって指されるブロックを読み取るために、再び関数Read()を呼び出す。今度はこの関数は、バージョン番号vと、ハンドルhによって参照されるブロック内に記憶されたインデックスノードXとを返す。ステップ710で、このプロシージャは、h.v(すなわち、ハンドルhのバージョン番号)がvに等しいかどうか判定する。等しくない場合には、このプロシージャは、図のようにステップ704に戻る。等しい場合には、このプロシージャはステップ712に進み、ここで(図4と共に上述した)関数GetNextHandleが呼び出される。この場合には、関数GetNextHandle(X,k)は、ハンドルhと、このハンドルhがノードXの兄弟へのリンクであるかどうかを示すブールのisLinkとを返す。次に、ステップ714で、このプロシージャは、ハンドルhがヌルであるかどうかテストする。ヌルである場合には、このプロシージャはステップ716に進み、ここでヌルが返される。ヌルでない場合には、このプロシージャはステップ718に進み、ここでIsLeaf(X)とnot isLinkがどちらも真であるかどうか判定する。共に真でない場合には、このプロシージャは、図のようにステップ708に戻る。一方、IsLeaf(X)とnot isLinkがどちらも真である場合には、このプロシージャはステップ720に進み、ここで、ハンドルhによって指されるブロックを読み取り、それによってブロックのバージョン番号vと、ブロック内に記憶されたデータノードDとを決定するために、関数Read(h)が呼び出される。次に、ステップ722で、このプロシージャは、h.v(すなわち、ハンドルhのバージョン番号)がvに等しいかどうか判定する。等しくない場合には、このプロシージャは、図のようにステップ704に戻り、等しい場合には、ステップ724に進む。ステップ724で、このプロシージャは、D.kがkに等しいかどうか(すなわち、データノードDのキーがkに等しいかどうか)判定する。等しくない場合には、このプロシージャはステップ726に進み、ここでヌルを返し、等しい場合にはステップ728に進み、D.dすなわちデータノードDのデータ部分を返す。したがって、要するに、Lookupプロシージャは、プライムノードハンドルhおよびキーkを取り、データアイテムdまたはヌルを返す。
図8は、プライムノードハンドルhおよびキーkを取り、ハンドルhによって識別されたツリーからキーとその関連データ値を削除するDeleteという名称のプロシージャの流れ図である。このプロシージャは、何も返さない。
図のように、Deleteプロシージャ800は、エントリポイントDelete(h,k)で始まる(ステップ802)。次に、ステップ804で、このプロシージャは、ハンドルhによって指されるブロックを読み取るために、関数Read(h)を呼び出す。この関数は、ブロックのバージョン番号vと、ブロック内に記憶されたプライムノードPとを返す。次に、ステップ806で、ハンドルhが、ノードP内の最後のハンドルとして定義され、それによってツリーのルートノードを参照する。ステップ808で、ハンドルhによって指されるブロックを読み取り、ブロックのバージョン番号と、ブロック内に含まれるインデックスノードXとを返すために、このプロシージャは再び関数Read()を呼び出す。ステップ810で、このプロシージャは、h.vがvに等しいかどうか、すなわち、ハンドルhのバージョン番号が、先のRead()の呼出しによって返されたバージョン番号と等しいかどうか判定する。等しくない場合には、このプロシージャは、図のようにステップ804に戻り、等しい場合には、ステップ812に進む。ステップ812で、(図4と共に上記で論じた)関数GetNextHandleが引数X,kを伴って呼び出される。このようにして、このプロシージャは、ハンドルhと、このハンドルhがノードXの兄弟へのリンクであるかどうかを示すブールのisLinkとを決定する。次に、ステップ814で、このプロシージャは、IsLeaf(X)とnot isLinkがどちらも真であるかどうかテストし、そうでない場合には、このプロシージャはステップ808に戻り、そうである場合にはステップ816に進む。ステップ816で、このプロシージャは、ハンドルhがヌルであるかどうかテストし、ヌルである場合には、ステップ818に進み、ここで戻る。hがヌルでない場合には、このプロシージャはステップ820に進み、ここで、ハンドルhによって指されるブロックをロックするために、関数Lock(h)が呼び出される。次に、ステップ822で、Read(h)が、ハンドルhによって指されるブロックを読み取り、ブロックのバージョン番号と、ブロック内に含まれるインデックスノードXとを返す。ステップ824で、このプロシージャは、h.vがvに等しいかどうかテストし、等しくない場合にはステップ826に進み、ここでハンドルhによって指されるブロックがロック解除され、その後、このプロシージャは、図のようにステップ804に戻る。一方、h.vがvに等しい場合には、このプロシージャはステップ828(図8の下位区分図8B参照)に進み、ここでこのプロシージャは、キーkがX.kmin以下であるかどうか、すなわち、Xの左兄弟の1つに添着されたデータノード内でキーkが見つかるかどうか判定する。X.kmin以下である場合には、このプロシージャは、ステップ830および832に進み、ここで、ハンドルhによって指されるブロックがロック解除され、次いでハンドルhが、ノードXの左兄弟ハンドルとして定義される。kがX.kmin以下でない場合には、このプロシージャはステップ834に進み、ここでkがX.kmaxより大きいかどうかテストし、大きい場合には、ステップ836および838に進み、ここで、ハンドルhによって指されるブロックをロック解除し、hをノードXの右兄弟ハンドルと定義する。ステップ834で、このプロシージャは、kがX.kmaxより大きくないと決定した場合、ステップ840に進み、ここで、Num(X)が0に等しく、X(リーフレベルのインデックスノード)が子を有していないこと、したがってキーkを含まないことを意味するかどうかテストする。このテストに対する答が「はい」である場合には、このプロシージャはステップ856に進み、「いいえ」である場合には、ステップ842に進む。ステップ842で、このプロシージャは、X.kn−1がk未満であるかどうか、すなわち、ノードXのフィールドkn−1がキー値k未満であるかどうか判定する。k未満である場合には、このプロシージャは、図のようにステップ856に跳び、k未満でない場合にはステップ844に進み、ここで、kがX.k以下であるような最小のiを見つける。次に、ステップ846で、このプロシージャはRead(X,hi+1)を呼び出し、データノードDおよびバージョン番号vを含むブロックを読み取る。次に、ステップ848で、このプロシージャは、D.kがkに等しいかどうかテストする。等しくない場合には、このプロシージャはステップ856に跳び、等しい場合にはステップ850に進み、ここで、ブロックバージョン番号を増分するハンドルX.hi+1によって指されるブロックを割振り解除する。次に、ステップ852で、このプロシージャは、X.kおよびX.hi+1によって識別されたハンドルをノードXから除去する。ステップ854で、ハンドルhによって参照されるノードXを書き込むためにWrite()が呼び出される。最後に、ステップ856および858で、ハンドルhによって指されるブロックがロック解除され、プロシージャが戻る。要するに、Deleteプロシージャは、プライムノードハンドルhおよびキーkを取り、hによって識別されたツリーからキーkとその関連データ値を除去する。
図9は、プライムノードハンドルh、キー値k、データ値dを取り、hによって識別されたツリーにキー値とデータ値を挿入するInsertという名称のプロシージャの流れ図である。Insert関数900は、参照番号901によって識別されたエントリポイントで始まり、呼出しInsert(h,k,d)によって呼び出され、ただし、hはプライムノードハンドル、kはキー値、dはデータ値である。ステップ902で、データノードDがキー値kおよびデータ値dによって定義される。ステップ903で、Dを容れるのに十分な大きさのブロックを割り振るように、Alloc関数が呼び出され、そのブロックを識別するハンドルがhに割り当てられる。次に、ステップ904で、このプロシージャは、ハンドルhによって参照されるブロックにノードDを書き込む。ステップ905で、Lが0に設定され、次いでステップ906で、新しい空スタックとしてSが定義される。さらなる背景を提供するために、発明者等は、ツリーの複数のレベルが兄弟の集合群であることを指摘する。本明細書で使用される用語では、レベル0はリーフインデックスノードすべてを含み、レベル1はその親を含み、以下同様であり、最も高いレベルはルートノードを含む。最も高いレベルの数は、プライムノード内のハンドルの数より1つ少ない(ゼロをベースとするインデックス付けを使用しているためである)。「標的レベル」変数Lは、キー−ハンドル対(k,h)がツリーに挿入されるレベルを識別する。Lを0に設定することは、この対がリーフインデックスノードに挿入されることを意味する。アルゴリズムが展開するにつれて、Lを増分することができ、(修正済み)キー−ハンドル対が、ツリーのより高い方(潜在的には、ルートまでの途中すべて)でインデックスノードに挿入されることを示す。ステップ907で、Read()関数が呼び出され、バージョン番号vと、ブロック内に記憶されたプライムノードPとを識別するように、ハンドルhによって指されるブロックを読み取る。ステップ908で、ノードP内の最後のハンドル(ルートインデックスノード)がhに割り当てられる。ステップ909で、LがノードP内のハンドルの数となるように定義され、これはツリーの中のインデックスノードレベルの数と同一である。ステップ910で、LがLN−1と定義される。L(「現在レベル」)は、挿入プロシージャが現在あるレベルである。Insertはルート(上述のように、レベルLN−1にある)で開始されるため、Lは、この値に初期化され、Insertがツリーの中に下降するにつれて減分される。ステップ912で、Read(h)が呼び出され、バージョン番号vと、ハンドルhによって指されるインデックスノードXとを返す。ステップ913で、このプロシージャは、h.vがvに等しいかどうかテストし、ステップ914で、このプロシージャは、LがLより大きいかどうかテストする。ステップ913および914のテスト双方に対する答が「はい」である場合には、このプロシージャは、ステップ915に進む。一方、ステップ913に対する答が「いいえ」の場合には、このプロシージャは、図のようにステップ906に戻る。ステップ914のテストに対する答が「いいえ」の場合には、このプロシージャは、ステップ920に進む(図9の下位区分図9B参照)。
ステップ915で、このプロシージャは、引数Xおよびkを伴うGetNextHandle関数が呼び出され、それによって、ハンドルh’およびブールのisLinkが返される。前述のように、ブールのisLinkは、ハンドルh’がノードXの兄弟へのリンクであるかどうかを示す。ステップ916で、このプロシージャは、isLinkが真かどうかテストし、真である場合には、ステップ919に向かって分岐する。isLinkが偽である場合には、このプロシージャはステップ917に進み、ここでLを減分する。ステップ918で、このプロシージャは、ハンドルhをスタックS上にプッシュする。ステップ919で、この関数は、h’の値をhに割り当てる。
次いで、図9の下位区分図9Bを参照すると、ステップ920で、このプロシージャは、ハンドルhによって指されるブロックをロックするために、Lock()関数を呼び出す。ステップ921で、このプロシージャは、ハンドルhによって識別されたブロックを読み取り、インデックスノードXおよびバージョン番号vを抽出するRead(h)を呼び出す。ステップ922で、このプロシージャは、h.vがvに等しいかどうかテストする。等しくない場合には、図のようにステップ906(下位区分図9A)に分岐する。一方、h.vがvに等しい場合には、このプロシージャはステップ923に進み、ここで関数IsLeaf(X)が真かどうかテストする。真でない場合には、このプロシージャは、ステップ934(図9の下位区分図9C)に分岐し、真である場合には、ステップ925に進み、ここでX.kn−1がk未満であるかどうかテストする。ステップ925のテストに対する答が「はい」の場合には、このプロシージャはステップ934に分岐し、「いいえ」の場合には、このプロシージャはステップ926に進む。ステップ926で、このプロシージャは、kがX.k未満であるような最小のiを見つける。ステップ927で、このプロシージャは、ハンドルX.hi+1によって識別されたブロックを読み取り、データノードDおよびバージョン番号vを抽出するRead(X.hi+1)を呼び出す。ステップ928で、このプロシージャは、D.kがkに等しいかどうかテストし、等しい場合には、このプロシージャはステップ929に進み、そうでない場合には、ステップ934に分岐する。ステップ929で、このプロシージャは、キー値kおよびデータ値dを含むデータノードとなるようにノードDを定義する。次に、ステップ930で、ノードDをハンドルhi+1によって参照されるブロックに書き込むために、関数Write(D,X.hi+1)が呼び出される。次に、ステップ931で、ハンドルhによって指されるブロックを割振り解除し、ブロックのバージョン番号を増分するために、関数Dealloc(h)が呼び出される。ステップ932で、ハンドルhによって指されるブロックがロック解除され、次いでステップ933で、プロシージャが戻る。
次いで、図9の下位区分図9Cを参照すると、ステップ934で、このプロシージャは、kがX.kminより大きく、かつX.kmax以下であるかどうかテストする。ステップ934のテストに対する答が「はい」の場合には、このプロシージャはステップ941に進み、答が「いいえ」の場合には、このプロシージャはステップ935に進む。ステップ935で、ハンドルhによって指されるブロックがロック解除され、次いでステップ936で、関数GetNextHandleが引数X,kを伴って呼び出され、それによって、ハンドルh’およびブールのisLinkを返す。上述のように、この関数は、ハンドルh’と、このハンドルがノードXの兄弟へのリンクかどうかを示すブールのisLinkとを返す。ステップ937で、このプロシージャは、isLinkが真かどうかテストし、真である場合には、ステップ938に進み、真でない場合には、ステップ920(図9の下位区分図9B参照)に分岐する。ステップ938で、ハンドルhにh’の値が割り当てられ、次いでステップ939で、バージョン番号vと、ハンドルhによって指されるノードXとを決定するために、Read(h)が呼び出される。ステップ940で、このプロシージャは、h.vがvに等しいかどうかテストし、等しい場合には、図のようにステップ936に戻り、等しくない場合には、ステップ906(図9の下位区分図9A)に分岐する。
上述のように、ステップ934で、このプロシージャは、kがX.kminより大きく、かつX.kmax以下であるかどうかテストする。このテストに対する答が「はい」の場合には、このプロシージャはステップ941に進み、ここで、ノードXが満杯かどうかテストする。Xが満杯である場合には、このプロシージャはステップ946(図9の下位区分図9D)に進み、そうでない場合には、ステップ942に進む。ステップ942で、このプロシージャは、キーkおよびハンドルhをノードXに挿入するために、InsertPair(X,k,h)を呼び出す。ステップ943で、ノードXをハンドルhによって参照されるブロックに書き込むために、Write(X,h)が呼び出される。ステップ944で、ハンドルhによって指されるブロックがロック解除され、次いでステップ945で、プロシージャが戻る。
次いで、図9の下位区分図9Dを参照すると、ノードXが満杯の場合には、Xが2つのノードX、Yに分割される。ステップ946で、このプロシージャは、関数IsLeaf(X)が真であるかどうかテストする。真である場合には、このプロシージャはステップ947に進み、真でない場合には、このプロシージャはステップ951に進む。一方ではステップ947、948、949、他方ではステップ951、952、953は、Xがリーフであるか否かに応じて、ノードYおよびXを定義するために実行される。ステップ947および951は、ノードYを定義するために実行され、ステップ948および952は、Yのための空間を割り振るために実行され、ステップ949および953は、ノードXを定義するために実行される。ステップ950で、このプロシージャは、X.kmaxがキー値k未満であるかどうかテストする。k未満でない場合には、このプロシージャはステップ954に進み、ここで、kおよびhをXに挿入するために、引数X、k、hを伴って(図5と共に上述した)関数InsertPairが呼び出される。ステップ955で、ノードYを書き込むためにWrite(Y,h)が呼び出される。同様に、ステップ957で、ノードXを書き込むためにWrite(Y,h)が呼び出される。ステップ950で、X.kmaxがk未満であると決定された場合には、このプロシージャはステップ956に進み、ここで、kおよびhをYに挿入するために関数InsertPair(Y,k,h)が呼び出され、その後、上述のようにステップ955および957が実行される。ステップ958で、Read(h)が呼び出され、この関数は、バージョン番号vと、ハンドルhによって指されるブロック内のプライムノードPとを返す。
次いで、このプロシージャはステップ959に進む(図9の下位区分図9E参照)。
図9の下位区分図9Eを参照すると、ステップ959で、このプロシージャは、ハンドルhがプライムノードP内の最後のハンドルであり、hによって識別されたノードがツリーのルートであることを意味するかどうか判定する。最後のハンドルであれば、このプロシージャはステップ960から966まで進み、最後のハンドルでない場合には、ステップ967から972まで進む。ステップ960で、このプロシージャは、図のようにインデックスノードZを定義する。ステップ961で、Zを保持するのに十分な大きさのブロックを割り振り、そのブロックにハンドルを返すために、関数Alloc(Zのための空間)でハンドルhが定義される。換言すれば、関数Alloc()によってハンドルhが返される。ステップ962で、インデックスノードZをハンドルhによって参照されるブロックに書き込むために、関数Write(Z,h)が呼び出される。ステップ963で、このプロシージャは、hをプライムノードPの端部に添付する。ステップ964で、ノードPをハンドルhによって参照されるブロックに書き込むために、Write(P,h)が呼び出される。次に、ステップ965で、ハンドルhによって指されるブロックがロック解除され、次いで、ステップ966で、プロシージャが戻る。
ステップ959で、hがP内の最後のハンドルであるかどうかのテストに対する答が「いいえ」である場合には、このプロシージャはステップ967に進み、ここで、ハンドルhによって指されるブロックがロック解除される。次いで、ステップ968で、ハンドルhがhに設定される。ステップ969で、キー値kがX.kmaxに設定される。ステップ970で、このプロシージャは、スタックSが空であるかどうか判定し、空でない場合にはステップ971に進み、ここで、スタックS上の最後の値からハンドルhが定義される。一方、Sが空である場合には、このプロシージャはステップ973に進み、ここでハンドルhがP[L]で定義され、次いでステップ974で、LがL+1と定義される。最後に、ステップ972で、LがL+1に設定され、次いで、図のように、このプロシージャはステップ920に戻る(図9の下位区分図9B参照)。
要するに、図9(下位区分図9Aから図9E)のInsertプロシージャは、プライムノードハンドルh、キー値k、データ値dを取り、キー−データ対をhによって識別されたツリーに挿入する。
図10は、Compressという名称のプロシージャの流れ図である。このプロシージャは、プライムノードハンドルhを取り、そのノードを圧縮し、バックグラウンドプロセスによって実行されるため、返さない。Compressプロシージャ1000は、呼出しCompress(h)によりエントリポイント1002で始まる。ステップ1004で、Read(h)が呼び出され、この関数は、バージョン番号vと、ハンドルhによって指されるプライムノードPとを返す。ステップ1006で、インデックスiが1に設定される。ステップ1008で、このプロシージャは、ノードP内のハンドルの数がiより大きいかどうかテストする。P内のハンドルの数がiより大きい場合には、このプロシージャはステップ1010に進み、引数P[i]を伴う関数CompressLevelを呼び起こす。この関数については、図11と共に以下で述べる。手短に言えば、CompressLevel()は、インデックスノードハンドルhを取り、そのハンドルによって指されるインデックスノードと、その右兄弟すべてを圧縮した関数である。ステップ1012で、インデックスiがi+1に設定され、次いで、このプロシージャは、判断ステップ1008に戻る。ステップ1008で、P内のハンドルの数がiより大きくないと決定された場合には、このプロシージャはステップ1014に進み、ここで、ハンドルhがノードP内の最後のハンドルに設定される。次に、ステップ1016で、ハンドルhによって指されるブロックがロックされ、次いでステップ1018で、Read(h)が呼び出され、この関数は、バージョン番号vと、ハンドルhによって指されるノードXとを返す。次に、ステップ1020で、このプロシージャは、Num(X)が0に等しく、かつX.hrightがヌルに等しく、かつnot IsLeaf(X)がすべて真であるかどうかテストする。そうである場合には、このプロシージャはステップ1022に進み、バージョン番号vとプライムノードPを返すRead(h)を呼び出す。ステップ1020でこのテストに対する答が「いいえ」の場合には、このプロシージャはステップ1032に跳び、ハンドルhによって指されるブロックをロック解除する。ステップ1022が実行された後で、このプロシージャはステップ1024に移り、hがP内の最後のハンドルであるかどうか(すなわち、hがツリーのルートノードを指しているかどうか)テストされ、最後のハンドルでない場合には、このプロシージャはステップ1032に跳び、最後のハンドルである場合には、ステップ1026に進む。ステップ1026で、このプロシージャは、最後のハンドルをPから除去し、ステップ1028で、ハンドルhによって参照されるノードPを書き込む。次に、ステップ1030で、このプロシージャは、ハンドルhによって指されるブロックを割振り解除し、次いで、ステップ1032に進み、ここで、ハンドルhによって指されるブロックをロック解除する。最後に、ステップ1034で、このプロシージャは休止し、次いで、図のようにステップ1004に戻る。要するに、このプロシージャは、ハンドルhによって識別されたツリーを圧縮する。
CompressLevelプロシージャ1100は、呼出しCompressLevel(h)によりエントリポイント1101で始まる。ステップ1102で、変数aが0に設定され、ステップ1103で、hがヌルに設定される。次に、ステップ1104で、このプロシージャは、ハンドルhがヌルであるかどうかテストし、ヌルである場合にはステップ1105に進み、ここでプロシージャが戻る。hがヌルでない場合には、このプロシージャはステップ1106に進み、ハンドルhによって指されるブロックをロックする。次に、ステップ1107で、Read(h)が呼び出され、インデックスノードXとそのバージョン番号vを読み取る。ステップ1108で、このプロシージャは、ハンドルhがヌルであるかどうかテストする。hがヌルである場合には、このプロシージャはステップ1115(図11の下位区分図11B)に分岐し、hがヌルでない場合には、このプロシージャはステップ1109に進み、ここで変数aが−1に設定される。次に、ステップ1110で、インデックスiがゼロに設定され、次いでステップ1111で、このプロシージャは、Num(X)がi以上であるかどうか試験する。すなわち、このプロシージャは、関数Num(X)によって返された数nがインデックスi以上であるかどうかテストする。i以上でない場合には、このプロシージャはステップ1115(図11の下位区分図11B)に分岐し、i以上である場合には、ステップ1112に進む。ステップ1112で、このプロシージャは、ノードXのi番目の子へのハンドル(すなわち、X.h)がハンドルhに等しいかどうかテストする。等しくない場合には、このプロシージャはステップ1114に進み、インデックスiを増分し、次いでステップ1111に戻る。X.hがハンドルhに等しい場合には、このプロシージャはステップ1113に進み、ここで変数aがインデックスiの値に設定される。
次いで、図11の下位区分図11Bを参照すると、ステップ1115で、このプロシージャは、ハンドルhがヌルであるか、または変数aが−1にもNum(X)にも等しくないかテストする。ステップ1115のテストに対する答が「いいえ」の場合には、このプロシージャは、ステップ1116から1118まで進み、次いで、図のようにステップ1104に戻る。ハンドルhによって指されるブロックをロック解除し、hをインデックスノードXのフィールドhrightに設定し、次いで、ハンドルhをヌルに設定するために、ステップ1116から1118が実行される。
ステップ1115のテストに対する答が「はい」の場合には、このプロシージャは、ステップ1119で始まる一連のステップを実行し、ステップ1119で、ハンドルhがヌルであるかどうかテストする。hがヌルである場合には、このプロシージャは、ステップ1120で変数aを0に設定する。ハンドルhがヌルでない場合には、このプロシージャは、ステップ1122でaを増分する。次いで、ステップ1121で、ハンドルhがX.hに設定される。ステップ1123で、ハンドルhによって指されるブロックがロックされ、次いでステップ1124で、インデックスノードAとその関連バージョン番号vを読み取るために、関数Read(h)が呼び出される。ステップ1125で、ハンドルhがA.hrightに設定される。次に、ステップ1126で、このプロシージャは、ハンドルhがヌルであるかどうかテストする。ヌルである場合には、ステップ1131から1133が実行される。すなわち、ハンドルhによって指されるブロックがロック解除され、ハンドルhによって指されるブロックがロック解除され、次いでプロシージャが戻る。一方、ハンドルhがヌルでない場合には、このプロシージャはステップ1127に進み、ハンドルhによって指されるブロックをロックする。次に、ステップ1128で、バージョン番号vとノードBを決定するためにRead(h)が呼び出される。ステップ1129で、B.hleftがハンドルhの値に設定される。次に、ステップ1130で、bが0に設定される。
CompressLevelプロシージャの残りのステップは、図11の下位区分図11Cに示されている。この下位区分を参照すると、ステップ1134で、このプロシージャは、X.hがhであるかどうかテストする。hである場合にはステップ1144に進み、そうでない場合には、ステップ1135に進む。ステップ1135で、変数bが増分され、ステップ1136で、このプロシージャは、Num(X)がb以上であるかどうかテストする。b以上である場合には、このプロシージャは、図のようにステップ1134に戻る。b以上でない場合には、このプロシージャはステップ1137に進み、ハンドルhによって指されるブロックをロック解除する。次に、ステップ1138で、このプロシージャは、ハンドルhによって指されるブロックをロック解除し、ステップ1139で、ハンドルhによって指されるブロックをロック解除する。ステップ1140で、このプロシージャは、B.kmaxがX.kmax未満であるかどうかテストする。X.kmax未満でない場合には、このプロシージャは、ハンドルhがX.hrightに設定されるステップ1143を実行する。ステップ1140で決定され、B.kmaxがX.kmax未満である場合には、このプロシージャはステップ1141に進み、Num(A)がt未満であるか、またはNum(B)がt未満であるかテストする。これらのどちらかが真である場合には、このプロシージャはステップ1142に進み、ハンドルhをヌルに設定し、次いで、図のようにステップ1104(図11の下位区分図11A)に戻る。
ステップ1144で、このプロシージャは再び、Num(A)がt未満であるか、またはNum(B)がt未満であるかテストする。どちらもt未満でない場合には、このプロシージャは、図のようにステップ1152から1154まで進み、そこからステップ1150および1151に進み、その後、このプロシージャはステップ1104(図11の下位区分図11B)に戻る。ステップ1144のテストに対する答が「はい」の場合には、このプロシージャは、図のようにステップ1145、1146、1147、1148、1149に進む(これらのステップは、現時点までに自明であるはずであり、順序正しく実行されないことは自明である)。これらのステップが実行された後で、このプロシージャは、ノードBが削除されているかどうかテストし、削除されている場合には、ステップ1104に戻る。Bが削除されていない場合には、このプロシージャは、ステップ1151でhをhに設定する。
図12は、MergeNodesという名称のプロシージャの流れ図である。このプロシージャは、名前が暗示するようにノードをマージする。すなわち、インデックスノードX、A、B(ただし、AはBの左兄弟であり、Xはそれらの親である)、および、これらのノードを参照するインデックスノードハンドルh、h、hを取り、AおよびBの内容をAにマージし、そのプロセスの中でBを捨てる。MergeNodesプロシージャ1200は、図のように、エントリポイント1202で始まり、呼出しMergeNodes(X,A,B,h,h,h)で呼び出される。ステップ1204で、このプロシージャは、IsLeaf(A)が真であるかどうかテストする。x−sLeaf(X)が、X.hがヌルの場合のみ真を返す関数であることを想起されたい。IsLeaf(A)が真である場合には、このプロシージャはステップ1206を実行し、偽の場合には、このプロシージャはステップ1210を実行する。ステップ1206および1210は、対応するブロック内に示されている値をノードAに割り当てる。次に、ステップ1208で、このプロシージャは、ノードBに関して示されている動作を実行する。ステップ1212で、ノードXが図のように定義される。次いで、ノードA、X、Bを書き込み、ハンドルh、h、hをロック解除し、ハンドルhによって識別されたインデックスノードBを割振り解除するために、ステップ1214から1228が実行される。このプロシージャは、ステップ1228で戻る。
図13は、MoveToLeftという名称のプロシージャの流れ図である。このプロシージャは、ノードを左に移動させるために実行され、インデックスノードの内容の一部をその左兄弟に移動するために実行される。MoveToLeftプロシージャ1300は、呼出しMoveToLeft(X,A,B,h,h,h)によりエントリポイント1302で始まる。ステップ1304で、変数mが1/2Num(B)−1/2Num(A)と定義される。関数Num(X)がnを返し、ただし、Xがインデックスノード(hleft, kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright)であることを想起されたい。したがって、Num(X)は整数nを返し、ただしnは、ノードXの最後の子のハンドルのインデックスである。
ステップ1306で、このプロシージャは、IsLeaf(A)が真であるかどうか(すなわち、A.hがヌルであるかどうか)テストする。真である場合には、このプロシージャは、図のようにステップ1308および1310を実行し、真でない場合には、このプロシージャはステップ1314および1316を実行する。これらのステップは、対応するブロック内に示されている値をノードAおよびBに割り当てる。
ステップ1312から1330は、インデックスノードA、X、Bを書き込み、ロック解除し、次いで戻る。
図14は、インデックスノードX、A、B、およびインデックスノードハンドルh、h、hを取るMoveToRightという名称のプロシージャの流れ図である。ステップ1402から1406は、1404で、変数nが1/2Num(B)−1/2Num(A)ではなく1/2Num(A)+1/2Num(B)と定義されることを除いて、直接、上述したステップ1302から1306と同様である。プロシージャ1400の残りのステップは、上述したプロシージャ1300の対応するステップと同様であるが、右移動関数を実施するために修正される。これらの違いは、当業者には明らかであり、ここでは述べないことにする。
G.結論
上述のように、本発明の例示的な実施形態について、様々なコンピューティングデバイスおよびネットワークアーキテクチャと共に述べたが、基礎となる概念は、B−Linkまたは他のデータ構造をトラバースするのに、かつ/またはB−Linkまたは他のデータ構造と共に他の機能を実行するのに望ましいどのコンピューティングデバイスまたはシステムにも適用することができる。したがって、上述したプロシージャおよびシステムは、様々な応用例およびデバイスに適用することができる。本明細書では、例示的なデータ構造、プログラミング言語、名前、および例が様々な選択の代表として選択されているが、これらは制限しないものとする。
本明細書に述べられている様々な技法は、ハードウェアまたはソフトウェアと、あるいは適切な場合には、双方の組合せと共に実施することができる。したがって、本発明の方法および装置、または本発明のある態様または一部分は、フロッピー(登録商標)ディスク、CD−ROM、ハードドライブ、または任意の他の機械可読記憶媒体など、有形媒体内で実施されるプログラムコード(すなわち、命令)の形態を取ることができ、プログラムコードがコンピュータなどマシンにロードされ、マシンによって実行されたとき、そのマシンは、本発明を実施するための装置になる。プログラム可能なコンピュータ上でプログラムコードを実行する場合には、そのコンピューティングデバイスは一般に、プロセッサ、プロセッサによって読取り可能な(揮発性/不揮発性のメモリおよび/または記憶要素を含む)記憶媒体、少なくとも1つの入力デバイス、および、少なくとも1つの出力デバイスを含む。たとえばデータ処理用APIなどの使用を介して本発明のデバッグ用インターフェース態様を使用することができる1つまたは複数のプログラムは、コンピュータシステムと通信するために、上位手続き型またはオブジェクト指向型プログラミング言語の形で実施されることが好ましい。しかし、望むなら、プログラム(群)をアセンブリ言語または機械語で実施することができる。どのような場合でも、言語は、コンパイラ言語またはインタプリタ言語とすること、またハードウェア実装と組み合わせることができる。
本発明の方法および装置は、電気配線またはケーブルを介して、光ファイバを介して、または任意の他の形態の伝送を介してなど、何らかの伝送媒体を介して伝送されるプログラムコードの形態で実施される通信を介して実施することができ、このプログラムコードは、ゲートアレイ、プログラム可能な論理デバイス(PLD)、クライアントコンピュータなど、マシンによって受信され、マシン内にロードされ、実行される。このプログラムコードは、汎用プロセッサ上で実施されたとき、プロセッサとあいまって、本発明の機能を呼び出すように動作する独自の装置を提供する。さらに、本発明と共に使用される記憶技法は、常にハードウェアとソフトウェアの組合せとすることができる。
以上、本発明について現在好ましい実施形態と共に述べたが、本発明の同じ機能を実行するために、本発明から逸脱することなしに、他の同様な実施形態を使用することができ、または、上述の実施形態に修正または追加を加えることができることを理解されたい。たとえば、当業者なら、本明細書に述べられている本発明を、有線であろうと無線であろうと、任意のコンピューティングデバイスまたは環境に適用することができること、また、通信ネットワークを介して接続され、そのネットワークを跨いで相互作用する任意の数のそのようなコンピューティングデバイスに適用することができることを理解するであろう。さらに、特に無線でネットワーク化されたデバイスの数が急増し続けているので、ハンドヘルドデバイス用オペレーティングシステム、および他の特定用途向けオペレーティングシステムを含む様々なコンピュータプラットフォームが企図されていることを強調すべきである。さらに、本発明は、複数の処理用チップまたはデバイス内で、またはそれらを跨いで実施することができ、同様に、複数のデバイスを跨いで記憶を実施することができる。したがって、本発明は、どの単一の実施形態にも限定するべきでなく、むしろ添付の特許請求の範囲の広さと範囲内で解釈するべきである。
本発明に適した例示的なコンピューティング環境の概略図である。 本発明に適した例示的なコンピューティング環境の概略図であり、(それだけには限らないが)データベースなど持続性ストア内に記憶されたB−リンク−ツリーデータ構造の一例を示す。 従来技術によるB−リンク−ツリーの単純化された概略図である。 本発明の一態様によるB−リンク−ツリーの概略図である。 従来技術によるSagiv式B−リンク−ツリーの例の図である(下記の考察参照)。 本発明による左リンクを含むB−リンク−ツリーの例の図である。 左兄弟へのリンクを使用するLookupプロシージャのための擬似コードの例の図である。 バージョン番号を使用するLookupプロシージャのための擬似コードの例の図である。 プロシージャGetNextHandleの流れ図であり、このプロシージャは、インデックスノードXとキーkを取り、(h,isLink)を返し、ただしhはハンドルであり、isLinkは、hがXの兄弟へのリンクであるかどうかを示すブール値である。 インデックスノードX、キーk、ハンドルhを取り、キー−ハンドル対をXに挿入するプロシージャInsertPairの流れ図である。 新しいツリーを識別するプライムノードハンドルhを返すプロシージャCreateTreeの流れ図である。 プライムノードハンドルhおよびキーkを取り、データアイテムdまたはヌルを返すプロシージャLookupの流れ図である。 プライムノードハンドルhおよびキーkを取り、hによって識別されたツリーからキーとその関連データ値を削除するプロシージャDeleteの流れ図である。 プライムノードハンドルh、キー値k、データ値dを取り、hによって識別されたツリーにキー値とデータ値を挿入するプロシージャInsertの流れ図である。 プライムノードハンドルh、キー値k、データ値dを取り、hによって識別されたツリーにキー値とデータ値を挿入するプロシージャInsertの流れ図である。 プライムノードハンドルh、キー値k、データ値dを取り、hによって識別されたツリーにキー値とデータ値を挿入するプロシージャInsertの流れ図である。 プライムノードハンドルh、キー値k、データ値dを取り、hによって識別されたツリーにキー値とデータ値を挿入するプロシージャInsertの流れ図である。 プライムノードハンドルh、キー値k、データ値dを取り、hによって識別されたツリーにキー値とデータ値を挿入するプロシージャInsertの流れ図である。 プライムノードハンドルhを取り、hによって識別されたツリーを圧縮するバックグラウンドプロシージャCompressの流れ図である。 あるレベルを圧縮するプロシージャCompressLevelの流れ図である。 あるレベルを圧縮するプロシージャCompressLevelの流れ図である。 あるレベルを圧縮するプロシージャCompressLevelの流れ図である。 2つのノードをマージするプロシージャMergeNodesの流れ図である。 ノードの一部をその左兄弟に移動するプロシージャMoveToLeftの流れ図である。 ノードの一部をその右兄弟に移動するプロシージャMoveToRightの流れ図である。
符号の説明
100 コンピューティングシステム環境
110 コンピュータ
120 処理装置
130 システムメモリ
121 システムバス
131 ROM
132 RAM
133 基本入出力システム(BIOS)
134 オペレーティングシステム
135 アプリケーションプログラム
136 他のプログラムモジュール
137 プログラムデータ
140 インターフェース
141 ハードディスクドライブ
144 オペレーティングシステム
145 アプリケーションプログラム
146 他のプログラムモジュール
147 プログラムデータ
150 インターフェース
151 磁気ディスクドライブ
152 取外し式の不揮発性磁気ディスク
155 光ディスクドライブ
156 取外し式の不揮発性光ディスク
160 ユーザ入力インターフェース
161 ポインティングデバイス
162 キーボード
170 ネットワークインターフェースまたはアダプタ
171 ローカルエリアネットワーク(LAN)
172 モデム
173 広域ネットワーク(WAN)
180 リモートコンピュータ
181 メモリ記憶デバイス
185 リモートアプリケーションプログラム
190 ビデオインターフェース
191 モニタ
195 出力周辺機器インターフェース
196 プリンタ
197 スピーカ
200 情報検索システム
202 サーバ
204 データベース
210 アロケータ
206 B−リンク−ツリー
300 B−リンクツリー
302 右リンク
304 データノード
306 インデックスノード
310 左リンク

Claims (18)

  1. コンピュータと、前記コンピュータに動作可能に接続されたデータベースとを備える情報管理システムであって、
    前記データベースは、ディスクブロックに関連付けられた複数のノードと、前記ノード内に記憶されたハンドルとを備えるBツリーデータ構造を含み、少なくとも1つの左リンクハンドルhleftが、そのノードの左兄弟への各ノード点内に記憶されることを特徴とするシステム。
  2. キーkに対してルックアップ動作を行う機構をさらに備え、前記Bツリーをトラバースする際に、前記ルックアップ動作は、所与のノード部で、そのノードの前記左リンクハンドルhleftを参照し、前記キーkが、前記ノード内に記憶された値kmin以下である場合に、前記ノードの左兄弟にアクセスすることを特徴とする請求項1に記載の情報管理システム。
  3. 挿入動作を行う機構をさらに備えることを特徴とする請求項2に記載の情報管理システム。
  4. 前記挿入動作は、インデックスノードAのキー範囲に、前記動作が突き止めようとしている前記キーkが含まれないかどうか検出し、前記挿入動作は、k≦A.kminのとき前記左兄弟へのハンドルA.hleftに従うことを特徴とする請求項3に記載の情報管理システム。
  5. 削除動作を行う機構をさらに備えることを特徴とする請求項2に記載の情報管理システム。
  6. 前記削除動作は、インデックスノードAのキー範囲に、前記動作が突き止めようとしている前記キーkが含まれないかどうか検出し、前記動作は、k≦A.kminのとき前記左兄弟へのハンドルA.hleftに従うことを特徴とする請求項5に記載の情報管理システム。
  7. 挿入動作および削除動作を行う機構をさらに備え、前記ルックアップ動作、挿入動作、削除動作は、インデックスノードAのキー範囲に、前記動作が突き止めようとしている前記キーkが含まれないかどうか検出し、前記動作は、k≦A.kminのとき前記左兄弟へのハンドルA.hleftに従うことを特徴とする請求項2に記載の情報管理システム。
  8. 前記Bツリーデータ構造は、<hleft, kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright>という構造を有する少なくとも1つのインデックスノードを備え、ただし、hleftは左兄弟のハンドルであり、残りのデータ要素(kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright)は、B−リンクツリーデータ構造によるハンドルおよびキーであることを特徴とする請求項1に記載の情報管理システム。
  9. ディスクブロックに関連付けられた複数のノードと、前記ノード内に記憶されたハンドルとを備え、少なくとも1つの左リンクハンドルhleftが、そのノードの左兄弟への各ノード点内に記憶される、コンピュータ可読媒体上で記憶されるBツリーデータ構造。
  10. <hleft, kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright>という構造を有する少なくとも1つのインデックスノードを備え、ただし、hleftは左兄弟のハンドルであり、残りのデータ要素(kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright)は、B−リンクツリーデータ構造によるハンドルおよびキーであることを特徴とする請求項9に記載のデータ構造。
  11. 複数のノードと、前記ノード内に記憶されたハンドルとを備えるデータ構造を維持することを含む、コンピュータによって実施される方法であって、少なくとも1つの左リンクハンドルhleftが、そのノードの左兄弟への各ノード点内に記憶される方法。
  12. 前記方法は、キーkに対してルックアップ動作を行うことをさらに含み、前記ルックアップ動作は、前記データ構造をトラバースすること、および、所与のノード部で、そのノードの前記左リンクハンドルhleftを参照し、前記キーkが、前記ノード内に記憶された値kmin以下である場合に、前記ノードの左兄弟にアクセスすることを含むことを特徴とする請求項11に記載の方法。
  13. 挿入動作を行うことをさらに含むことを特徴とする請求項12に記載の方法。
  14. 前記挿入動作は、インデックスノードAのキー範囲に、前記動作が突き止めようとしている前記キーkが含まれないかどうか検出し、前記動作は、k≦A.kminのとき前記左兄弟へのハンドルA.hleftに従うことを特徴とする請求項13に記載の方法。
  15. 削除動作を行う機構をさらに備えることを特徴とする請求項12に記載の方法。
  16. 前記削除動作は、インデックスノードAのキー範囲に、前記動作が突き止めようとしている前記キーkが含まれないかどうか検出し、前記動作は、k≦A.kminのとき前記左兄弟へのハンドルA.hleftに従うことを特徴とする請求項15に記載の方法。
  17. 挿入動作および削除動作を行うことをさらに含み、前記ルックアップ動作、挿入動作、削除動作は、インデックスノードAのキー範囲に、前記動作が突き止めようとしている前記キーkが含まれないかどうか検出し、前記動作は、k≦A.kminのとき前記左兄弟へのハンドルA.hleftに従うことを特徴とする請求項12に記載の方法。
  18. 前記データ構造は、<hleft, kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright>という構造を有する少なくとも1つのインデックスノードを備え、ただし、hleftは左兄弟のハンドルであり、残りのデータ要素(kmin, h0, k0, h1, k1, ..., hn-1, kn-1, hn, kmax, hright)は、B−リンクツリーデータ構造によるハンドルおよびキーであることを特徴とする請求項11に記載の方法。
JP2003396398A 2002-12-02 2003-11-26 左リンクを使用してツリーをトラバースするアルゴリズム Expired - Fee Related JP4542769B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US10/308,293 US7007027B2 (en) 2002-12-02 2002-12-02 Algorithm for tree traversals using left links

Publications (2)

Publication Number Publication Date
JP2004185617A true JP2004185617A (ja) 2004-07-02
JP4542769B2 JP4542769B2 (ja) 2010-09-15

Family

ID=32312219

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003396398A Expired - Fee Related JP4542769B2 (ja) 2002-12-02 2003-11-26 左リンクを使用してツリーをトラバースするアルゴリズム

Country Status (3)

Country Link
US (2) US7007027B2 (ja)
EP (1) EP1426878A3 (ja)
JP (1) JP4542769B2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010503094A (ja) * 2006-09-12 2010-01-28 インターナショナル・ビジネス・マシーンズ・コーポレーション データを管理するためのシステム、方法、及びコンピュータ・プログラム
WO2013098918A1 (ja) * 2011-12-26 2013-07-04 株式会社日立製作所 データベースシステム及びデータベース管理方法

Families Citing this family (55)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8352400B2 (en) 1991-12-23 2013-01-08 Hoffberg Steven M Adaptive pattern recognition based controller apparatus and method and human-factored interface therefore
US7966078B2 (en) 1999-02-01 2011-06-21 Steven Hoffberg Network media appliance system and method
US7072904B2 (en) * 2002-12-02 2006-07-04 Microsoft Corporation Deletion and compaction using versioned nodes
US7730087B2 (en) * 2003-02-28 2010-06-01 Raining Data Corporation Apparatus and method for matching a query to partitioned document path segments
US6961733B2 (en) * 2003-03-10 2005-11-01 Unisys Corporation System and method for storing and accessing data in an interlocking trees datastore
US20060101018A1 (en) 2004-11-08 2006-05-11 Mazzagatti Jane C Method for processing new sequences being recorded into an interlocking trees datastore
US8516004B2 (en) * 2003-09-19 2013-08-20 Unisys Corporation Method for processing K node count fields using an intensity variable
US7340471B2 (en) 2004-01-16 2008-03-04 Unisys Corporation Saving and restoring an interlocking trees datastore
US7593923B1 (en) 2004-06-29 2009-09-22 Unisys Corporation Functional operations for accessing and/or building interlocking trees datastores to enable their use with applications software
US7761474B2 (en) * 2004-06-30 2010-07-20 Sap Ag Indexing stored data
US7747599B1 (en) 2004-07-23 2010-06-29 Netlogic Microsystems, Inc. Integrated search engine devices that utilize hierarchical memories containing b-trees and span prefix masks to support longest prefix match search operations
US7725450B1 (en) 2004-07-23 2010-05-25 Netlogic Microsystems, Inc. Integrated search engine devices having pipelined search and tree maintenance sub-engines therein that maintain search coherence during multi-cycle update operations
US8886677B1 (en) 2004-07-23 2014-11-11 Netlogic Microsystems, Inc. Integrated search engine devices that support LPM search operations using span prefix masks that encode key prefix length
US7213041B2 (en) 2004-10-05 2007-05-01 Unisys Corporation Saving and restoring an interlocking trees datastore
US8117170B2 (en) * 2004-10-06 2012-02-14 International Business Machines Corporation Transient range versioning based on redirection
US7716241B1 (en) 2004-10-27 2010-05-11 Unisys Corporation Storing the repository origin of data inputs within a knowledge store
US7908240B1 (en) 2004-10-28 2011-03-15 Unisys Corporation Facilitated use of column and field data for field record universe in a knowledge store
US7348980B2 (en) 2004-11-08 2008-03-25 Unisys Corporation Method and apparatus for interface for graphic display of data from a Kstore
US7499932B2 (en) * 2004-11-08 2009-03-03 Unisys Corporation Accessing data in an interlocking trees data structure using an application programming interface
US20070162508A1 (en) * 2004-11-08 2007-07-12 Mazzagatti Jane C Updating information in an interlocking trees datastore
US7676477B1 (en) 2005-10-24 2010-03-09 Unisys Corporation Utilities for deriving values and information from within an interlocking trees data store
US7627574B2 (en) * 2004-12-16 2009-12-01 Oracle International Corporation Infrastructure for performing file operations by a database server
US7512617B2 (en) * 2004-12-29 2009-03-31 Sap Aktiengesellschaft Interval tree for identifying intervals that intersect with a query interval
US7499927B2 (en) * 2005-02-24 2009-03-03 International Business Machines Corporation Techniques for improving memory access patterns in tree-based data index structures
US7409380B1 (en) 2005-04-07 2008-08-05 Unisys Corporation Facilitated reuse of K locations in a knowledge store
US20060265396A1 (en) * 2005-05-19 2006-11-23 Trimergent Personalizable information networks
US20060265394A1 (en) * 2005-05-19 2006-11-23 Trimergent Personalizable information networks
US20060265395A1 (en) * 2005-05-19 2006-11-23 Trimergent Personalizable information networks
US7389301B1 (en) 2005-06-10 2008-06-17 Unisys Corporation Data aggregation user interface and analytic adapted for a KStore
JP4670496B2 (ja) * 2005-06-14 2011-04-13 住友電気工業株式会社 光受信器
CN100418092C (zh) * 2006-02-20 2008-09-10 南京联创科技股份有限公司 海量数据内存数据库中快速定位的网格+t树索引的方法
US20070214153A1 (en) * 2006-03-10 2007-09-13 Mazzagatti Jane C Method for processing an input particle stream for creating upper levels of KStore
US20070220069A1 (en) * 2006-03-20 2007-09-20 Mazzagatti Jane C Method for processing an input particle stream for creating lower levels of a KStore
US20080275842A1 (en) * 2006-03-20 2008-11-06 Jane Campbell Mazzagatti Method for processing counts when an end node is encountered
US7734571B2 (en) * 2006-03-20 2010-06-08 Unisys Corporation Method for processing sensor data within a particle stream by a KStore
US7689571B1 (en) 2006-03-24 2010-03-30 Unisys Corporation Optimizing the size of an interlocking tree datastore structure for KStore
US8238351B2 (en) * 2006-04-04 2012-08-07 Unisys Corporation Method for determining a most probable K location
US7676330B1 (en) 2006-05-16 2010-03-09 Unisys Corporation Method for processing a particle using a sensor structure
US7697518B1 (en) * 2006-09-15 2010-04-13 Netlogic Microsystems, Inc. Integrated search engine devices and methods of updating same using node splitting and merging operations
JP4933222B2 (ja) * 2006-11-15 2012-05-16 株式会社日立製作所 インデックス処理方法及び計算機システム
US7953721B1 (en) 2006-11-27 2011-05-31 Netlogic Microsystems, Inc. Integrated search engine devices that support database key dumping and methods of operating same
US7987205B1 (en) 2006-11-27 2011-07-26 Netlogic Microsystems, Inc. Integrated search engine devices having pipelined node maintenance sub-engines therein that support database flush operations
US7831626B1 (en) 2006-11-27 2010-11-09 Netlogic Microsystems, Inc. Integrated search engine devices having a plurality of multi-way trees of search keys therein that share a common root node
US8086641B1 (en) 2006-11-27 2011-12-27 Netlogic Microsystems, Inc. Integrated search engine devices that utilize SPM-linked bit maps to reduce handle memory duplication and methods of operating same
US8627111B2 (en) * 2008-04-23 2014-01-07 Hewlett-Packard Development Company, L.P. Managing associations between keys and values
US8055613B1 (en) * 2008-04-29 2011-11-08 Netapp, Inc. Method and apparatus for efficiently detecting and logging file system changes
EP2256660B1 (en) * 2009-05-28 2015-08-12 Sap Se Computer-implemented method, computer system, and computer program product for optimization of evaluation of a policy specification
US8412881B2 (en) * 2009-12-22 2013-04-02 Intel Corporation Modified B+ tree to store NAND memory indirection maps
EP2751667A4 (en) * 2011-08-29 2015-07-15 Intel Corp PARALLEL OPERATION B UP + TREES
US8650219B2 (en) 2012-06-05 2014-02-11 International Business Machines Corporation Persistent iteration over a database tree structure
US9361332B2 (en) * 2013-03-15 2016-06-07 International Business Machines Corporation Index record-level locking for file systems using a B+ tree structure
JP5902137B2 (ja) 2013-09-24 2016-04-13 株式会社東芝 ストレージシステム
US10114559B2 (en) 2016-08-12 2018-10-30 International Business Machines Corporation Generating node access information for a transaction accessing nodes of a data set index
US10528479B2 (en) * 2017-06-02 2020-01-07 Huawei Technologies Co., Ltd. Global variable migration via virtual memory overlay technique for multi-version asynchronous dynamic software update
US11663186B2 (en) * 2021-02-17 2023-05-30 Vmware, Inc. Enhanced locking mechanism for B+ tree data structures

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06505816A (ja) * 1990-10-05 1994-06-30 マイクロソフト コーポレイション 情報検索システム及び方法
WO2002044940A2 (en) * 2000-11-30 2002-06-06 Coppereye Limited Method of organising, interrogating and navigating a database

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06505816A (ja) * 1990-10-05 1994-06-30 マイクロソフト コーポレイション 情報検索システム及び方法
WO2002044940A2 (en) * 2000-11-30 2002-06-06 Coppereye Limited Method of organising, interrogating and navigating a database
JP2004527813A (ja) * 2000-11-30 2004-09-09 コッパーアイ リミテッド データベース

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010503094A (ja) * 2006-09-12 2010-01-28 インターナショナル・ビジネス・マシーンズ・コーポレーション データを管理するためのシステム、方法、及びコンピュータ・プログラム
JP4897885B2 (ja) * 2006-09-12 2012-03-14 インターナショナル・ビジネス・マシーンズ・コーポレーション データを管理するための方法
WO2013098918A1 (ja) * 2011-12-26 2013-07-04 株式会社日立製作所 データベースシステム及びデータベース管理方法
JPWO2013098918A1 (ja) * 2011-12-26 2015-04-30 株式会社日立製作所 データベースシステム及びデータベース管理方法
US9703829B2 (en) 2011-12-26 2017-07-11 Hitachi, Ltd. Database system and database management method

Also Published As

Publication number Publication date
US20060026188A1 (en) 2006-02-02
JP4542769B2 (ja) 2010-09-15
EP1426878A3 (en) 2006-05-17
US7007027B2 (en) 2006-02-28
US7082438B2 (en) 2006-07-25
US20040107186A1 (en) 2004-06-03
EP1426878A2 (en) 2004-06-09

Similar Documents

Publication Publication Date Title
JP4542769B2 (ja) 左リンクを使用してツリーをトラバースするアルゴリズム
US7783671B2 (en) Deletion and compaction using versioned nodes
US8996563B2 (en) High-performance streaming dictionary
US6789094B2 (en) Method and apparatus for providing extended file attributes in an extended attribute namespace
Seltzer et al. Hierarchical File Systems Are Dead.
US10360146B2 (en) Group garbage collection for multi-version concurrency control in database systems
US6694323B2 (en) System and methodology for providing compact B-Tree
US20050071336A1 (en) Systems and methods for logging and recovering updates to data structures
AU608872B2 (en) Device for enabling concurrent access of indexed sequential data files
US9916313B2 (en) Mapping of extensible datasets to relational database schemas
US20030145004A1 (en) Inference control method in a data cube
US20110302195A1 (en) Multi-Versioning Mechanism for Update of Hierarchically Structured Documents Based on Record Storage
WO2016029026A1 (en) Data driven relational algorithm formation for execution against big data
Kornacker High-performance extensible indexing
US7016913B2 (en) Method, system, data structures, and article of manufacture for implementing a persistent object
KR20030031283A (ko) 객체관계형 데이터베이스 관리 시스템 및 그것의 클래스인스턴스 삭제 방법
US6535895B2 (en) Technique to avoid processing well clustered LOB&#39;s during reorganization of a LOB table space
US6694340B1 (en) Technique for determining the age of the oldest reading transaction with a database object
EP0410210A2 (en) Method for dynamically expanding and rapidly accessing file directories
US20070192348A1 (en) Data adapter
JP2007501476A (ja) オブジェクトおよび従属オブジェクトをドロップしないデータベースシステム
US6470359B1 (en) Fast technique for recovering an index on an auxiliary table
CN115827653B (zh) 一种用于htap和海量数据的纯列式更新方法及装置
Shanthi et al. Applying SD-tree for object-oriented query processing
Evangelidis et al. Node deletion in the hB-tree

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20061121

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20090811

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090814

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091116

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100129

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100428

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20100604

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100628

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 4542769

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130702

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees