JP2015162042A - インデックス管理装置 - Google Patents

インデックス管理装置 Download PDF

Info

Publication number
JP2015162042A
JP2015162042A JP2014036341A JP2014036341A JP2015162042A JP 2015162042 A JP2015162042 A JP 2015162042A JP 2014036341 A JP2014036341 A JP 2014036341A JP 2014036341 A JP2014036341 A JP 2014036341A JP 2015162042 A JP2015162042 A JP 2015162042A
Authority
JP
Japan
Prior art keywords
node
key
hierarchy
pointer
group
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
JP2014036341A
Other languages
English (en)
Other versions
JP2015162042A5 (ja
JP6006740B2 (ja
Inventor
盛朗 佐々木
Morio Sasaki
盛朗 佐々木
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.)
Wingarc1st Inc
Original Assignee
Wingarc1st Inc
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 Wingarc1st Inc filed Critical Wingarc1st Inc
Priority to JP2014036341A priority Critical patent/JP6006740B2/ja
Priority to PCT/JP2014/080851 priority patent/WO2015129109A1/ja
Publication of JP2015162042A publication Critical patent/JP2015162042A/ja
Publication of JP2015162042A5 publication Critical patent/JP2015162042A5/ja
Application granted granted Critical
Publication of JP6006740B2 publication Critical patent/JP6006740B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/9027Trees

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

【課題】インメモリ環境においてデータの検索処理および更新処理を共に高速化できるようにする。【解決手段】上位階層のノードほどアクセス比率が高い代わりに更新比率が低く、下位階層のノードほどアクセス比率が低い代わりに更新比率が高いという性質を利用して、第n階層以下(nは「1≰n<全階層数−1」を満たす任意の値)の下位階層において、所定数のキーと子ノードの位置を表す所定数のポインタまたは所定数のバリューとの組を格納した第1の種類のノードによってインデックスツリーの探索および更新を管理する。一方、第n階層よりも上の上位階層においては、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納した第2の種類のノードによってインデックスツリーの探索および更新を管理することにより、データの検索処理および更新処理を共に高速化できるようにする。【選択図】図2

Description

本発明は、インデックス管理装置に関し、特に、データの検索を高速化するために用いるインデックスツリーを管理するインデックス管理装置に用いて好適なものである。
従来、データの検索を高速化する技術として、インデックスツリーと呼ばれる手法が広く知られている。例えば、特定のキーに対応するデータを検索する場合、データベース内の全てのレコードを先頭から1つずつ調べていくと膨大な時間がかかってしまう。そこで、特定のキーに対する検索を高速化するために、インデックスツリーを付与することが多い(例えば、特許文献1,2参照)。
記録するデータの組をレコードと呼び、その中で検索に用いられるデータを特にキーと呼ぶ。その他のデータはバリューと呼ぶ。レコードをキーで検索するには、キー順にレコードがソートされているのが望ましい。しかし、レコードをキー順にソートして記録するのは時間がかかる処理である。そこで、レコードは到着順に記録し、キーと対応するレコードへのポインタをツリー構造でソートして別途記録するのが一般的である。これがインデックスツリーである。ソートした状態をツリー構造で維持するのは、レコードの追加と削除に伴うインデックスツリーのキーの追加と削除を、一部に限定することで処理時間を短縮するためである。
図8は、インデックスツリーの概念を説明するための図である。インデックスツリーは、ツリー状の構造を持ち、最下層のノードをリーフノード、その他のノードを内部ノードと呼ぶ。また、一番上のノードをルートノードと呼び、ルートでもリーフでもないノードをブランチノードと呼ぶ。図8ではブランチノードが1階層となっているが、複数階層にすることも可能である。各ノードには所定数のキー101とポインタ102との組が格納されているが、内部ノードについては左端のキーが省略されている。
各ノードのエントリであるキーとポインタとの組は、キーの値の昇順もしくは降順で並んでいる。これらのエントリはそれぞれ、そのノードの子に相当するノードと1対1に対応し、子ノードの左端のキー(子ノードが内部ノードの場合は左端の省略されているキー)の値と、子ノードの位置を指すポインタとを格納する。ノードの最終階層であるリーフノードのエントリには、各レコードのキーの値とレコードの位置とを格納する。
図8の例において、ルートノードには2つのキー“10”、“19”と3つのポインタとの組が格納されている。3つのポインタのうち、1つ目(左端)のポインタは、値が“1”以上で“10”より小さいキーをエントリとして持つ子ノードの格納位置を表す位置情報である。2つ目のポインタは、値が“10”以上で“19”より小さいキーをエントリとして持つ子ノードの格納位置を表す位置情報である。3つ目のポインタは、値が“19”以上のキーをエントリとして持つ子ノードの格納位置を表す位置情報である。
また、左端のブランチノードには2つのキー“4”、“7”と3つのポインタとの組が格納されている。3つのポインタのうち、1つ目のポインタは、値が“1”以上で“4”より小さいキーをエントリとして持つ子ノードの格納位置を表す位置情報である。2つ目のポインタは、値が“4”以上で“7”より小さいキーをエントリとして持つ子ノードの格納位置を表す位置情報である。3つ目のポインタは、値が“7”以上のキーをエントリとして持つ子ノードの格納位置を表す位置情報である。他のブランチノードも同様に、2つのキーと3つのポインタとの組が格納されている。
さらに、左端のリーフノードには3つのキー“1”、“2” 、“3”と3つのポインタとの組が格納されている。3つのポインタのうち、1つ目のポインタは、キー“1”に対応するデータが格納されているレコードの位置を表す位置情報である。2つ目のポインタは、キー“2”に対応するデータが格納されているレコードの位置を表す位置情報である。3つ目のポインタは、キー“3”に対応するデータが格納されているレコードの位置を表す位置情報である。他のリーフノードも同様に、3つのキーと3つのポインタとの組が格納されている。
図8のように構成されたインデックスツリーを用いて、例えばキー“11”に対応するデータを検索する場合、ルートノードにおける2番目のポインタ、2番目のブランチノードにおける左端のポインタおよび4番目のリーフノードを辿って、キー“11”に対応するデータを効率的に検索することができる。
ところで、レコード内のあるフィールドに対してインデックスを作成した場合、レコードの追加や削除といった更新系の処理をしたときに、レコード自体だけでなくインデックスの内容も更新する必要がある。レコードを追加する場合は、先の検索の場合と同じようにルートノードから順に辿ってエントリを追加するリーフノードを探し出す。ノードに空きがあるなら、昇順または降順の順序を守ってエントリを追加するだけでインデックスの追加は終了する。
一方、ノードに空きがないときは、新たにノードを追加して空きエントリを作る必要がある。例えば、図9(a)に示すようにインデックスツリーが構成されたフィールドにおいて、キー“8”のレコードを追加する場合、エントリを追加すべきノードとしてルートノードから順に辿って探索した3番目のリーフノードには、既に3つのエントリが格納されていて、空きがない。
この場合は、図9(b)に示すように、現在の3番目のリーフノードにある3つのキーのうち、分割キー“8”以上のキー“9”の位置で3番目のリーフノードを分割して新たにリーフノードを生成し、分割キー“8”よりも前側のエントリを1つ目の分割ノードに移動し、分割キー“8”よりも後側のエントリを2つ目の分割ノードに移動することにより、キー“8”のレコードを追加可能な空きエントリを生成する。
ところが、図9(b)のようにツリーを下層側に成長させると、ルートノードからリーフノードまでの階層数が一部のみ変化し、全体としてバランスしない状態となる。このようにバランスが崩れたインデックスツリーでは、検索効率が低下してしまう。そこで、インデックスツリーの一方式である「Bツリー」(例えば、非特許文献1参照)では、図10に示すように、ノードを分割する際にツリーを上層側に成長させるようにしている。このようにすれば、インデックスツリーの階層数はどのリーフノードに対しても同じとなり、全体としてバランスする。
データベースがハードディスクに格納される場合、ディスクI/Oの数が、ディスク環境でのインデックスツリーの性能を決定する。すなわち、ディスクのレイテンシは10ms程度、メモリのレイテンシは100ns程度、キャッシュのレイテンシは1ns程度であるから、検索効率を上げるには、ディスクI/Oの数をできるだけ少なくすることが必要となる。
一方、インデックスツリーはその構造上、上位階層のノードほどアクセス比率が高くなり、下位階層のノードほどアクセス比率は低くなる(例えば、非特許文献2参照)。したがって、最上位のルートノードをキャッシュに格納し、ブランチノードをメモリに格納し、リーフノードをディスクに格納すれば、ディスクI/Oの数を減らすことが可能である。特にBツリーは、ディスクのアクセスに最適化された方式である。
すなわち、Bツリーのノードサイズは、典型的にはディスクブロック(ディスク上のデータのI/Oの単位で、通例では4Kバイト)の大きさに等しい。ノードに格納されるのが4バイトのキーと4バイトのポインタの場合、ノードサイズを4Kバイトにすれば、ファンアウト(子ノードの数)は約500となる。したがって、図11のように3階層から成るBツリーの場合、少量(2Mバイト程度)のメモリがあれば、多量(1Gバイト程度)のデータベースから、1回のディスクI/Oでデータを取り出すことが可能である。
これに対して、全てのデータがメモリに格納されたインメモリ環境では、ディスクI/Oがなくなるので、Bツリーの性能は、アクセスするキャッシュラインの数に強く依存する。キャッシュラインとは、CPUがメモリからキャッシュへとデータを移送する単位である。近年のCPUでは、64バイトのデータでキャッシュラインを構成することが多い。
このライン数を削減してインメモリ環境に最適化したインデックスツリーとして、「CSB+ツリー」と呼ばれる方式が知られている(例えば、非特許文献3参照)。CSB+ツリーは、ノードのエントリからポインタを削除することによって記憶容量を削減し、そのぶん1つのノードに格納可能なキーの数を増やすことによってライン数を削減できるようにしたものである。また、CSB+ツリーには、ポインタを記録したキャッシュラインへのアクセスを省略できるという利点もある。
図12に示すように、CSB+ツリーでは、複数のノードをまとめてノードグループを生成する。内部ノードのエントリは、各キーに個別に対応するポインタを持たず、下階層のノードグループの先頭位置を表すポインタのみを持つ。グループ内で各ノードのエントリはメモリの連続領域に格納されており、子ノードの先頭位置からのオフセット量に基づいて該当するキーの位置が特定される。
例えば、キー“13”に対応するデータを検索する場合、ルートノードからの探索によって、キー“13”はリーフノードにおける2番目のノードグループ内にあることが分かる。ここで、2番目のノードグループの先頭アドレスが“0xA000”であったとする。また、ノードサイズが12バイトであったとすると、キー“13”に対応するアドレスは“0xA00C”(=0xA000+0x000C×1)と計算される。
CSB+ツリーのようにポインタを削除すると、検索速度は速くなる。しかし、レコードの追加に伴ってインデックスに新たなキーを挿入する場合、その挿入処理はBツリーに比べて遅くなってしまう。図13(a)のように、Bツリーの場合は各キーに対応するポインタがあるので、ノード分割によって新たに生成した子ノードを自由に配置することができる。これに対して、CSB+ツリーの場合は、図13(b)に示すように、ノードグループ内でキーの値が昇順または降順となるように子ノードを並び替える必要があるため、そのぶん処理速度が遅くなってしまうという問題があった。
特開平5−334153号公報 特開2003−114816号公報
D. Comer. The ubiquitous b-tree. ACM Computing Surveys, 11(2):121-137, 1979 S. Sasaki. Modularizing B+-trees: Three-Level B+-trees Work Fine. ADMS@VLDB2013: 46-57 J. Rao and K. A. Ross. Making B+-trees cache conscious in main memory. In SIGMOD, pages 475-486, 2000
以上のように、インメモリ環境に最適化されたCSB+ツリーを採用してポインタ削減により検索処理を高速化しようとすると、インデックスにおけるキーの挿入処理が低速化してしまうため、レコードの更新が多いワークロードに対して、全体としての処理性能が高くならないという問題があった。
本発明は、このような問題を解決するために成されたものであり、インメモリ環境においてデータの検索処理を高速化できるようにするとともに、更新処理の低速化を抑制できるようにすることを目的とする。
上記した課題を解決するために、本発明では、所定数のキーと所定数のバリューとの組を格納したリーフノードを第0階層として、第n階層以下(nは「1≦n<全階層数−1」を満たす任意の値)の下位階層において、所定数のキーと子ノードの位置を表す所定数のポインタまたは所定数のバリューとの組を格納した第1の種類のノードによって、インデックスツリーの探索および更新を管理する。一方、第n階層よりも上の上位階層においては、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納した第2の種類のノードによって、インデックスツリーの探索および更新を管理するようにしている。
本発明の他の態様では、第1階層以上で第n階層以下の下位階層において、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納するとともに、ノードグループ内の各ノードの位置を表すのに十分なサイズの縮小ポインタを格納した第3の種類のノードによって、インデックスツリーの探索および更新を管理するようにしている。一方、第n階層よりも上の上位階層においては、第2の種類のノードによってインデックスツリーの探索および更新を管理するようにしている。
上記のように構成した本発明によれば、一般的にインデックスツリーでは上位階層のノードほどアクセス比率が高い代わりに更新比率が低く、下位階層のノードほどアクセス比率が低い代わりに更新比率が高いという性質を利用して、上位階層においては、検索処理を高速に行うことが可能な第2の種類のノードによってインデックスツリーの探索および更新が管理される。逆に、下位階層においては、キーの挿入処理を高速に行うことが可能な第1の種類のノードによってインデックスツリーの探索および更新が管理される。これにより、インメモリ環境において、データの検索処理を高速化するとともに、更新処理の低速化を抑制することができる。
本発明の他の特徴によれば、上位階層においては、検索処理を高速に行うことが可能な第2の種類のノードによってインデックスツリーの探索および更新が管理される。一方、下位階層においては、ノードグループ内のオフセット量が縮小ポインタに基づいて求められるので、ノードグループ内で各ノードを自由に配置することができ、ノード分割等が必要となるデータの更新処理でも高速に行うことができる。また、縮小ポインタに必要な記憶容量は小さくて済むので、1つのノードに格納可能なキーの数を増やすことができ、インデックスツリーの階層数を減らして検索処理も高速化することができる。
第1の実施形態によるインデックス管理装置の機能構成例を示すブロック図である。 第1の実施形態におけるインデックスツリーの具体例を示す図である。 第1の実施形態においてキーが挿入された後のインデックスツリーの構成例を示す図である。 第2の実施形態によるインデックス管理装置の機能構成例を示すブロック図である。 第2の実施形態におけるインデックスツリーの具体例を示す図である。 2の実施形態において用いる縮小ポインタの特徴を示す図である。 第2の実施形態によるインデックス管理装置の他の機能構成例を示すブロック図である。 インデックスツリーの概念を説明するための図である。 ノード分割の際にツリーを下層側に成長させる例を説明するための図である。 ノード分割の際にツリーを上層側に成長させるBツリーの例を説明するための図である。 3階層から成るBツリーのファンアウトの一例を示す図である。 CSB+ツリーの構成例を示す図である。 BツリーおよびCSB+ツリーのノード分割を説明するための図である。
(第1の実施形態)
以下、本発明の第1の実施形態を図面に基づいて説明する。図1は、第1の実施形態によるインデックス管理装置の機能構成例を示すブロック図である。第1の実施形態によるインデックス管理装置は、最下位階層であるリーフノードと、最上位階層であるルートノードと、リーフノードとルートノードとの間にある1以上のブランチノードとからなるインデックスツリーを管理するものであって、その機能構成として、検索処理部1、挿入処理部2、下位階層管理部3および上位階層管理部4を備えて構成されている。
上記各機能ブロック1〜4は、ハードウェア、DSP(Digital Signal Processor)、ソフトウェアの何れによっても構成することが可能である。例えばソフトウェアによって構成する場合、上記各機能ブロック1〜4は、実際にはコンピュータのCPU、RAM、ROMなどを備えて構成され、RAMやROM、ハードディスクまたは半導体メモリ等の記録媒体に記憶されたプログラムが動作することによって実現される。
本実施形態では、所定数のキーと所定数のバリューとの組を格納したリーフノードがある階層を第0階層として、第n階層以下(nは「1≦n<全階層数−1」を満たす任意の値)を下位階層とし、第n階層よりも上の階層を上位階層とする。以下では、n=1の場合について説明する。つまり、第0階層およびその上の第1階層を下位階層とする。また、第1階層よりも上の第2階層以上を上位階層とする。図1の例では、インデックスツリーは第0階層から第3階層までの4階層で構成されている。このうち、第0階層および第1階層が下位階層、第2階層および第3階層が上位階層である。また、1つのリーフノードは、最大3個のキーと、当該キーと同数のバリューとの組により構成されている。
検索処理部1は、インデックスツリーを利用してインメモリ環境のデータベース(メモリ)から所望のデータ(バリュー)を検索するものである。具体的には、検索処理部1は、検索キーを上位階層管理部4に供給し、上位階層管理部4および下位階層管理部3の処理により、検索キーに対応するバリューを検索する。そして、その検索されたバリューを下位階層管理部3から受け取る。
挿入処理部2は、インデックスツリーに所望のデータ(キーとバリューとの組)を挿入するものである。具体的には、挿入処理部2は、挿入するキーとバリューとを上位階層管理部4に供給し、上位階層管理部4および下位階層管理部3の処理により、挿入キーの値から挿入すべきリーフノードを決定し、決定したリーフノードの適切な位置にキーとバリューとの組を追加する。そして、下位階層管理部3または上位階層管理部4から挿入完了の通知を受け取る。
下位階層管理部3は、インデックスツリーの下位階層において、所定数のキーと、子ノードの位置を表す所定数のポインタまたは所定数のバリューとの組を格納した第1の種類のノードによって、インデックスツリーの探索および更新を管理する。この第1の種類のノードは、例えばBツリーで使用されるノードと同じである。
また、上位階層管理部4は、インデックスツリーの上位階層において、所定数のキーと、下階層のノードグループの先頭位置を表す1つのグループポインタとを格納した第2の種類のノードによって、インデックスツリーの探索および更新を管理する。この第2の種類のノードは、例えばCSB+ツリーで使用されるノードと同じである。
図2は、下位階層管理部3および上位階層管理部4により探索および更新されるインデックスツリーの具体例を示す図である。図2に示すように、下位階層管理部3により管理される下位階層である第1階層は、最大2個のキーと、当該キーより1つ多いポインタとの組を格納した第1の種類のノードで構成されている。個々のポインタは、1つ下の第0階層にあるリーフノードの左端の位置を表している。もう1つの下位階層であるリーフノードは、最大3個のキーと、当該キーと同数のバリューとの組により構成されている。
また、上位階層管理部4により管理される上位階層である第2階層および第3階層は、最大2個のキーと、1つ下の階層にあるノードグループの先頭位置を表す1つのグループポインタとを格納した第2の種類のノードで構成されている。第3階層の1つの下の第2階層には1つのノードグループGr2-1が設定され、第2階層の1つの下の第1階層には3つのノードグループGr1-1,Gr1-2,Gr1-3が設定されている。
ここで、図2のように構成されたインデックスツリーを用いて、検索処理部1による検索処理を行う場合の動作を説明する。まず、検索処理部1は、検索キーを上位階層管理部4に渡す。なお、以下では、検索キーの値が“15”であるものとして説明する。
上位階層管理部4は、最上位の第3階層と、そこでルートノードになっているノードとを特定する。そして、上位階層管理部4は、当該ルートノードに格納されているキーの中から、検索キー以下で最大の値を持つキーを探索する。さらに、上位階層管理部4は、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量をノードサイズに基づいて計算することによって特定される位置を辿って下位層に遷移する。
図2の例の場合、ルートノードに格納されているキーのうち、検索キー“15”以下で最大の値を持つキーは存在しない(省略されている)。このように、省略された左端のキーが探索された場合、オフセット量はゼロである。この場合、上位階層管理部4は、省略されたキーと共に同じノード内に格納されているグループポインタに従って、1つ下の第2階層にあるノードグループGr2-1の先頭位置のノードに遷移する。
遷移した第2階層も上位階層であるから、上位階層管理部4によって上述と同様の処理を行う。すなわち、上位階層管理部4は、ルートノードから遷移してきたノードグループGr2-1の先頭位置のノードに格納されているキーのうち、検索キー“15”以下で最大の値を持つキーを探索する。この場合に探索されるキーは“10”である。このように、省略されたキーも含めてノード内の左端から2番目のキーが探索された場合、オフセット量はノードサイズ×1となる。この場合、上位階層管理部4は、探索したキー“10”と共に同じノード内に格納されているグループポインタとオフセット量に従って、1つ下の第1階層にあるノードグループGr1-1の先頭位置から2番目のノードに遷移する。
このとき遷移した第1階層は下位階層であるから、下位階層管理部3によって処理を行う。下位階層管理部3は、特定されたノードに格納されているキーの中から、検索キー以下で最大の値を持つキーを探索する。さらに、下位階層管理部3は、探索したキーと共に同じノード内に格納されているポインタが示す位置を辿って下位層に遷移する。
図2の例の場合、ノードグループGr1-1の先頭位置から2番目のノードに格納されているキーのうち、検索キー“15”以下で最大の値を持つキーは“13”である。この場合、下位階層管理部3は、探索したキー“13”との組として格納されているポインタに従って、1つ下の第0階層にある左端から5番目のリーフノードにダイレクトに遷移する。検索キー“15”はこのノード内にあるので、下位階層管理部3は当該検索キーの位置に対応するバリューを取得し、検索処理部1に渡す。これにより、検索処理部1による検索処理が終了する。
次に、図2のように構成されたインデックスツリーを用いて、挿入処理部2による挿入処理を行う場合の動作を説明する。まず、挿入処理部2は、挿入キーとバリューとの組を上位階層管理部4に渡す。なお、以下では、挿入キーの値が“9”であるものとして説明する。上位階層管理部4および下位階層管理部3は、上述した検索処理と同様の手順に従って、挿入キー“9”を挿入すべきリーフノードの探索を行う。これにより、左端から3番目のリーフノードに遷移する。
ここで、下位階層管理部3は、検索されたリーフノードに空きスペースがあるか否かを判定する。そして、空きスペースがある場合は、そのリーフノードに挿入キー“9”とバリューとの組を挿入する。図2の例では、左端から3番目のリーフノードに1つ空きスペースがあるので、そのノード内に挿入キー“9”とバリューとの組を挿入することが可能である。
一方、検索されたリーフノードに空きスペースがない場合、下位階層管理部3は、そのリーフノードを分割して挿入キーとポインタとの組を挿入する。例えば、挿入処理部2から上位階層管理部4に渡された挿入キーの値が“17”であったとする。この場合、上位階層管理部4および下位階層管理部3が挿入キー“17”を挿入すべきリーフノードの探索を行うことにより、左端から6番目のリーフノードに遷移する。
しかし、この6番目のノードには既に3つのキーとバリューの組が格納されていて、空きスペースがない。そこで、下位階層管理部3は、この6番目のリーフノードを分割して空きスペースを確保し、挿入キー“17”とバリューとの組を挿入する。
具体的には、下位階層管理部3は、まず、新たな空のノードを取得する。次に、下位階層管理部3は、6番目のリーフノードに含まれる3つのキーのうち、所定の分割キー以上のキーとそれに対応するバリューとの組を新たなノードに移す。ここで、分割キーの値は、例えば、3つのキーの値の中央値とする。その後、下位階層管理部3は、挿入キー“17”が分割キー以上の場合は新たなノードに、そうでなければ元のノードに挿入キー“17”とバリューとの組を挿入する。
このようにノード分割を行った場合、新たに生成したリーフノードを指すポインタを、上位階層のノードのエントリに追加しなければならない。すなわち、下位階層管理部3は、分割キーと新ノードへのポインタを、リーフノードのある第0階層よりも1つ上の第1階層の、探索パス上にあるノード(左端から2番目のノード)に追加する。このとき、そのノードに新たなキーとポインタの組を追加するスペースがなければ、ノードグループ内で新たなノードを確保する。
図2の例では、左から2番目のノードに空きスペースがないので、ノードグループ内の3番目の位置のノードを初期化し、このノードに2番目のエントリを移す。このノード分割によってできたスペースに、挿入キー“17”とバリューとの組を挿入する。この例では、2番目のノードが分割されたためノードのコピーは発生しなかったが、仮に1番目のノードが分割されたとすると、2番目のノードを3番目のノードとしてコピーし、2番目のノードを初期化にする(空にする)ことによって、1番目のノードを分割する。
上に述べたとおり、第1階層のようにノードグループが設定されている場合、空きスペースの確保は以下のようにして行う。下位階層管理部3は、まず、第0階層においてノード分割をして挿入キー“17”を挿入したことに伴い、新たに第1階層でキーを追加しようとするノードが属するノードグループGr1-1にノードを追加するスペースがあるか否かを判定する。スペースがあれば、当該ノードグループGr1-1内の分割されるノードの直後の位置以降のノードを1つ右の位置にコピーする。そして、分割するノードの直後のノードを初期化して、新たな空のノードを確保する。これによってノード分割が可能になる。
一方、ノードグループGr1-1に空のノードがない場合、下位階層管理部3は新たなノードグループを取得する。そして、下位階層管理部3は、一部(例えば、ノードグループGr1-1内の後ろ半分)のノードを新たなノードグループに移動させる。これにより、ノードグループGr1-1内にノードを追加するスペースができるので、ノード分割によってエントリを追加するスペースを作成できる。
第1階層でノードの移動や新たなノードグループの取得などを行った場合、下位階層管理部3は上位階層管理部4に依頼して、第1階層よりも1つ上の第2階層の、探索パス上にあるノードグループ内のノード(左端のノード)に、必要なキーを追加する。このノードに新たなキーを追加するスペースがなければ、第2階層でも第1の階層と同様にノードの移動またはノードグループの取得などを行って挿入スペースを確保する。この場合、ルートノードに新たなキーを追加する必要があるが、空きスペースがなくてルートノードが分割される場合には、未使用かつ最下位の階層のノードを新たなルートノードにする。
図3は、図2に示したインデックスツリーに対して挿入キー“17”とバリューとの組を挿入した後のインデックスツリーの構成例を示す図である。図3に示す例では、挿入キー“17”とバリューとの組を挿入するために第0階層においてノード分割が行われ、それに伴って第1階層および第2階層においてもエントリの追加が行われている。
以上詳しく説明したように、第1の実施形態では、第0階層および第1階層から成る下位階層では、所定数のキーと所定数のポインタまたは所定数のバリューとの組を格納した第1の種類のノード(Bツリーのノード)によってインデックスツリーの探索および更新を管理する。一方、第1階層よりも上の第2階層以上の上位階層では、所定数のキーと1つのグループポインタとを格納した第2の種類のノード(CSB+ツリーのノード)によってインデックスツリーの探索および更新を管理するようにしている。
インデックスツリーは、上位階層のノードほどアクセス比率が高い代わりに更新比率が低く、下位階層のノードほどアクセス比率が低い代わりに更新比率が高いという性質を持つ。第1の実施形態ではこの性質を利用して、上位階層においては、検索処理を高速に行うことが可能な第2の種類のノードによってインデックスツリーの探索および更新が管理される。逆に、下位階層においては、キーの挿入処理を高速に行うことが可能な第1の種類のノードによってインデックスツリーの探索および更新が管理される。これにより、インメモリ環境において、データの検索処理を高速化するとともに、更新処理の速度低下を抑制することができる。
(第2の実施形態)
次に、本発明の第2の実施形態を図面に基づいて説明する。図4は、第2の実施形態によるインデックス管理装置の機能構成例を示すブロック図である。図4に示すように、第2の実施形態によるインデックス管理装置は、その機能構成として、検索処理部1、挿入処理部2、下位階層管理部3、上位階層管理部4および中位階層管理部5を備えて構成されている。なお、この図4において、図1に示した符号と同一の符号を付したものは同一の機能を有するものであるので、ここでは重複する説明を省略する。
本実施形態では、リーフノードがある階層を第0階層として、当該第0階層およびそれより1つ上の第1階層を下位階層とする。また、第1階層より1つ上の第2階層を中位階層とし、第3階層以上を上位階層とする。図4の例では、インデックスツリーは第0階層から第3階層までの4階層で構成されている。このうち、第0階層および第1階層が下位階層、第2階層が中位階層、第3階層が上位階層である。
中位階層管理部5は、インデックスツリーの中位階層において、所定数のキーと1つ下の階層のノードグループの先頭位置を表す1つのグループポインタとを格納するとともに、当該ノードグループ内の各ノードの位置を表すポインタであって第1の種類のノードに格納されるポインタよりもサイズの小さい縮小ポインタを格納した第3の種類のノードによって、インデックスツリーの探索および更新を管理する。
図5は、下位階層管理部3、上位階層管理部4および中位階層管理部5により探索および更新されるインデックスツリーの具体例を示す図である。この図5は、図2に示したインデックスツリーと略同じであるが、中位階層として定義した第2階層のノードが図2のインデックスツリーと異なっている。
図5に示すように、中位階層である第2階層は、最大2個のキーと、1つ下の階層にあるノードグループの先頭位置を表す1つのグループポインタと、キーと同数の縮小ポインタとを格納した第3の種類のノードで構成されている。例えば、第1階層における通常のポインタのサイズが4バイトであるの対し、縮小ポインタのサイズは2バイトである。これは例えば、ノードが4Gバイトのアドレス空間のどこかにある場合にはポインタの大きさは4バイト以上でなければならないが、ノードが64Kバイトのノードグループのどこかにある場合には2バイト以上のポインタでノードを特定できるからである。このように、ノードグループの先頭へのポインタを使えば、ポインタを縮小しても子ノードを特定できる。
ここで、図5のように構成されたインデックスツリーを用いて、検索処理部1による検索処理を行う場合の動作を説明する。まず、検索処理部1は、検索キーを上位階層管理部4に渡す。なお、以下では、検索キーの値が“15”であるものとして説明する。
上位階層である第3階層における上位階層管理部4の処理は、第1の実施形態と同様である。第3階層から遷移した第2階層は中位階層であるから、中位階層管理部5によって処理を行う。すなわち、中位階層管理部5は、ルートノードから遷移してきたノードグループGr2-1の先頭位置のノードに格納されているキーのうち、検索キー“15”以下で最大の値を持つキーを探索する。この場合に探索されるキーは“10”である。
さらに、中位階層管理部5は、以上のように探索したキー“10”と共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量を、当該キー“10” との組として格納されている縮小ポインタに基づいて計算する。そして、このグループポインタとオフセット量とによって特定される位置を辿ることにより、1つ下の第1階層にあるノードグループGr1-1の先頭位置から2番目のノードに遷移する。
このとき遷移した第1階層は下位階層であるから、下位階層管理部3によって第1の実施形態と同様の処理を行う。これにより、キー“13”との組として格納されているポインタに従って、1つ下の第0階層にある左端から5番目のリーフノードにダイレクトに遷移し、そのリーフノード内から検索キー“15”の位置に対応するバリューを取得し、検索処理部1に渡す。これにより、検索処理部1による検索処理が終了する。
なお、挿入処理部2による挿入処理では、まず、挿入キーを挿入すべきリーフノードの検索を上述した検索処理と同様の手順に従って行う。その後、検索したリーフノードに挿入キーとバリューとの組を挿入する処理は、上述した第1の実施形態と同様なので、ここでは説明を省略する。
以上詳しく説明したように、第2の実施形態では、ノードグループ内のオフセット量が縮小ポインタに基づいて求められるので、ノードグループ内で各ノードのエントリはメモリの連続領域に格納されていることは必須でなく、図6のようにノードグループ内で各ノードを自由に配置することができる。そのため、ノード分割等が必要となるデータの更新処理でも高速に行うことができる。
そして、このようにデータの更新処理を高速にするために各キーに対応させて縮小ポインタを設けつつ、当該縮小ポインタに必要な記憶容量を削減することにより、1つのノードに格納可能なキーの数を増やすことができる。これにより、インデックスツリーの階層数(ライン数)を減らし、検索処理も高速化することができる。
なお、上記第2の実施形態では、インデックスツリーを上位階層、中位階層、下位階層に分けて管理し、中位階層において縮小ポインタを用いる例について説明したが、本発明はこれに限定されない。例えば、インデックスツリーを上位階層と下位階層に分けて管理し、下位階層において縮小ポインタを用いるようにしてもよい。
すなわち、図7に示すように、検索処理部1、挿入処理部2、下位階層管理部3’および上位階層管理部4を備えてインデックス管理装置を構成する。下位階層管理部3’は、リーフノードのある階層を第0階層として、第1階層以上で第n階層以下(nは「1≦n<全階層数−1」を満たす任意の値)の下位階層において、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納するとともに、ノードグループ内の各ノードの位置を表す縮小ポインタを格納した第3の種類のノードによってインデックスツリーの探索および更新を管理する。なお、第0階層については第1の種類のノードによってインデックスツリーの探索および更新を管理する。
また、上記実施形態では、内部ノードについては左端のキーが省略されている例について説明したが、左端のキーが省略されていない内部ノードにより構成されるインデックスツリーに対して本発明を適用することも可能である。
上記第1および第2の実施形態によるインデックス管理装置は、リレーショナルデータベースのインデックス、多くのプログラムに組み込まれるマップ処理、ファイルシステム、キーバリューストア、OLAP(online analytical processing)システムなど、更新されるデータに対して検索をかけることのあるシステムに対しては広く利用することが可能である。
その他、上記第1および第2の実施形態は、何れも本発明を実施するにあたっての具体化の一例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその要旨、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。
1 検索処理部
2 挿入処理部
3,3’ 下位階層管理部
4 上位階層管理部
5 中位階層管理部

Claims (8)

  1. 最下位階層であるリーフノードおよびその他の内部ノードからなるインデックスツリーを管理するインデックス管理装置であって、
    所定数のキーと所定数のバリューとの組を格納した上記リーフノードのある階層を第0階層として、第n階層以下(nは「1≦n<全階層数−1」を満たす任意の値)の下位階層において、所定数のキーと子ノードの位置を表す所定数のポインタまたは所定数のバリューとの組を格納した第1の種類のノードによって、上記インデックスツリーの探索および更新を管理する下位階層管理部と、
    上記第n階層よりも上の上位階層において、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納した第2の種類のノードによって、上記インデックスツリーの探索および更新を管理する上位階層管理部とを備えたことを特徴とするインデックス管理装置。
  2. 上記下位階層管理部は、上記第1の種類のノードに格納されているキーの中から検索キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているポインタが示す位置を辿るようになされ、
    上記上位階層管理部は、上記第2の種類のノードに格納されているキーの中から上記検索キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量をノードサイズに基づいて計算することによって特定される位置を辿るようになされていることを特徴とする請求項1に記載のインデックス管理装置。
  3. 上記下位階層管理部は、上記第1の種類のノードに格納されているキーの中から挿入キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているポインタが示す位置を辿ることによって上記挿入キーを挿入すべきリーフノードの探索を行い、探索されたリーフノードに空きスペースがある場合はそのリーフノードに上記挿入キーとバリューとの組を挿入する一方、探索されたリーフノードに空きスペースがない場合はそのリーフノードを分割して上記挿入キーとバリューとの組を挿入するようになされ、
    上記上位階層管理部は、上記第2の種類のノードに格納されているキーの中から上記挿入キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量をノードサイズに基づいて計算することによって特定される位置を辿るようになされていることを特徴とする請求項1に記載のインデックス管理装置。
  4. 上記第1階層よりも1つ上の上記第2階層を中位階層、当該第2階層よりも上の第3階層以上を上位階層とし、
    上記中位階層において、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納するとともに、上記ノードグループ内の各ノードの位置を表すポインタであって上記第1の種類のノードに格納されるポインタよりもサイズの小さい縮小ポインタを格納した第3の種類のノードによって、上記インデックスツリーの探索および更新を管理する中位階層管理部を更に備えたことを特徴とする請求項1に記載のインデックス管理装置。
  5. 上記中位階層管理部は、上記第3の種類のノードに格納されているキーの中から上記検索キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量を上記縮小ポインタに基づいて計算することによって特定される位置を辿るようになされていることを特徴とする請求項4に記載のインデックス管理装置。
  6. 最下位階層であるリーフノードおよびその他の内部ノードからなるインデックスツリーを管理するインデックス管理装置であって、
    所定数のキーと所定数のバリューとの組を格納した上記リーフノードのある階層を第0階層として、第1階層以上で第n階層以下(nは「1≦n<全階層数−1」を満たす任意の値)の下位階層において、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納するとともに、上記ノードグループ内の各ノードの位置を表すのに十分なサイズの縮小ポインタを格納した第3の種類のノードによって、上記インデックスツリーの探索および更新を管理する下位階層管理部と、
    上記第n階層よりも上の上位階層において、所定数のキーと下階層のノードグループの先頭位置を表す1つのグループポインタとを格納した第2の種類のノードによって、上記インデックスツリーの探索および更新を管理する上位階層管理部とを備えたことを特徴とするインデックス管理装置。
  7. 上記下位階層管理部は、上記第3の種類のノードに格納されているキーの中から上記検索キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量を上記縮小ポインタに基づいて計算することによって特定される位置を辿るようになされ、
    上記上位階層管理部は、上記第2の種類のノードに格納されているキーの中から上記検索キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量をノードサイズに基づいて計算することによって特定される位置を辿るようになされていることを特徴とする請求項6に記載のインデックス管理装置。
  8. 上記下位階層管理部は、上記第3の種類のノードに格納されているキーの中から上記挿入キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量を上記縮小ポインタに基づいて計算することによって特定される位置を辿ることによって上記挿入キーを挿入すべきリーフノードの探索を行い、探索されたリーフノードに空きスペースがある場合はそのリーフノードに上記挿入キーとバリューとの組を挿入する一方、探索されたリーフノードに空きスペースがない場合はそのリーフノードを分割して上記挿入キーとポインタとの組を挿入するようになされ、
    上記上位階層管理部は、上記第2の種類のノードに格納されているキーの中から上記挿入キー以下で最大の値を持つキーを探索し、探索したキーと共に同じノード内に格納されているグループポインタが示すノードグループの先頭位置からのオフセット量をノードサイズに基づいて計算することによって特定される位置を辿るようになされていることを特徴とする請求項6に記載のインデックス管理装置。
JP2014036341A 2014-02-27 2014-02-27 インデックス管理装置 Active JP6006740B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2014036341A JP6006740B2 (ja) 2014-02-27 2014-02-27 インデックス管理装置
PCT/JP2014/080851 WO2015129109A1 (ja) 2014-02-27 2014-11-21 インデックス管理装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014036341A JP6006740B2 (ja) 2014-02-27 2014-02-27 インデックス管理装置

Publications (3)

Publication Number Publication Date
JP2015162042A true JP2015162042A (ja) 2015-09-07
JP2015162042A5 JP2015162042A5 (ja) 2015-10-15
JP6006740B2 JP6006740B2 (ja) 2016-10-12

Family

ID=54008453

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014036341A Active JP6006740B2 (ja) 2014-02-27 2014-02-27 インデックス管理装置

Country Status (2)

Country Link
JP (1) JP6006740B2 (ja)
WO (1) WO2015129109A1 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2017179140A1 (ja) * 2016-04-13 2017-10-19 株式会社日立製作所 計算機及びデータベース管理方法

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109510707A (zh) * 2019-01-16 2019-03-22 北京交通大学 基于树状结构模型的群组密钥管理方法
CN112783896B (zh) * 2021-01-12 2023-05-23 湖北宸威玺链信息技术有限公司 一种用于加载文件减少内存使用率的方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07191891A (ja) * 1993-10-20 1995-07-28 Microsoft Corp 多次元データを格納しかつアクセスするコンピュータ方法及び格納構造
JP2000324172A (ja) * 1999-05-11 2000-11-24 Nec Corp アドレスに関するプレフィクスの格納方法
JP2001202277A (ja) * 1999-12-08 2001-07-27 Hewlett Packard Co <Hp> データ処理システム
WO2013035287A1 (ja) * 2011-09-08 2013-03-14 日本電気株式会社 データベース管理装置、データベース管理方法、及びプログラム

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07191891A (ja) * 1993-10-20 1995-07-28 Microsoft Corp 多次元データを格納しかつアクセスするコンピュータ方法及び格納構造
JP2000324172A (ja) * 1999-05-11 2000-11-24 Nec Corp アドレスに関するプレフィクスの格納方法
JP2001202277A (ja) * 1999-12-08 2001-07-27 Hewlett Packard Co <Hp> データ処理システム
WO2013035287A1 (ja) * 2011-09-08 2013-03-14 日本電気株式会社 データベース管理装置、データベース管理方法、及びプログラム

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN7015000149; Jun Rao and Kenneth A. Ross: '"Making B+-Trees Cache Conscious in Main Memory"' SIGMOD '00 Proceedings of the 2000 ACM SIGMOD international conference on Management of data , 20000515, pp. 475-486, ACM *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2017179140A1 (ja) * 2016-04-13 2017-10-19 株式会社日立製作所 計算機及びデータベース管理方法

Also Published As

Publication number Publication date
WO2015129109A1 (ja) 2015-09-03
JP6006740B2 (ja) 2016-10-12

Similar Documents

Publication Publication Date Title
US11238098B2 (en) Heterogenous key-value sets in tree database
US11899641B2 (en) Trie-based indices for databases
WO2018064962A1 (zh) 数据存储方法、电子设备和计算机非易失性存储介质
US10831736B2 (en) Fast multi-tier indexing supporting dynamic update
US9411840B2 (en) Scalable data structures
US10114908B2 (en) Hybrid table implementation by using buffer pool as permanent in-memory storage for memory-resident data
US20160203135A1 (en) In-memory latch-free index structure
KR102034833B1 (ko) 플래시 저장장치의 내부 병렬성을 이용하는 키 값 기반의 데이터 액세스 장치 및 방법
Ahn et al. ForestDB: A fast key-value storage system for variable-length string keys
CN105117417A (zh) 一种读优化的内存数据库Trie树索引方法
JP2015090615A (ja) データを管理するシステムおよび方法
CN110168532B (zh) 数据更新方法和存储装置
CN103914483B (zh) 文件存储方法、装置及文件读取方法、装置
CN106570113B (zh) 一种海量矢量切片数据云存储方法及系统
JP6006740B2 (ja) インデックス管理装置
JP5790755B2 (ja) データベース管理装置及びデータベース管理方法
CN107273443B (zh) 一种基于大数据模型元数据的混合索引方法
EP3940572A1 (en) Data generalization device, data generalization method, and program
WO2012081165A1 (ja) データベース管理装置及びデータベース管理方法
JP2014130492A (ja) インデックスの生成方法及び計算機システム
US20220365905A1 (en) Metadata processing method and apparatus, and a computer-readable storage medium
KR100878142B1 (ko) 플래시 메모리 상에서의 효율적인 동작을 위한 수정된b-트리 인덱스 구성 방법
JP2007048318A (ja) リレーショナルデータベースの処理方法およびリレーショナルデータベース処理装置
Veretennikov About a structure of easily updatable full-text indexes
JP2008065716A (ja) データ管理装置、データ管理方法及びデータ管理プログラム

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20150813

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150813

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A712

Effective date: 20160725

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: 20160906

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160909

R150 Certificate of patent or registration of utility model

Ref document number: 6006740

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

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