(57)【要約】【課題】ノードの平均使用率を向上させ、且つ、より高速に処理を行うデータ管理装置、データ管理方法及びデータ管理プログラムを提供することを目的とする。【解決手段】Ｂ＋ツリーデータ構造であって、各ノードが左右の隣り合うノードのリンクを保持し、各子ノードの最小のキーとリンクデータが前記各子ノードの親ノードのエントリであるＢ＋ツリーデータ構造を有するデータのデータ管理装置１であって、データを管理するデータ管理手段２１と、ノード情報の格納を行うスタック２２と、を有し、当該データ管理装置１においてデータの挿入を行う場合、前記スタック２２は、前記データの挿入先ノードを検索する際に辿ったノード順にノード情報を格納し、前記データ管理手段２１は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間に新しいノードを生成してノード分割を行い、前記スタック２２により格納されたノードに係る情報に基づいて親ノードのエントリを更新することを特徴とするデータ管理装置１。【選択図】図２
2008065716.tif 000002
【特許請求の範囲】
【請求項１】
各ノードが左右の隣り合うノードのリンクを保持し、各子ノードの最小のキーとリンクデータが前記各子ノードの親ノードのエントリであるＢ＋ツリーデータ構造を有するデータのデータ管理装置であって、
データを管理するデータ管理手段と、
ノードに係る情報の格納を行うスタックと、
を有し、
当該データ管理装置においてデータの挿入を行う場合、
前記スタックは、前記データの挿入先ノードを検索する際に辿ったノード順にノードに係る情報を格納し、
前記データ管理手段は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間に新しいノードを生成してノード分割を行い、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新することを特徴とするデータ管理装置。  
【請求項２】
当該データ管理装置においてデータの挿入を行う場合、
前記スタックは、前記データの挿入先ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間でノード再配分を行い、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新することを特徴とする請求項１に記載のデータ管理装置。
【請求項３】
当該データ管理装置においてデータの削除を行う場合、
前記スタックは、前記データの削除元ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記削除元ノードと該削除元ノードの左ノードとの間でノード再配分を行うとき、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新することを特徴とする請求項１又は２に記載のデータ管理装置。  
【請求項４】
当該データ管理装置においてデータの削除を行う場合、
前記スタックは、前記データの削除元ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記削除元ノードと該削除元ノードの左ノードとの間でノードマージを行うとき、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新することを特徴とする請求項１乃至３のいずれか一項に記載のデータ管理装置。
【請求項５】
前記Ｂ＋ツリーデータ構造におけるルートノードへのリンクデータと、左端のリーフノードへのリンクデータと、右端のリーフノードへのリンクデータを保持するヘッダーノードを有することを特徴とする請求項１乃至４のいずれか一項に記載のデータ管理装置。
【請求項６】
前記Ｂ＋ツリーデータ構造における前記各ノードは、ディスクブロックに基づく固定長の大きさであることを特徴とする請求項1乃至５のいずれか一項に記載のデータ管理装置。
【請求項７】
前記データ管理手段は、前記挿入先又は削除元ノードの左ノードが存在しない場合には、右ノードを参照することを特徴とする請求項１乃至６のいずれか一項に記載のデータ管理装置。
【請求項８】
階層構造の各ノードが左右の隣り合うノードのリンクを保持し、各子ノードの最小のキーとリンクデータが前記各子ノードの親ノードのエントリであるＢ＋ツリーデータ構造を有するデータのデータ管理装置であって、ノードに係る情報の格納を行うスタックを有するデータ管理装置におけるデータ管理方法において、
データを管理するデータ管理工程を有し、
当該データ管理装置においてデータの挿入を行う場合、
前記スタックは、前記データの挿入先ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理工程は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間に新しいノードを生成してノード分割を行い、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新することを特徴とするデータ管理方法。
【請求項９】
コンピュータに請求項８記載のデータ管理方法を実現させるためのデータ管理プログラム。  
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｂ＋ツリーデータ構造のデータの管理を行うデータ管理装置、データ管理方法及びデータ管理プログラムに関する。
【背景技術】
【０００２】
従来、Ｂツリーと呼ばれる、コンピュータ等においてデータを順序付けて格納するために使われる、コンピュータアルゴリズムがある。これは、与えられたデータをそのキー（インデックス、索引）の順番に並べ替えて格納したり、与えられたキーに基づいてデータを取り出したりする場合に使われるアルゴリズムである。リレーショナルデータベースにおける索引付けや、ファイルシステムにおけるファイル名の管理等で一般的に使われている。
【０００３】
また、Ｂ＋ツリーと呼ばれる、Ｂツリーの改良版も開発されている。Ｂツリーでは、各ノードにはキーとデータの組か、他のノードへのリンクのいずれかが格納されていた。Ｂ＋ツリーでは、リーフノード（ツリーのいちばん下にある、子ノードを持たないノード）にのみデータを格納するようにしている。このため、キー順にデータを次々と取り出すような処理（データベースにおける全件ピックアップなど）では、リーフノードのみを順番にアクセスすればよい。なお、キーとデータの組み合わせ、或いは、キーと他のノードへのリンクの組み合わせを以降、エントリとよぶ。
【０００４】
Ｂツリー及びＢ＋ツリーのデータ構造は、バランス多分木構造である。これは、ハードディスク等の２次記憶装置に大量のデータを記憶し、検索するのに適している。２次記憶装置は、主記憶装置に比べて非常に低速である。また、２次記憶装置の特性として、アクセスの回数が同じならば、少量のデータを読み書きするのも、ある程度まとまった量のデータを読み書きするのも大して時間は変わらないことがある。これは、２次記憶装置へのアクセスはディスクブロック等に基づいた或るまとまった単位（ページ）で行われるからである。
【０００５】
このことから、アクセス（読み出し）回数を減らすことが、重要なポイントになる。例えば、オーダー２００（１ページに２００個のエントリが格納できる）のＢ＋ツリーに１００万件のデータが記憶されている場合、１００×１００×１００＝１００万で、３ページ分の２次記憶装置の参照で済む。なお、正確には、ヘッダー情報が格納されたページがあるので、４ページである。
【０００６】
従来のＢ＋ツリーのデータ構造は、図１に示される。図１は、従来のＢ＋ツリーのデータ構造の例を示す図である。図１において、ヘッダー情報には、後述のルートノードのページＩＤ（ここでは、各ノードを一意に定める番号。例えば、ファイル上に実装されている場合には、ファイル内のオフセット値等である）、左端のリーフノードのページＩＤ及び右端のリーフノードのページＩＤが格納されている。ルートノードは、Ｂ＋ツリー構造の頂点をなすノードであり、下位のインデックスノードの先頭キー値とページＩＤが格納されている。インデックスノードは、検索のために存在するノードであり、リーフノード、又は下位のインデックスノードの先頭キー値とページＩＤが格納されている。リーフノードには、実データを格納するためのノードであり、キーとバリュー（格納した値）が格納されている。各ノードのエントリは、キーの昇順にソートされて格納されている。なお、登録件数が少ない場合は、ルートノードがリーフノードになる場合、及び／又は、インデックスノードがない場合等もある。
【０００７】
ここで、図１で示されるデータ構造にキー「いい」を登録する手順を説明する。まず、ヘッダー情報を参照し、ルートノードを得る。次に、ルートノードを探索し、子のインデックスノードを得る。キー「いい」を登録する場合、ページＩＤ１０のインデックスノードが選択される（「いい」は、「あ行」であるため）。続いて、ページＩＤ１０のインデックスノードを探索し、子のリーフノードを得る。ページＩＤ２のリーフノードが選択される（「いい」は「い」に含まれるため）。次にページＩＤ２のリーフノード内を探索し、キー「いい」はキー「い」とキー「いう」の間に登録される。
【０００８】
ここで、ページＩＤ２のリーフノードにキー「いい」のデータを登録する際に、リーフノードの容量が一杯である場合には、ノードの分割が行われる。ノードの分割は新しいノードを確保し、一杯になったノードのエントリの半分を新しいノードに移動し、一杯になったノードのエントリから新しいノードに移動したエントリを削除する。更に、新しいノードの先頭のキーと新しいノードのページＩＤの組を親ノードに挿入する。この方法では、ノードの使用率が５０％になる場合もあり、平均ノード使用率が低下してしまう。平均ノード使用率が低下すると、前述のアクセス回数が増えてしまう問題がある。
【０００９】
そのため、平均ノード使用率を向上させるための種々の方法が提案されている。
【００１０】
例えば、ノードの分割が必要なときに、隣のノードも参照し、隣のノードも一杯な場合に、２つのノードを３分割する方法がある。また、隣のノードに空き領域がある場合、分割が必要なノードのデータのいくつかを隣のノードに移動する、再配分という方法もある。これにより、ノード使用率が６６％以上になり、平均ノード使用率を高めることができる。また、或るノードにおいて、エントリを削除することによりノードの使用率が５０％を割った場合に、隣のノードを参照し、隣のノードの使用率も５０％未満の場合には、隣のノードのすべてのエントリを前述の或るノードに移動し、隣のノードを削除する、ノードマージという方法もある。隣のノードの使用率が５０％を超えている場合には、同じ使用率になるように再配分する。
【００１１】
以上のような方法を用いて、ノードの平均使用率を高く保つことができ、その結果２次記憶装置へのアクセス回数を減らすことができる。
【００１２】
ところで、或るノードと、その隣のノードとは、同じ親ノードを持っているとは限らない。従来、前述のノード分割、再配分、又はノードマージを行うに当たり、隣のノードの先頭のエントリが変更された場合は、隣のノードの親ノードのエントリを更新する必要があるが、ルートノードから隣のノードの親ノードを検索しなおすことによりこれを行っていたため時間がかかるという問題があった。
【００１３】
そこで、子ノードにその親ノードのページＩＤを格納する方法が提案されている。これにより、隣のノードの親ノードを速く判定することが可能になり、上記問題を解決することができる。
【００１４】
特許文献１に開示された発明では、左リンクを利用して同時実行性を向上するシステムについての発明が開示されている。また、特許文献２に開示された発明では、ノードの子ノードの件数を保持し、検索時に件数がすぐ求められるようにしたシステムについての発明が開示されている。また、特許文献３に開示された発明では、Ｂ＋ツリーの同時実行制御に関するシステムについての発明が開示されている。
【特許文献１】特開２００４―１８５６１７号公報
【特許文献２】特開２００３―２８８２１７号公報
【特許文献３】特開昭６３−１９１２２６号公報
【発明の開示】
【発明が解決しようとする課題】
【００１５】
しかしながら、ノード分割、再配分、又はノードマージを行うに当たり、移動したエントリに該当する子ノードの親ノードのページＩＤが格納されている部分をすべて更新しなければならないため時間がかかり非常に非効率であった。また、親ノードに相当するインデックスノードでは、２ページから３ページへのノード分割、再配分等を行わないことにより、この問題を解決することもできるが、インデックスノードの平均使用率が低下してしまう問題があった。
【００１６】
本発明は、上記の点に鑑みて、この問題を解消するために発明されたものであり、ノードの平均使用率を向上させ、且つ、より高速に処理を行うデータ管理装置、データ管理方法及びデータ管理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１７】
上記の目的を達成するために、本発明のデータ管理装置は、各ノードが左右の隣り合うノードのリンクを保持し、各子ノードの最小のキーとリンクデータが前記各子ノードの親ノードのエントリであるＢ＋ツリーデータ構造を有するデータのデータ管理装置であって、データを管理するデータ管理手段と、ノード情報の格納を行うスタックと、を有し、当該データ管理装置においてデータの挿入を行う場合、前記スタックは、前記データの挿入先ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間に新しいノードを生成してノード分割を行い、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新するように構成することができる。
【００１８】
これにより、ノードの平均使用率を向上させ、且つ、より高速に処理を行うことができる。また、ノード分割時に、左ノードと自ノード（例えばデータの挿入先ノード）の内容を左ノードと自ノードとの間に新ノードを確保し３分割することにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノード分割時にアクセスするノードの数を減らすことができ、高速にデータの挿入が行える。
【００１９】
また、上記の目的を達成するために、本発明のデータ管理装置は、当該データ管理装置においてデータの挿入を行う場合、前記スタックは、前記データの挿入先ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間でノード再配分を行い、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新するように構成することができる。
【００２０】
これにより、ノード再配分時に、より高速に処理を行うことができる。また、ノード再配分時に、左ノードと自ノード（例えばデータの挿入先ノード）の内容を再配分することにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノードの再配分時にアクセスするノードの数を減らすことができ、高速にデータの挿入が行える。
【００２１】
また、上記の目的を達成するために、本発明のデータ管理装置は、当該データ管理装置においてデータの削除を行う場合、前記スタックは、前記データの削除元ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記削除元ノードと該削除元ノードの左ノードとの間でノード再配分を行うとき、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新するように構成することができる。
【００２２】
これにより、ノード再配分時に、より高速に処理を行うことができる。また、ノード再配分時に、左ノードと自ノード（例えばデータの削除元ノード）の内容を再配分することにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノードの再配分時にアクセスするノードの数を減らすことができ、高速にデータの削除が行える。
【００２３】
また、上記の目的を達成するために、本発明のデータ管理装置は、当該データ管理装置においてデータの削除を行う場合、前記スタックは、前記データの削除元ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理手段は、前記削除元ノードと該削除元ノードの左ノードとの間でノードマージを行うとき、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新するように構成することができる。
【００２４】
これにより、ノードマージ時に、より高速に処理を行うことができる。また、ノードマージ時に、左ノードへ自ノード（例えば、データの削除を行うノード）の内容を移してマージすることにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノードマージ時にアクセスするノードの数を減らすことができ、高速にデータの削除が行える。
【００２５】
また、上記の目的を達成するために、本発明のデータ管理装置は、前記Ｂ＋ツリーデータ構造におけるルートノードへのリンクデータと、左端のリーフノードへのリンクデータと、右端のリーフノードへのリンクデータを保持するヘッダーノードを有するように構成することができる。
【００２６】
これにより、全件に対して逐次アクセスが可能なＢ＋ツリーデータ構造に対しても、ノードの平均使用率を向上させ、且つ、より高速に処理を行うことができる。
【００２７】
また、上記の目的を達成するために、本発明の前記Ｂ＋ツリーデータ構造における前記各ノードは、ディスクブロックに基づく固定長の大きさであるように構成することができる。
【００２８】
これにより、固定長の大きさのノードを持つＢツリーデータ構造に対しても、ノードの平均使用率を向上させ、且つ、高速に処理を行うことができる。
【００２９】
また、上記の目的を達成するために、本発明の前記データ管理手段は、前記データ管理手段は、前記挿入先又は削除元ノードの左ノードが存在しない場合には、右ノードを参照するように構成することができる。
【００３０】
これにより、左リンクのノードが存在しない場合にも、ノードの平均使用率を向上させ、且つ、高速に処理を行うことができる。
【００３１】
また、上記の目的を達成するために、本発明のデータ管理方法は、各ノードが左右の隣り合うノードのリンクを保持し、各子ノードの最小のキーとリンクデータが前記各子ノードの親ノードのエントリであるＢ＋ツリーデータ構造を有するデータのデータ管理装置であって、ノードに係る情報の格納を行うスタックを有するデータ管理装置におけるデータ管理方法において、データを管理するデータ管理工程を有し、当該データ管理装置においてデータの挿入を行う場合、前記スタックは、前記データの挿入先ノードを検索する際に辿ったノード順にノードに係る情報を格納し、前記データ管理工程は、前記挿入先ノードに空き領域がないとき、前記挿入先ノードと該挿入先ノードの左ノードとの間に新しいノードを生成してノード分割を行い、前記スタックにより格納されたノードに係る情報に基づいて親ノードのエントリを更新するように構成することができる。
【００３２】
これにより、ノードの平均使用率を向上させ、且つ、より高速に処理を行うことができるデータ管理方法を提供することができる。
【００３３】
また、上記の目的を達成するために、本発明のデータ管理プログラムは、コンピュータに前記データ管理方法を実現させるように構成することができる。
【００３４】
これにより、ノードの平均使用率を向上させ、且つ、より高速に処理を行うことができるデータ管理プログラムを提供することができる。
【発明の効果】
【００３５】
本発明のデータ管理装置、データ管理方法及びデータ管理プログラムによれば、ノードの平均使用率を向上させ、且つ、より高速に処理を行うことができる。
【発明を実施するための最良の形態】
【００３６】
以下、本発明を実施するための最良の形態について図面を用いて各実施形態において説明を行う。
［第１の実施形態］
まず、本発明の第１の実施形態におけるデータベース管理システムについて図２〜８を用いて説明する。
（データ管理装置の例）
まず、本発明の第１の実施形態であるデータベース管理システム１の概要について図２を用いて説明する。図２は、本発明の第１の実施形態のデータベース管理システム１の概要を示す図である。
【００３７】
図２において、データベース管理システム１は、ＬＡＮ等のネットワークにより接続されたクライアント装置１０、サーバー装置２０，データベース３０を有する。また、クライアント装置１０、サーバー２０は、図示しないＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ドライブ装置等を備えたものである。サーバー２０は、データ管理手段２１、スタック２２等を有する。
【００３８】
クライアント装置１０は、データベース管理システム１において、ユーザインタフェース処理を行う。例えば、ユーザは、クライアント装置１０を介してサーバー装置２０にデータベース３０の管理の指示を行う。
【００３９】
サーバー装置２０は、データベース管理システム１において、データベース３０の処理を行う。例えば、クライアント装置１０から受けた指示に基づいてデータベース３０を管理する。
【００４０】
データ管理手段２１は、後述のデータベース３０に格納されたデータ等を管理する。例えば、サーバー装置２０の図示しないＣＰＵ等が行う処理である。
【００４１】
スタック２２は、データを格納するメモリ領域である。例えば、後述のデータベース３０に格納されたノードに係る情報、例えばノードのＩＤ、ノードのアドレスを示すポインタ等、を格納する。サーバー装置２０の図示しないメモリ領域等である。
【００４２】
データベース３０は、後述のＢ＋ツリーデータ構造の例で示されるようなデータを格納するデータベースである。
【００４３】
以上の構成により、データベース管理システム１では、データベース３０に格納されたＢ＋ツリーデータ構造のデータは、クライアント装置１０からの指示をうけたサーバー装置２０によりデータの挿入及び削除等が行われ管理される。
【００４４】
なお、本実施形態においては、クライアント装置１０とサーバー装置２０を区別して以降説明を行うが、この場合には限らない。クライアント装置１０とサーバー装置２０の２つの装置の行う処理を１つの装置が行っていても良いものとする。
（Ｂ＋ツリーデータ構造）
次に、本実施形態１に係るＢ＋ツリーのデータ構造の例について図３を用いて説明する。図３は、本実施形態１に係るＢ＋ツリーのデータ構造の例を示す図である。
【００４５】
図３において、Ｂ＋ツリーのデータ構造は、ルートノードであるノードＮ１、インデックスノードであるノードＮ２及びＮ３、リーフノードであるノードＮ４〜Ｎ１３により構成される。ここでは、同じ階層の隣り合うノード間には、左右のノードとのリンク情報が格納されている。また、ヘッダーノード（図中ヘッダー情報）には、ヘッダー情報としてルートノードのページＩＤであるＮ１、左端のリーフノードのページＩＤであるＮ４及び右端のリーフノードのページＩＤであるＮ１３が格納されている。ヘッダーノードを用いることより、全ページに対する逐次アクセスが可能になっている。
【００４６】
なお、本実施形態１では、同じ階層のノードは、ノード内の先頭キー（後述の図３において、ノードＮ７では「ｄａ」、ノードＮ８では、「ｅａ」、ノードＮ９では、「ｆａ」）によって昇順にソートされている。即ち、或るノードに対する左右のノードは、ノード内の先頭キーが小さい側の隣り合うノードを左ノード、大きい側に隣り合うノードを右ノードとしている。また、降順に並んでいる場合も、その他の並び方の場合でもよいものとする。
（ノードのデータ構造の例）
次に、図３で示される各ノードのデータ構造の例について図４を用いて説明する。図４は、本実施形態１に係るＢ＋ツリー内のノードのデータの例を示す図である。
【００４７】
図４において、図３で示されるノードＮ１〜Ｎ１３の内、ルートノードＮ１、インデックスノードＮ２及びリーフノードＮ７〜９が示されている。
【００４８】
ルートノードＮ１には、キーと他のノードへのリンクの組み合わせが格納されている。ここでは、（キー、他のノードへのリンク）＝（ａａ、Ｎ２）（ｆａ、Ｎ３）が格納されている。
【００４９】
インデックスノードＮ２、３には、キーと他のノードへのリンクの組み合わせに加えて、データ先頭に、左右の隣り合うノードへのリンクデータが格納されている。ここでは、インデックスノードＮ２を例にとると、左右の隣り合うノードへのリンクデータである（なし、Ｎ３）（左にはリンクがないため"なし"になっている）がデータ先頭に格納されている。続いて（キー、他のノードへのリンク）＝（ａａ、Ｎ４）〜（ｅａ、Ｎ８）が格納されている。
【００５０】
リーフノードＮ４〜１３には、キーと値の組み合わせに加えて、データ先頭に左右の隣り合うノードへのリンクデータが格納されている。リーフノードＮ７を例にとると、左右の隣り合うノードへのリンクデータである（Ｎ６、Ｎ８）、続いて（キー、値）＝（ｄａ、値）〜（ｄｅ、値）が格納されている。
【００５１】
なお、本実施形態１に係るＢ＋ツリーのデータ構造の各ノードにおいて、キーのデータで昇順にソートされ格納されているものとする。また、各ノードは、５つのエントリを格納できるものとしているが、この場合には限らず、ディスクブロックに基づく固定長の大きさをとってもよい。
（動作例）
次に、本実施形態１に係る動作例について図５〜７を用いて説明する。図５は、本実施形態１の動作例に係るデータの変更を説明するための図である。
【００５２】
ここでは、データベース管理システム１において、上記の図３及び４で示されるＢ＋ツリーのデータ構造のデータを有するデータベース３０にキー「ｅｂ」のデータを挿入する場合を想定して動作の説明を行う。データを挿入する流れは、まず、データベース３０上でデータの挿入先となるリーフノードを検索し、次に挿入すべきノードにデータを挿入する。なお、挿入先となるリーフノードと挿入すべきノードを区別したのは、挿入先リーフノードに空き領域がない場合に、所定の処理（本実施形態１では、ノード分割）を行い、挿入すべきノードを求めこれにデータを挿入するため、挿入先となるリーフノードと挿入すべきノードが同じノードとは限らないためである。
【００５３】
まず、後述の図６のステップＳ１〜Ｓ４の処理により、データの挿入先となるリーフノードの検索を行う。更に、後述の図７のステップＳ１１〜Ｓ１８の処理により、挿入すべきノードを求めこれにデータを挿入する処理を行う。なお、これらの処理は、データ管理手段２１により行われる処理であるものとして順次説明を行う。
【００５４】
それでは、図６を用いてデータの挿入先となるリーフノードを検索する流れについて説明を行う。
【００５５】
まず、ヘッダー情報からルートノードを得る（Ｓ１）。ここでは、データ管理手段２１は、ヘッダー情報にルートノードのページＩＤとしてＮ１が格納されているので、ノードＮ１を取得する。
【００５６】
次に、リーフノードか否かを判定する（Ｓ２）。リーフノードであると判定すると（Ｓ２、ＹＥＳ）、処理を終了する。リーフノードでないと判定すると（Ｓ２、ＮＯ）、ステップＳ３へ移る。
【００５７】
ここでは、ステップＳ１で取得されたノードＮ１がリーフノードであるか否かを判定する。ノードＮ１は、リーフノードではないので、ステップＳ３へ移る。なお、リーフノードであるときは、データが存在しないと判定して処理を終了する。
【００５８】
ステップＳ３へ移った場合、ノードをスタック２２に積む（Ｓ３）。スタック２２は、後入れ先出し方式のデータ構造であり、辿ったノードへのリンクが積まれる。ここでは、辿ったノードであるノードＮ１がスタックに積まれる。
【００５９】
ステップＳ４へ移って、ノード内を２分探索し、該当する子ノードを得る（Ｓ４）。該当する子ノードを得ると、ステップＳ２へ移る。
【００６０】
ここでは、ノードＮ１内を２分探索する。２分探索については従来技術であるため、詳細の説明を省略する。ここでは、キー「ｅｂ」は、「ａａ」よりも大きいが、「ｆａ」よりも小さいため、ノードＮ２を該当する子ノードとして得る。
【００６１】
これらステップＳ２〜Ｓ４の処理を繰り返すことにより、ルートノードからの検索の結果、ノードＮ８が挿入先リーフノードであることがわかる。なお、探索中に辿ったノードであるＮ１及びＮ２は、スタックに積まれる。
【００６２】
以上の処理のように、本実施形態１のデータベース管理装置１では、データベース３０上でデータの挿入先リーフノードの検索が行われる。また、挿入先リーフノードの検索は、辿ったノードをスタック２２に積みながら行われる。
【００６３】
それでは、図７を用いてデータ（ここでは、キー「ｅｂ」のデータ）を挿入する処理を行う。
【００６４】
まず、自ノードの空き領域を得る（Ｓ１１）。
【００６５】
ここでは、自ノードは挿入先リーフノードＮ８を示す。ノードＮ８には、最大５つのエントリが格納でき、空き領域はないことが分かる（図４参照）。
【００６６】
次に、空き領域があるか否かを判定する（Ｓ１２）。空き領域があると判定すると（Ｓ１２、ＹＥＳ）、ステップ１８へ移る。空き領域がないと判定すると（Ｓ１２、ＮＯ）、ステップＳ１３へ移る。
【００６７】
ステップＳ１２の処理により、挿入先リーフノードにデータが挿入できるか否かを判定する。ここでは、ノードＮ８には、空き領域はないと判定する。即ち、ノードＮ８には、これ以上データを挿入することができないことが分かるのでステップＳ１３へ移る。
【００６８】
ステップＳ１３へ移った場合、左ノードを得る（Ｓ１３）。
【００６９】
ここでは、ノードＮ８に格納された左リンク情報に基づいて、左ノード、ここではノードＮ７を得る。
【００７０】
次に、左ノードの空き領域を得る（Ｓ１４）。
【００７１】
ステップＳ１４では、ノードＮ７には、空き領域はないことが分かる（図４参照）。
【００７２】
次に、空き領域があるか否かを判定する（Ｓ１５）。空き領域がないと判定すると（Ｓ１５、ＮＯ）、ステップＳ１６へ移る。
【００７３】
ステップＳ１５の処理により、後述のステップＳ１６以降で示されるノードの分割を行うか否かを決める。自ノード及び自ノードの左ノード、ここでは、ノードＮ８及びＮ７に空き領域がない場合、ステップＳ１６へ移ってノード分割を行う。なお、ノードＮ７に空き領域が或る場合（Ｓ１５、ＹＥＳ）については、後述の実施形態２において説明を行う。
【００７４】
ステップＳ１６へ移った場合、ノード分割を行う（Ｓ１６）。
【００７５】
ステップＳ１６のノード分割については、図８で示される後述のステップＳ１０１〜Ｓ１０８で示されるノード分割方法の例を用いて説明を行う。図８は、本実施形態１の動作例に係るノードの分割動作を示す動作フローである。
【００７６】
それでは、図５及び図８を用いてノードの分割動作について説明を行う。
【００７７】
まず、新しいノードを得る（Ｓ１０１）。
【００７８】
ここでは、新しいノードとしてノードＮ１４を取得する。
【００７９】
次に、新ノードの左ノードへのリンクを左ノードへ、右ノードへのリンクを自ノードにする（Ｓ１０２）。
【００８０】
ここでは、ノードＮ１４の左ノードへのリンクを左ノード（Ｎ７）に、右ノードへのリンクを自ノード（Ｎ８）にする。ノードＮ１４内のデータ先頭に格納された左右の隣り合うノードへのリンクデータを、それぞれノードＮ７，８にすることにより、ノードＮ１４をノードＮ７，８の間に入れる。  
次に、左ノードの右ノードへのリンクを新ノードへ、自ノードの左ノードへのリンクを新ノードにする（Ｓ１０３）。
【００８１】
ここでは、左ノード（Ｎ７）の右ノードへのリンクを新ノード（Ｎ１４）にする。即ち、ステップＳ１０２の処理により新ノードＮ１４がノードＮ７，８の間に挿入されたことを受けて、ノードＮ７内の右の隣り合うノードへのリンクデータを更新する。
【００８２】
次に、自ノードの左ノードへのリンクを新ノードにする（Ｓ１０４）。
【００８３】
ここでは、自ノード（Ｎ８）の左ノードへのリンクを新ノード（Ｎ１４）にする。即ち、ステップＳ１０２の処理により新ノードＮ１４がノードＮ７，８の間に挿入されたことをうけて、ノードＮ８内の左の隣り合うノードへのリンクデータを更新する。
【００８４】
次に、左ノードの下位１／３と自ノードの上位１／３を新ノードに移動する（Ｓ１０５）。
【００８５】
ここでは、左ノード（Ｎ７）の下位１／３データ（図５ではキー「ｄｅ」のデータ）と、自ノード（Ｎ８）の上位１／３データ（図５ではキー「ｅａ」のデータ）とを、新ノード（Ｎ１４）に移動する。これにより、データの３分割が行われる（図５参照）。なお、図５では、キー「ｅｂ」のデータが挿入されているが、ステップＳ１０５では、まだ挿入されていないものとする。
【００８６】
次に、スタック２２から自ノードの親ノードを得る（Ｓ１０５）。
【００８７】
ここでは、スタック２２に積まれたノードから、自ノード（Ｎ８）の親ノード、ここではノード（Ｎ２）が取得される。
【００８８】
次に、親ノード中の自ノードのエントリを更新する（Ｓ１０６）。
【００８９】
ここでは、親ノード（Ｎ２）上で、親ノード（Ｎ２）に格納された自ノード（Ｎ８）のエントリのキー（図４参照）を「ｅａ」から「ｅｃ」に更新する。
【００９０】
次に、親ノードに新ノードのエントリを追加する（Ｓ１０７）。
【００９１】
ここでは、親ノード（Ｎ２）に新ノード（Ｎ１４）のエントリを挿入する。なお、この処理については、動作例の最後に説明を行う。
【００９２】
以上のステップＳ１０１〜Ｓ１０８により示される処理でノード分割の処理を終了し、ステップＳ１７（図７参照）へ移る。
【００９３】
ステップＳ１７へ移って、挿入すべきノードを求める（Ｓ１７）。
【００９４】
ここでは、キー「ｅｂ」の挿入すべきノードは次のように求める。挿入すべきノードは、キーが新ノードの最小キーよりも小さいときは左ノード、自ノードの最小キーより小さいときは新ノード、それ以外のときは自ノードである。ここでは、キー「ｅｂ」は自ノード（Ｎ８）の最小キー「ｅｃ」より小さいので、新ノード（Ｎ１４）が挿入すべきノードとして求められる。
【００９５】
ステップＳ１８へ移って、エントリを挿入する（Ｓ１８）。エントリを挿入すると、処理を終了する。ここでは、ステップＳ１７の処理を受けて、キー「ｅｂ」は、新ノードＮ１４に挿入される。
【００９６】
以上の処理により、前述のステップＳ１〜Ｓ４の処理により、データの挿入先となるリーフノードの検索を行う。更に、前述のステップＳ１１〜Ｓ１８の処理により、挿入すべきリーフノードにデータを挿入する処理を行う。
【００９７】
そのため、以下に掲げる効果を奏する。その効果とは、ノード分割時に、左ノードと自ノード（例えばデータの挿入先ノード）の内容を左ノードと自ノードとの間に新ノードを確保し３分割することにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノード分割時にアクセスするノードの数を減らすことができ、高速にデータの挿入が行える。ノードの平均使用率を向上させ、且つ、より高速にデータの挿入等の処理を行うことができることである。
【００９８】
なお、ステップＳ１０７において、インデックスノードであるノード（Ｎ２）にもすでに５つのエントリが挿入されている（図４参照）ので、ノードＮ１４のエントリは挿入できない。よって、上記の同じ方法により、ページ分割が行われる。
［第２の実施形態］
次に、本発明の第２の実施形態におけるデータ管理装置について図９〜１１を用いて説明する。
（データ管理装置の例）（Ｂ＋ツリーデータ構造）（ノードのデータ構造の例）については実施形態１と同様のものを用いるとして、ここでは説明を省略する。
【００９９】
実施形態１では、データベース３０にデータを挿入するとき、まず、データベース３０上でデータの挿入先となるリーフノードを検索し、挿入先リーフノードに空き領域がない場合に、ノード分割を行い、挿入すべきノードを求めこれにデータを挿入する動作を行った。ここでは、挿入先ノードに空き領域がない場合に、ノード再配分を行う処理について説明を行う。
（動作例）
それでは、本実施形態２に係る動作例について図９〜１１を用いて説明する。図９は、本実施形態２の動作例に係るデータの変更を説明するための図である。
【０１００】
まず、実施形態１と同様に図６のステップＳ１〜Ｓ４の処理により、データの挿入先となるリーフノードの検索を行う。更に、後述の図１０のステップＳ２１〜Ｓ２９の処理により、挿入すべきノードを求めこれにデータを挿入する処理を行う。なお、これらの処理は、データ管理手段２１により行われる処理であるものとして順次説明を行う。
【０１０１】
図１０において、ステップＳ２１〜Ｓ２８までの処理は、図７のステップＳ１１〜Ｓ１８までの処理と同様であるとして、ここでは説明を省略する。  
ステップＳ２５へ移って、左ノードの空き領域があるか否かを判定する（Ｓ２５）。空き領域があると判定すると（Ｓ２５、ＮＯ）、ステップＳ２９へ移る。
【０１０２】
ステップＳ２５の処理により、後述のステップＳ２９以降で示されるノードの再配分を行うか否かを決める。自ノード（Ｎ８）の左ノード、ここでは、ノードＮ７に空き領域がある場合、ステップＳ２９へ移ってノード再配分を行う。
【０１０３】
ステップＳ２９へ移った場合、ノード再配分を行う（Ｓ２９）。
【０１０４】
ステップＳ２９のノード再配分については、図１１で示される後述のステップＳ２０１〜Ｓ２０５で示されるノード再配分方法において詳細の説明を行う。図１１は、本実施形態２の動作例に係るノードの再配分動作を示す動作フローである。
【０１０５】
それでは、図９及び図１１を用いてノードの再配分動作について説明を行う。
【０１０６】
まず、左ノードの空き領域が、自ノードの空き領域よりも大きいか否かを判定する（Ｓ２０１）。左ノードの空き領域の方が大きいと判定すると（Ｓ２０１、ＹＥＳ）、ステップＳ２０２へ移る。左ノードの空き領域の方が小さいと判定すると（Ｓ２０１，ＮＯ）、ステップＳ２０３へ移る。
【０１０７】
ステップＳ２０１の処理により、ノードの再配分を行うに当たりデータの移動元、移動先の判定を行う。ステップＳ２０２以降の処理により空き領域が小さい方のノードに含まれたデータを、空き領域が大きい方のノードに移動させることにより、平均ノード使用率の向上を図ることができる。ここでは、図９のように左ノード（Ｎ７）には２つのエントリを格納する空き領域があるので、ステップＳ２０１、ＹＥＳへ移る。
【０１０８】
ステップＳ２０２へ移った場合、自ノードの上位エントリを左ノードへ移動し、空き領域を均等にする（Ｓ２０２）。続いて、ステップＳ２０４へ移る。
【０１０９】
ここでは、自ノード内に格納されたデータを左ノードへ移動することにより、空き領域の均等化を図る。ここでは、自ノード（Ｎ８）のキー「ｅａ」のエントリを左ノード（Ｎ７）へ移動し、空き領域を均等にする。これにより、平均ノード使用率の向上を図ることができる。
【０１１０】
ステップＳ２０３へ移った場合、左ノードの下位エントリを自ノードへ移動し、空き領域を均等にする（Ｓ２０３）。続いて、ステップＳ２０４へ移る。
【０１１１】
ここでは、左ノード内に格納されたデータを自ノードへ移動することにより、空き領域の均等化を図る。これにより、平均ノード使用率の向上を図ることができる。
【０１１２】
ステップＳ２０４へ移って、スタック２２から自ノードの親ノードを得る（Ｓ２０４）。
【０１１３】
ここでは、スタック２２に積まれたノード情報から、自ノード（Ｎ８）の親ノードノード（Ｎ２）が取得される。
【０１１４】
次に、親ノード中の自ノードのエントリを更新する（Ｓ２０５）。
【０１１５】
ここでは、親ノード（Ｎ２）上で、親ノード（Ｎ２）に格納された自ノード（Ｎ８）のエントリのキー（図４参照）を「ｅａ」から「ｅｃ」に更新する。
【０１１６】
以上のステップＳ２０１〜Ｓ２０５により示される処理でノード再配分の処理を終了し、ステップＳ２７（図１０参照）へ移る。
【０１１７】
ステップＳ２７へ移って、挿入すべきノードを求める（Ｓ２７）。
【０１１８】
ここでは、キー「ｅｂ」を挿入すべきノードは次のように求める。挿入すべきノードは、キーが自ノードの最小キーよりも小さいときは左ノード、それ以外のときは自ノードである。ここでは、「ｅｂ」は自ノード（Ｎ８）の最小キー「ｅｃ」より小さいので、左ノード（Ｎ７）が挿入すべきノードとして求められる。
【０１１９】
ステップＳ２８へ移って、エントリを挿入する（Ｓ２８）。エントリを挿入すると、処理を終了する。ここでは、ステップＳ２７の処理を受けて、キー「ｅｂ」は、左ノードＮ７に挿入される（図１０参照）。
【０１２０】
以上の処理により、前述のステップＳ１〜Ｓ４の処理により、データの挿入先となるリーフノードの検索を行う。更に、前述のステップＳ２０１〜Ｓ２０８の処理により、挿入すべきリーフノードにデータを挿入する処理を行う。  
そのため、以下に掲げる効果を奏する。その効果とは、ノード再配分時に、左ノードと自ノード（例えば、データの挿入先ノード）の内容を再配分することにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノードの再配分時にアクセスするノードの数を減らすことができ、高速にデータの挿入が行えることである。また、ノードの平均使用率を向上させ、且つ、より高速にデータの挿入の処理を行うことができる。
［第３の実施形態］
次に、本発明の第３の実施形態におけるデータ管理装置について図１２、１３を用いて説明する。
（データ管理装置の例）（Ｂ＋ツリーデータ構造）（ノードのデータ構造の例）については実施形態１と同様のものを用いるとして、ここでは説明を省略する。
【０１２１】
実施形態１、２では、データベース３０にデータを挿入するとき、まず、データベース３０上でデータの挿入先となるリーフノードを検索し、挿入先リーフノードに空き領域がない場合に、ノード分割（実施形態１）、又はノード再配分（実施形態２）を行い、挿入すべきノードを求めこれにデータを挿入する動作を行った。ここでは、データベース３０からデータを削除するとき、まず、データベース３０上でデータ、ここではキー「ｅｂ」の削除元となるリーフノードを検索し、削除元ノードからデータを削除後、ノードマージ又はノード再配分等を行う処理について説明を行う。
（動作例）
それでは、実施形態３に係る動作例について図１２，１３を用いて説明する。図１２は、実施形態３に係るデータの挿入を説明するための図である。
まず、実施形態１と同様に図６のステップＳ１〜Ｓ４の処理により、データの削除元となるリーフノードの検索を行う。更に、後述の図１２のステップＳ３１〜Ｓ３９の処理により、削除元ノードからデータを削除し、ノードマージ又はノード再配分等の処理を行う。なお、これらの処理は、データ管理手段２１により行われる処理であるものとして順次説明を行う。
【０１２２】
まず、実施形態１と同様に図６のステップＳ１〜Ｓ４の処理により、データベース３０上でデータの削除元リーフノードの検索が行われる。また、削除元リーフノードの検索は、辿ったノードをスタック２２に積みながら行われる。
【０１２３】
次に、後述のステップＳ３１〜Ｓ３９の処理について説明を行う。
【０１２４】
まず、自ノードからエントリを削除する（Ｓ３１）。
【０１２５】
ここでは、自ノードは削除元リーフノードＮ８を示す。ノードＮ８から削除すべきデータであるキー「ｅｂ」のエントリを削除する。
【０１２６】
次に、空き領域が５０％以上であるか否かを判定する（Ｓ３２）。５０％以上であると判定すると（Ｓ３２、ＹＥＳ）、ステップＳ３０３へ移る。５０％以上でないと判定すると（Ｓ３２、ＮＯ）、ステップ３７へ移る。
【０１２７】
ステップＳ３２の処理により、以降の処理においてノードマージ（Ｓ３６）又はノード再配分（Ｓ３７）により平均ノード使用率の向上を図るか否かを決定する。自ノードの空き領域が５０％以上のときは、ノードマージ又はノード再配分を行うものとし、それ以外のときには、それらを行わないものとしている。
【０１２８】
ステップＳ３３へ移った場合、左ノードを得る（Ｓ３３）。
【０１２９】
ここでは、自ノード（Ｎ８）に格納された左リンク情報に基づいて、左ノード、ここではノードＮ７を得る。
【０１３０】
次に、ステップＳ３４へ移って、左ノードの使用領域を得る（Ｓ３４）。
【０１３１】
ここでは、左ノード（Ｎ７）の使用領域を調べる。
【０１３２】
次に、マージできるか否かを判定する（Ｓ３５）。マージできると判定すると（Ｓ３５、ＹＥＳ）、ステップＳ３６へ移る。マージできないと判定すると（Ｓ３５，ＮＯ）、ステップＳ３９へ移る。
【０１３３】
ここでは、自ノード（Ｎ８）と左ノード（Ｎ７）とがマージできるか否かを判定する。
【０１３４】
ステップＳ３６へ移った場合、ノードマージを行う（Ｓ３６）。
【０１３５】
ステップＳ３６のノードマージについては、図１３で示される後述のステップＳ３０１〜Ｓ３０６で示されるノードマージ方法において詳細の説明を行う。図１３は、実施形態３の動作例に係るノードマージ動作を示す動作フローである。
【０１３６】
それでは、図１３を用いてノードマージ動作について説明を行う。
【０１３７】
まず、左ノードに自ノードのエントリをすべて挿入する（Ｓ３０１）。
【０１３８】
ここでは、自ノード（Ｎ８）内のエントリを全て左ノード（Ｎ７）に挿入する。
【０１３９】
次に、自ノードの親ノードから自ノードのエントリを削除する（Ｓ３０２）。
【０１４０】
ここでは、スタック２２に積まれたノード情報から、自ノード（Ｎ８）の親ノード（Ｎ２）を取得し、親ノード（Ｎ２）上で、自ノード（Ｎ８）のエントリを削除する。
【０１４１】
次に、右ノードを得る（Ｓ３０３）。
【０１４２】
ここでは、自ノード（Ｎ８）の右ノードである（Ｎ９）を取得する。
【０１４３】
次に、右ノードの左ノードへのリンクを、左ノードにする。（Ｓ３０４）。
【０１４４】
ここでは、右ノード（Ｎ９）の左ノードへのリンクを左ノード（Ｎ７）にする。即ち、ステップＳ３０２の処理により自ノード（Ｎ８）が削除されたことを受けて、ノードＮ９内の左の隣り合うノードへのリンクデータを更新する。
【０１４５】
次に、左ノードの右ノードへのリンクを、右ノードにする（Ｓ３０５）。
【０１４６】
ここでは、左ノード（Ｎ７）の右ノードへのリンクを右ノード（Ｎ９）にする。即ち、ステップＳ３０２の処理により自ノード（Ｎ８）が削除されたことを受けて、ノードＮ７内の右の隣り合うノードへのリンクデータを更新する。
【０１４７】
次に、自ノードを削除する（Ｓ３０６）。
【０１４８】
前述のステップＳ３０１〜Ｓ３０５の処理により、左ノード（Ｎ７）と自ノード（Ｎ８）とをマージし、自ノード（Ｎ８）を削除する。
【０１４９】
ステップＳ３７へ移った場合、先頭エントリを削除したか否かを判定する（Ｓ３７）。先頭エントリを削除したと判定すると（Ｓ３７、ＹＥＳ）、ステップＳ３８へ移る。先頭エントリを削除していないと判定すると（Ｓ３７、ＮＯ）、処理を終了する。
【０１５０】
ステップＳ３７は、ステップＳ３１において自ノード（Ｎ８）から削除されたエントリが先頭エントリである場合に、自ノード（Ｎ８）の親ノード（Ｎ２）において、自ノード（Ｎ８）へのリンクデータを更新する必要がでてくるために行う処理である。
【０１５１】
ステップＳ３８へ移った場合、親ノードのエントリを更新する（Ｓ３８）。その後、処理を終了する。
【０１５２】
ここでは、自ノード（Ｎ８）の親ノード（Ｎ２）は、自ノード（Ｎ８）の先頭キー及び自ノードへのリンクデータをエントリとして持っている。自ノード（Ｎ８）の先頭キーがステップＳ３７の結果により変わったことを受けて、親ノード（Ｎ２）においてエントリの更新を行う。
【０１５３】
ステップＳ３９へ移った場合、ノード再配分を行う（Ｓ３９）。
【０１５４】
ここでは、マージできない場合には、ノード再配分を行う。ノード再配分については、図１１のステップＳ２０１〜Ｓ２０５と同様であるとして、ここでは説明を省略する。
【０１５５】
以上の処理により、図６のステップＳ１〜Ｓ４の処理により、データの削除元となるリーフノードの検索を行う。更に、後述の図１２のステップＳ３１〜Ｓ３９の処理により、削除元ノードからデータを削除し、ノードマージ又はノード再配分等の処理を行う。  
そのため、以下に掲げる効果を奏する。その効果とは、ノード再配分時に、左ノードと自ノード（例えば、データの削除元ノード）の内容を再配分することにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノードの再配分時にアクセスするノードの数を減らすことができ、高速にデータの削除が行えることである。
【０１５６】
また、別の効果として、ノードマージ時に、左ノードへ自ノード（例えば、データの削除元ノード）の内容を移してマージすることにより、左ノードの先頭エントリは変更されないので、左ノードの親ノードは変更する必要がなく、ノードのマージ時にアクセスするノードの数を減らすことができ、高速にデータの削除が行えることである。
【０１５７】
また、ノードの平均使用率を向上させ、且つ、より高速にデータの削除の処理を行うことができる。
［第４の実施形態］
次に、本発明の第４の実施形態におけるデータ管理装置について説明する。
（データ管理装置の例）（Ｂ＋ツリーデータ構造）（ノードのデータ構造の例）については実施形態１と同様のものを用いるとして、ここでは説明を省略する。
【０１５８】
実施形態１、２及び３では、データベース３０にデータを挿入及び／又は削除するとき、まず、データベース３０上でデータの挿入先及び／又は削除元となるリーフノードを検索し、ノード分割（実施形態１）、ノード再配分（実施形態２）、ノードマージ（実施形態３）を行った。さらに、ノード分割、ノード再配分、ノードマージを行うに当たり、挿入先及び／又は削除元となるリーフノードと、該挿入先及び／又は削除元となるリーフノードと左ノードとの間でこれらを行った。ここでは、左ノードが存在しない場合、即ちデータの挿入先及び／又は削除元となるリーフノードが左端のノードである場合（図３ではノードＮ４）の動作について説明を行う。
【０１５９】
このとき、バランス多分木構造をとるＢ＋ツリーデータ構造では、親ノード（ここではノードＮ２）には、最低でも２つのエントリが存在しているので、左端のノードの親ノードとその右ノードの親ノードは必ず同じノードである。左ノードが存在しない場合には、左ノードを選択する（実施形態１：図７ステップＳ１３、実施形態２：図１０ステップＳ２３、実施形態３：図１２ステップＳ３３）ことにより、右ノードとの間でノード分割、ノード再配分、ノードマージを行うことができる。
【０１６０】
なお、本発明を実施するための最良の形態では、データ管理装置の一例としてデータベース管理システムを例に説明してきたが、他のデータ管理装置及びシステムであってもよい。
【０１６１】
以上、各実施形態に基づき本発明の説明を行ってきたが、上記実施形態にあげたその他の要素との組み合わせなど、ここで示した要件に本発明が限定されるものではない。これらの点に関しては、本発明の主旨をそこなわない範囲で変更することが可能であり、その応用形態に応じて適切に定めることができる。
【図面の簡単な説明】
【０１６２】
【図１】従来のＢ＋ツリーのデータ構造の例を示す図
【図２】本発明の実施形態１に係るデータベース管理システムの概要を示す図
【図３】実施形態１に係るＢ＋ツリーのデータ構造の例を示す図
【図４】実施形態１に係るＢ＋ツリー内のノードのデータの例を示す図
【図５】実施形態１に係るデータの変更を説明するための図
【図６】実施形態１に係る挿入先ノードの検索を説明するための図
【図７】実施形態１に係るデータの挿入を説明するための図
【図８】実施形態１に係るノードの分割動作を示す動作フローを示す図
【図９】実施形態２に係るデータの変更を説明するための図
【図１０】実施形態２に係るデータの挿入を説明するための図
【図１１】実施形態２に係るノードの再配分動作を示す動作フローを示す図
【図１２】実施形態３に係るデータの挿入を説明するための図
【図１３】実施形態３に係るノードマージ動作を示す動作フローを示す図
【符号の説明】
【０１６３】
１  データ管理装置
１０  クライアント装置
２０  サーバー装置
２１  データ管理手段
２２  スタック
３０  データベース
【図１】
2008065716.tif 000003
【図２】
2008065716.tif 000004
【図３】
2008065716.tif 000005
【図４】
2008065716.tif 000006
【図５】
2008065716.tif 000007
【図６】
2008065716.tif 000008
【図７】
2008065716.tif 000009
【図８】
2008065716.tif 000010
【図９】
2008065716.tif 000011
【図１０】
2008065716.tif 000012
【図１１】
2008065716.tif 000013
【図１２】
2008065716.tif 000014
【図１３】
2008065716.tif 000015