(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023141215
(43)【公開日】2023-10-05
(54)【発明の名称】インデックス管理装置
(51)【国際特許分類】
G06F 16/22 20190101AFI20230928BHJP
【FI】
G06F16/22
【審査請求】未請求
【請求項の数】2
【出願形態】OL
(21)【出願番号】P 2022047421
(22)【出願日】2022-03-23
(71)【出願人】
【識別番号】593230202
【氏名又は名称】株式会社エヌ・ティ・ティ・データ・セキスイシステムズ
(74)【代理人】
【識別番号】240000327
【弁護士】
【氏名又は名称】弁護士法人クレオ国際法律特許事務所
(72)【発明者】
【氏名】金澤 康平
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175KA04
5B175KA11
(57)【要約】
【課題】データの並び変えが必要となる手法にブルームフィルタを適用できるようにすることで、既存データが多量であっても迅速に更新処理が行えるようになるうえに、検索性能の向上も見込まれるインデックス管理装置を提供する。
【解決手段】2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置3である。
そして、ルートノードとリーフノードを含む複数のノードからなる階層構造のインデックスを生成するインデックス生成手段31と、ノードにポインタとキー情報を格納させる処理を行うエントリ処理手段32と、複数の多次元データに対して、所定の条件下で最小となる正整数PSを算出して、正整数PSに基づく分割を繰り返すことでノードを更新する更新処理手段33とを備えている。
【選択図】
図1
【特許請求の範囲】
【請求項1】
2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置であって、
複数のノードからなる階層構造のインデックスを生成するインデックス生成手段と、
前記ノードにポインタとキー情報を格納させる処理を行う際に、前記キー情報が前記数量の場合は範囲検索に設定し、前記キー情報が前記非順序離散値の場合はブルームフィルタを適用した指定値検索に設定する処理を行うエントリ処理手段と、
複数の前記多次元データに対して、所定の条件下で最小となる正整数PSを算出するとともに、前記キー情報に関して並び変えて前記正整数PSに基づいて分割するという処理を繰り返すことで、前記ノードを更新する更新処理手段とを備え、
前記更新処理手段における並び替えの際に、前記キー情報が前記非順序離散値の場合は、所定のまとまり毎に1であるビットの有無を調べて有を1、無を0で表した2ビットのビット列に基づいて大小関係を決定することを特徴とするインデックス管理装置。
【請求項2】
ビット数Nが2^n(n:1以上の整数)である2つのブルームフィルタ(BX,BY)の大小関係を、以下の手順で決定することを特徴とする請求項1に記載のインデックス管理装置。
(手順1)変数KKをn-1で初期化する。
(手順2)BXとBYのそれぞれについて、2^KKビットごとに1であるビットの有無を調べ、有を1、無を0で表した2ビットのビット列をBX'とBY'とする。
(手順3)BX'とBY'にそれぞれ1ビット分の右シフト演算を施したビット列をBX''とBY''とする。
(手順4)BX'とBX''の排他的論理和(XOR演算)の結果をBX'''とし、BY'とBY''の排他的論理和の結果をBY'''とする。
(手順5)2進数として見たときに、BX''' > BY'''であればBX > BYと決定し、BX''' < BY'''であればBX < BYと決定し、いずれにも該当しない場合は、KK=0であればBX=BYと決定し、KK≠0であればKK-1として(手順2)から繰り返す。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置に関するものである。
【背景技術】
【0002】
データ検索を高速化する技術として、検索用のインデックスを作成する手法が知られている。要するに、特定のキーに対応するデータを検索する場合に、データベース内の全てのレコードを先頭から1つずつ調べていくと膨大な時間がかかってしまうため、特定のキーに対する検索を高速化するために、インデックスツリーを生成しておくことが知られている(特許文献1,2など参照)。
【0003】
ここで、データベースに記録するデータの組はレコードと呼ばれ、その中で検索に用いられるデータはキーと呼ばれる。データベースに格納されたレコードをキーで検索するには、キー順にレコードがソートされているのが望ましいが、レコードをキー順にソートして記録する処理は時間がかかる。
【0004】
そこで、レコードは到着順に記録し、キーと対応するレコードへのポインタをツリー構造(木構造)でソートして別途記録するのが一般的であり、それをインデックスツリーと呼ぶ。代表的なインデックスの実装方法としては、Balanced Tree(B木)と呼ばれるデータ構造によるものが知られており、商用のデータベースやファイルシステムなどによく用いられている。
【0005】
B木は、データを特定の列に関して並べ替え、入れ子構造に分割したものとみなせる。それにより1列に関する範囲検索(指定下限値以上かつ指定上限値以下の値を持つレコードの抽出)は、キーに関する単純な大小比較のみで高速に行える。また、複数列に関する範囲検索も、第1列が同値の場合のみ第2列を比較し、第2列も同値の場合は第3列を比較するというような処理にすることで同様に扱えるが、実際に意味があるのは最初の数列程度であることが多い。
【0006】
一方、特許文献1,2に開示されているRectangle Tree(R木)は、データを長方形(2次元の場合。一般には超直方体)で再帰的に分割したものとみなせる。B木のような大小比較ではなく、検索範囲を長方形とみなして長方形同士の包含関係を調べることで、範囲検索を行う。しかし、その内部処理中、長方形の面積等を判断基準として用いるために、R木のインデックスで設定できるのは、2値間の順序と距離が適切に定義可能な数量に限られ、2値間の順序も距離も適切に定義することができない非順序離散値は扱うことができない。
【0007】
そこで、R木を非順序離散値も扱えるように拡張したものとして、非特許文献1に開示されているC-ND木が提案されている。C-ND木は、非順序離散値の列については、「長方形の一辺の長さ」を個別値の数で代替したR木とみなすことができる。C-ND木はR木の良い性質を受け継ぎつつ非順序離散値も扱えるため、単一のインデックスで既存インデックスの弱点をカバーできる可能性がある。
【0008】
一方、C-ND木は、非順序離散値の「範囲」を表現するのに単純なビット配列を用いるため、予め取り得るすべての個別値を知っておく必要がある。また、個別値の数が非常に多い場合は、要求される記憶容量が膨大になる。
【0009】
そこで、本出願人は、特許文献3に開示されているように、非順序離散値の指定値検索の設定にブルームフィルタを適用することで、2値間の順序も距離も適切に定義不能な非順序離散値が含まれる多次元データの検索を、記憶容量を抑えながらも高速で行えるようにした。
【先行技術文献】
【特許文献】
【0010】
【特許文献1】特開2003-330943号公報
【特許文献2】特許第3708809号公報
【特許文献3】特開2021-114037号公報
【非特許文献】
【0011】
【非特許文献1】Changqing Chen et al.,The C-ND Tree:A Multidimensional Index for Hybrid Continuous and Non-ordered Discrete Data Spaces,EDBT '09 Proceedings of the 12th International Conference on Extending Database Technology,2009.3,p.462-471
【非特許文献2】Scott Leutenegger et al.,STR: A Simple and Efficient Algorithm for R-Tree Packing, Proceedings 13th International Conference on Data Engineering,1997.4,p.497-506
【発明の概要】
【発明が解決しようとする課題】
【0012】
しかしながら、特許文献3で開示したような、新規データ1レコードが追加された場合に、0レコードの状態から更新手順を適宜繰り返すことで、任意の数のレコードに対するインデックスを構築する更新手段では、既存データが多量になると更新処理に膨大な時間がかかることになる。
【0013】
他方、非特許文献2に開示されているように、R木に対してはバルクローディング手法が開発されている。この非特許文献2に記載された手法では、データの並び変えが必要となるが、ブルームフィルタについて、どのような並び順が適切であるかは知られていない。
【0014】
そこで、本発明は、データの並び変えが必要となる手法にブルームフィルタを適用できるようにすることで、既存データが多量であっても迅速に更新処理が行えるようになるうえに、検索性能の向上も見込まれるインデックス管理装置を提供することを目的としている。
【課題を解決するための手段】
【0015】
前記目的を達成するために、本発明のインデックス管理装置は、2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置であって、
複数のノードからなる階層構造のインデックスを生成するインデックス生成手段と、前記ノードにポインタとキー情報を格納させる処理を行う際に、前記キー情報が前記数量の場合は範囲検索に設定し、前記キー情報が前記非順序離散値の場合はブルームフィルタを適用した指定値検索に設定する処理を行うエントリ処理手段と、複数の前記多次元データに対して、所定の条件下で最小となる正整数PSを算出するとともに、前記キー情報に関して並び変えて前記正整数PSに基づいて分割するという処理を繰り返すことで、前記ノードを更新する更新処理手段とを備え、前記更新処理手段における並び替えの際に、前記キー情報が前記非順序離散値の場合は、所定のまとまり毎に1であるビットの有無を調べて有を1、無を0で表した2ビットのビット列に基づいて大小関係を決定することを特徴とする。
【発明の効果】
【0016】
このように構成された本発明のインデックス管理装置は、ノードにポインタとキー情報を格納させる処理を行うエントリ処理手段において、キー情報が数量の場合は範囲検索に設定し、キー情報が非順序離散値の場合は指定値検索に設定する処理を行う。そして、指定値検索の設定には、ブルームフィルタが適用される。
【0017】
また、複数の多次元データに対して、所定の条件下で最小となる正整数PSを算出するとともに、キー情報に関して並び変えて正整数PSに基づいて分割するという処理を繰り返すことで、ノードを更新する更新処理手段を備えている。
【0018】
そして、更新処理手段における並び替えの際には、キー情報が非順序離散値の場合は、所定のまとまり毎に1であるビットの有無を調べて有を1、無を0で表した2ビットのビット列に基づいて大小関係を決定する。
【0019】
要するに、データの並び変えが必要となる手法にブルームフィルタを適用できるようにすることで、既存データが多量であっても迅速に更新処理が行えるようになるうえに、検索性能の向上も見込まれるインデックスを構築することができるようになる。
【図面の簡単な説明】
【0020】
【
図1】本発明の実施の形態のインデックス管理装置が組み込まれる多次元データ検索システムの全体構成の概要を説明するブロック図である。
【
図2】インデックスの基本構造を例示した説明図である。
【
図3】数値と区分値とが含まれる多次元データのインデックスを使った検索例の説明図である。
【
図4】ブルームフィルタの偽陽性確率を計算した結果を例示した説明図である。
【
図5】ブルームフィルタのパラメータ検討時の想定データを例示した説明図である。
【
図6】インデックスの各段における各ノードの子孫が含む平均区分値数を仮定した説明図である。
【
図7】ハッシュ関数の数Kについての検討において、(a)は区分値Aの偽陽性確率の算出結果を示した一覧表、(b)は区分値Bの偽陽性確率の算出結果を示した一覧表である。
【
図8】追加レコードがあった場合にインデックスが更新される概要を示した説明図である。
【
図9】第1キーと第2キーを軸とする空間に、対象データを分散させたイメージを示した説明図である。
【
図10】第1キーと第2キーを軸とする空間に、リーフノードを分散させたイメージを示した説明図である。
【
図11】第1キーと第2キーを軸とする空間に、中間ノードを分散させたイメージを示した説明図である。
【
図12】実施例1の検証に用いたインデックスを模式的に示した説明図である。
【
図13】「単純な比較方法」を採用したインデックスの平均ノード数と標準偏差を一覧表にして示した説明図である。
【
図14】「本比較方法」を採用したインデックスの平均ノード数と標準偏差を一覧表にして示した説明図である。
【発明を実施するための形態】
【0021】
以下、本発明の実施の形態について図面を参照して説明する。
本実施の形態のインデックス管理装置は、多次元データが格納されたデータベースを備えた多次元データ検索システム1に組み込まれる。
図1は、多次元データ検索システム1の全体構成の概要を示したブロック図である。
【0022】
多次元データ検索システム1は、入力手段2と、インデックス管理装置3と、データベース4とを備えている。入力手段2には、キーボードやマウスやタッチパネルなどの指令やデータなどを直接入力する手段、フラッシュメモリやハードディスクなどの記憶媒体から取り込ませる手段、インターネットやLANなど通信回線を介して取り込ませる手段などがある。
【0023】
また、データベース4には、インデックスZの構造やデータなどのインデックス情報41と、検索対象となる多次元データであるレコード42などが格納される。本実施の形態では、レコード42として、数量のデータと非順序離散値のデータとが組み合わされたものが扱われる。
【0024】
ここで、「数量」とは、2値間の順序と距離が適切に定義可能なデータで、大小の比較が可能な長さや重さや時刻などの数値が該当する。一方、「非順序離散値」とは、2値間の順序も距離も適切に定義不能なデータで、色の種類や地名や文字などの区分値が該当する。
【0025】
図2は、複数のレコード(「R00」,「R01」などの行IDによって識別されるデータ行)が記録されたデータベースであるレコード群Wと、そのレコード群Wの中から所期のレコードを短時間で抽出させるために作成されるインデックスZとを模式的に例示した図である。
【0026】
このインデックスZの基本構造は、ノードを3段以上にわたって階層的に配置するツリー構造(木構造)である。最上段(最上層)のノードはルートノード(根ノード)ZAと呼ばれ、最下段(最下層)のノードはリーフノード(葉ノード)ZCと呼ばれる。そして、ルートノードZAとリーフノードZCとの間に配置される1段以上のノードは、中間ノード(内部ノード)ZBと呼ばれる。
【0027】
各ノード(ZA,ZB,ZC)は、ノードを識別するためのノードIDと、ノードにデータを格納するためのエントリとによって構成される。ノード(ZA,ZB,ZC)のエントリには、ポインタとキー情報とが格納される。
【0028】
「ポインタ」とは、リーフノードZC以外のノード(ZA,ZB)では、エントリに記録されたキー情報に対応する下位のノード(子ノード)を指し示すデータをいう。一方、リーフノードZCでは、元データとなるレコード(例えば行ID「R00」で識別される1行のデータ組)を指し示すデータがポインタとなる。
【0029】
「キー情報」とは、レコードに含まれるデータの中で検索に用いられるデータをいう。本実施の形態では、数量も非順序離散値もキー情報になり得る。リーフノードZCに格納されるキー情報は、元データ(例えば1行のレコード)のキー列の値である。リーフノードZC以外のノード(ZA,ZB)では、子孫(子ノードやそれに繋がる子ノードなど)となる全リーフノードZCのキー情報の要約が記録される。例えば数値列であれば、最小値と最大値の組がキー情報として記録され、区分値列であれば後述するブルームフィルタがキー情報として記録される。
【0030】
例えば
図2で説明すると、最上層のルートノードZAには、ノードIDが「N10」のノードが存在し、「N10」に格納された10個のエントリ(エントリ0からエントリ9)には、中間ノードZBの対応するノードを指すポインタ(例えば「エントリ0」には「N20」)と、キー情報となる数値「0~600」と、キー情報となる区分値「11010101」とが記録されている。ここで、数値は「0~600」という範囲で設定され、区分値は「11010101」という指定値で設定されている。
【0031】
中間ノードZBにおいても、同様に複数のエントリが格納されたノードが配置されていて、例えばノードIDが「N20」の「エントリ0」に該当する場合は、下位のノードIDが「N30」のノードに移行していくことになる。そして、最下層のリーフノードZCのノードID「N90」に辿り着いた場合には、その「エントリ0」が指し示すレコード群Wの行IDが「R00」のレコードが抽出されることになる。
【0032】
上述したデータ検索を別の表現で説明すると、検索対象となったノードXがリーフノードZCであって、ノードXのキー情報が検索条件に合致する場合は、ノードXのポインタが指す元データの1行(「R00」,「R01」など)が検索の結果集合Sに加えられることになる。一方、検索対象となったノードXがリーフノードZC以外であれば、ノードXのエントリのうち、子孫が検索条件に合致する可能性のあるキー情報が記録されたエントリのそれぞれについて、下位のノードの探索が行われることになる。
【0033】
このような検索を高速で行わせるための本実施の形態のインデックス管理装置3は、
図1に示すように、ツリー構造のインデックスZを生成させるインデックス生成手段31と、各ノードのエントリに格納されるデータの処理などを行うエントリ処理手段32と、新たにレコードが追加されるなどしてインデックスZの更新が必要になったときに動作する更新処理手段33とを備えている。また、エントリ処理手段32には、後述するブルームフィルタのパラメータの設定などを行うためのブルームフィルタ設定部321が設けられる。
【0034】
続いて
図3を参照しながら、数値と区分値とが含まれる多次元データのインデックスZを使った検索例について説明する。まず検索するにあたっては、検索条件が設定される。ここでは、検索条件を「50 ≦数値列≦ 70 かつ 区分値列= A」とする。区分値列の「A」は、ブルームフィルタ「00010001」に置き換えられる。
【0035】
検索条件に基づいてルートノードZAを参照すると、ノードID「N10」の「エントリ0」が数値の範囲検索においても区分値の指定値検索においても検索条件に該当しているため、下位の中間ノードZBのノードID「N20」に移行する。
【0036】
中間ノードZBの「N20」では、「エントリ0」は数値列が検索条件に該当しないが、「エントリ1」が数値列と区分値列の両方が検索条件に該当しているため、「エントリ1」のポインタ「N31」に従って、リーフノードZCの「N31」に移行する。そして、検索条件に該当する「エントリ1」のポインタ「R05」に従って、レコード群Wから行ID「R05」の1行のレコードが抽出される。このレコードには、キー情報である数値や区分値の他に、キー情報とされていない非キー列にある「へ」というデータも記録されている。なお、この例では、ルートノードZAのノードID「N10」の「エントリ1」が検索条件に該当しないので、「エントリ1」が指す下位のノードへの更なる検索は不要になる。
【0037】
ここで、C-ND木(非特許文献1)では、区分値を表現するのに単純なビット配列を用いるため、予め取り得るすべての個別値を把握して、その数に合わせてビット数を確保しておく必要がある。このため、想定される区分値の種類(数)が多くなると記憶容量が増大することになるし、区分値の範囲が想定できない場合は適用できないこともある。
【0038】
そこで、本実施の形態のインデックス管理装置3では、区分値をブルームフィルタを適用して表現する。ブルームフィルタは、集合にある要素が含まれるか否かを、確率的に判定できるデータ構造で、空間効率のよい構造と言える。ブルームフィルタを適用することによって、個別値の多寡にかかわらず、一定のビット数で非順序離散値の範囲が表現できるようになる。
【0039】
ブルームフィルタを適用するにあたっては、適当な正整数Nと、1個以上(K個とする)の異なるハッシュ関数(F_1, F_2,・・・,F_K)を予め決めておく。ただし、各ハッシュ関数は、値域が1~Nの整数であることが必要である。これは任意のハッシュ関数の結果に対して、Nによる剰余+1を計算することで可能である。
【0040】
例えば、データXに対するブルームフィルタB(X)は、第F_i(X)ビット(i = 1, 2,・・・,K)を「1」とし、その他を「0」としたNビットのビット列で表現することができる。そして、データの集合S = {X_1, X_2,・・・}に対するブルームフィルタB(S)は、B(S) = B(X_1), B(X_2),・・・のビットOR演算の結果となる。
【0041】
例えば、ビット数Nが「8」の場合に、“赤”というデータに対しては、F_1(“赤”)=1,F_2(“赤”)=4であるとすると、ブルームフィルタB(“赤”)は「00001001」となる。また、“青”というデータに対しては、F_1(“青”)=4,F_2(“青”)=8であるとすると、ブルームフィルタB(“青”)は「10001000」となる。そして、これらのビットOR演算結果は、B({“赤”,“青”}) = 10001001となる。
【0042】
任意の集合Sにおいて、データXに対し「B(X) AND B(S) ≠ B(X) ならばXはSに属しない」が成り立つ。ここで「AND」は、ビットAND演算を示す。一方、「B(X) AND B(S) = B(X) ならば X ∈ S」は成り立たない。したがって、集合の要約としてブルームフィルタを記録しておけば、あるデータがその集合に含まれるかどうかを、元の集合を参照することなく容易に判定することができる。ただし、「属しない場合(No)」は確実な結果となり、「属する場合(Yes)」は確率的な結果となる。
【0043】
例えば、B(S) = 10001001の場合に、B(“黄”) = 00100001であれば、B(“黄”) AND B(S) = 00000001 ≠ B(“黄”)となり、確実に“黄”は集合Sに属さないと言える。一方、B(“紫”) = 10000001であれば、B(“紫”) AND B(S) = 10000001 = B(“紫”)となり、“紫”は集合Sに属する(”紫”∈S)可能性があると言える。
【0044】
そして、数値xの集合Sをその最小値(m)と最大値(M)とで要約する場合も、「x < m 又は M < x ならばxはSに属しない」は成り立つが、「m ≦ x ≦ Mならばx ∈ S」は成り立たないので、ブルームフィルタはそのような要約の非数値版として捉えることができる。
【0045】
続いて、各データのサイズに関する説明を行う。あるデータ列に関する幅を決める場合に、数値の場合であれば、「最大値-最小値」をデータ全体の幅とすることができる。一方、区分値の場合は、ブルームフィルタ中の「1」の数を全体の幅とすることができる。例えば、「10010001」であれば、幅は「3」となる。また、「正規化幅=幅/データ全体の幅」であるとする。
【0046】
そして、各データのサイズを、各列に関する相対幅(正規化幅)の2乗和とすると、例えば数値のみのデータであれば、各列の最小値から最大値で定義される超直方体の対角線の長さの2乗をサイズとみなすことができる。
【0047】
そこで、
図2に示したインデックスZを例にして、データのサイズの説明を続ける。データ全体の幅は、数値列についてはルートノードZAを見ると「900 - 0」になるため「900」、区分値列については最大で「11111111」(
図2のレコード群Wでは、区分値(A,B)のみ例示)になるため「8」である。
【0048】
また、中間ノードZBの「N20」の「エントリ0」の幅は、数値列が「90」、区分値列が「4」となる。このため、「N20」の「エントリ0」の正規化幅は、数値列が「0.1」、区分値列が「0.5」となり、「N20」の「エントリ0」のサイズは0.26となる。
【0049】
ところでブルームフィルタには、偽陰性(false negative)はないが、偽陽性(false positive)による誤検出の可能性がある。また、要素を集合に追加することはできるが、削除することはできない。そして、集合に要素が追加されるにつれて、偽陽性の可能性が高くなるという性質がある。
【0050】
そこで、ブルームフィルタのビット数Nとハッシュ関数の数Kを適切に設定して適用する必要がある。以下では、
図4-
図7を参照しながら、適用にあたっての各パラメータの検討結果について説明する。
【0051】
まず、ビット数がN個のブルームフィルタの偽陽性確率について説明する。1個の値のハッシュ関数1個によるブルームフィルタ表現における、あるビットが0である確率P1は、P1 = (1 - 1 / N)となる。これより、1個の値のハッシュ関数K個によるブルームフィルタ表現における、あるビットが0である確率P2は、P2 = P1^K = (1 - 1 / N)^Kとなる。
【0052】
さらに、M個の値のハッシュ関数K個によるブルームフィルタ表現における、あるビットが0である確率P3は、P3 = P2^M = (1 - 1 / N)^(K×M)となる。そして、M個の値のハッシュ関数K個によるブルームフィルタ表現における、あるビットが1である確率P4は、P4 = 1 - P3 = 1 - (1 - 1 / N)^(K×M)となる。
【0053】
この結果、K個のハッシュ関数を用いて、M個の値を含むブルームフィルタが、実際には含んでいない値を含むかもしれない(含む可能性がある)と判定する確率(偽陽性確率)は、ハッシュ関数K個の結果に対応するブルームフィルタのビットが全て1である確率であるため、P4^K = (1 - (1 - 1 / N)^(K×M))^Kとなる。
【0054】
図4に、ビット数がN = 128の場合に、上述したM個の値とK個の値を様々に変化させてブルームフィルタの偽陽性確率を計算した結果を例示した。すなわち、偽陽性確率の式から、所与のN,Mに対して偽陽性確率を最小化するKの値が計算できる。
【0055】
続いて、ブルームフィルタを適用するにあたって、決めるべきパラメータについて説明する。まず、ブルームフィルタのビット数Nがパラメータになる。ビット数Nは、データ列ごとに異なるビット数を設定することも考えられるが、ここでは一定の値とする。
【0056】
また、ブルームフィルタの計算時に用いるハッシュ関数の数Kもパラメータになる。さらに、1ノードのエントリ数の上限(E_max)と下限(E_min)も決めるべきパラメータになる。1ノードのエントリ数の上限(E_max)を超えてデータが追加された場合には、ノード分割が起こることになる。また、1ノードのエントリ数の下限(E_min)は、(E_max / 2)が上限で、それを超えるとノード分割時に違反が生じることになる。
【0057】
パラメータの最適値を検討するにあたって、想定データ条件として、10億(≒ 2^30)件程度のレコード数からなるレコード群Wを想定し、2つの数値列と2つの区分値列が含まれているものとした。
図5に、想定データの一部を例示した。ここで、区分値列が取り得る値の数は、区分値列Aについては「16」、区分値列Bについては「256」とする。
【0058】
まず、ビット数Nの検討を行う。多くの場合、数値は8バイト以下で表現される。したがって、数値列のキー情報には、最小値と最大値を記憶させるために、16バイトが必要となる。区分値列についても、同程度のバイト数に収まることが望ましいので、ビット数Nを128ビット(= 16バイト)とする。
【0059】
続いて、エントリ数の上限(E_max)と下限(E_min)について検討する。まずエントリ数の上限(E_max)について検討する。データベースの速度には、ディスクI/O(ハードディスク等の記憶装置とのデータのやり取り)の量が大きく影響し、データベースのブロックサイズ(1回のディスクI/Oのデータ量)は、通常8KiB(=8192バイト)程度である。したがって、インデックスの1ノードが持つデータ量も、8KiBに収めることが望ましい。想定データ条件では、1エントリあたりのデータ量は、(数値列16バイト×2+区分値列16バイト×2)= 64バイトであるので、エントリ数の上限(E_max)を、E_max = 8192 / 64 = 128に設定する。
【0060】
エントリ数の下限(E_min)については、小さく設定することでノード分割における選択肢が増え、結果として検索性能が向上する可能性もあるが、評価が難しい。一方、ディスクI/Oの観点から言えば、大きい方が1ノードに空のエントリが少なくなってよいので、上限であるE_max / 2 = 64を、エントリ数の下限(E_min)に設定する。
【0061】
最後に、ハッシュ関数の数Kについて検討する。上記した想定データ件数(10億件)の場合、上記したエントリ数の上限(E_max)及び下限(E_min)の条件下では、インデックスZの木(ツリー)の高さは、5段となる。
【0062】
そこで、データ追加手順やノード分割手順において、サイズが小さく抑えられるようにブルームフィルタが含む値数が小さくなるような選択が行われることを考慮して、インデックスZの各段において、各ノードの子孫が含む平均区分値数が、
図6の表に示した値になると仮定する。
【0063】
この
図6に示した平均区分値数と
図4に示したブルームフィルタの偽陽性確率とを基にすれば、元テーブルに含まれていない区分値を検索した場合にアクセスするノード数の期待値が計算できる。アクセスノード数は、必要なディスクI/Oの数とほぼ同じ数になるので、偽陽性が検索性能に与える影響を評価する指標として妥当なものであると言える。
【0064】
そこで、偽陽性に与える影響を各区分値(A,B)ついて計算する。区分値Aについて、K=1の場合にアクセスするノード数は、1段目がルートノードのみの場合は「1」、2段目がルートノードのエントリのうち偽陽性のものとなるので「128×0.0608」、3段目は2段目でアクセスしたノードのエントリのうち偽陽性のものとなるので「128×0.0608×128×0.0309」となる。すなわち、5段目までにアクセスするノード数は、1 + 128×0.0608 + 128×0.0608×128×0.0309 + 128×0.0608×128×0.0309×128×0.0156 + 128×0.0608×128×0.0309×128×0.0156×128×0.0078 ≒ 162となる。
【0065】
同様にK=2,3,4,5についても計算すると、以下のようになる。
K=2: 1 + 128×0.0139×(1 + 128×0.0037×( 1 + 128×0.0010×(1 + 128×0.0002))) ≒ 3.73
K=3: 1 + 128×0.0051×(1 + 128×0.0007×( 1 + 128×0.0001×(1 + 128×0.0000))) ≒ 1.71
K=4: 1 + 128×0.0024×(1 + 128×0.0002×( 1 + 128×0.0000×(1 + 128×0.0000))) ≒ 1.32
K=5: 1 + 128×0.0014×(1 + 128×0.0001×( 1 + 128×0.0000×(1 + 128×0.0000))) ≒ 1.18
図7(a)に、区分値Aの偽陽性確率の算出結果を一覧表にして示した。
【0066】
一方、区分値Bについて、K=1の場合にアクセスするノード数は、1 + 128×0.3947 + 128×0.3947×128×0.1179 + 128×0.3947×128×0.1179×128×0.0309 + 128×0.3947×128×0.1179×128×0.0309×128×0.0078 ≒6840となる。
【0067】
そして、K=2,3,4,5について計算した結果は、以下のようになる。
K=2: 1 + 128×0.4014×(1 + 128×0.0493×( 1 + 128×0.0037×(1 + 128×0.0002))) ≒ 534
K=3: 1 + 128×0.4712×(1 + 128×0.0309×( 1 + 128×0.0007×(1 + 128×0.0000))) ≒ 321
K=4: 1 + 128×0.5617×(1 + 128×0.0243×( 1 + 128×0.0002×(1 + 128×0.0000))) ≒ 302
K=5: 1 + 128×0.6545×(1 + 128×0.0220×( 1 + 128×0.0001×(1 + 128×0.0000))) ≒ 323
図7(b)に、区分値Bの偽陽性確率の算出結果を一覧表にして示した。
【0068】
以上の結果から、上記した想定データ条件では、ハッシュ関数の数Kは「K = 4」又は「K = 5」とするのが適切と思われる。
【0069】
続いて、インデックス管理装置3の更新処理について説明する。
図8は、新たに多次元データが追加レコードW1としてレコード群Wに追加された場合に、インデックスが更新されることの概要を説明するための図である。ここで、
図2を更新前のインデックスZとし、
図8を更新後のインデックスNZとする。
【0070】
すなわち、レコード群Wに追加レコードW1(行ID:R08)が追加されると、その追加レコードW1の検索を可能にするために、インデックスZがインデックスNZに更新される。
図8に示したインデックスNZは、
図2に示したインデックスZと比べて、ルートノードZA、中間ノードZB、リーフノードZCの各階層のノードのエントリが更新されている。
【0071】
これに対して、初期データを一括投入するバルクローディング手法を適用しても、ノードを更新したインデックスを構築することができる。
以下では、バルクローディング手法を適用した更新処理手段33による更新処理の流れについて説明する。
【0072】
具体的には、R木に対するバルクローディング手法(非特許文献2参照)を改良して適用する。すなわち、非特許文献2に記載されたバルクローディング手法では、データの大小比較を要するので、非順序離散値にそのまま適用することはできない。そこで、非順序離散値をブルームフィルタに変換して扱う本実施の形態のインデックス管理装置3において、ブルームフィルタに関して有効な比較手順を導入する。
【0073】
ここでは、更新処理の対象となる対象データ件数をNN、インデックスのキー列数をNK、1ノードが保持する最大エントリ数をNMとする。
第1ステップでは、NN ≦ NMであれば、全対象データを指すインデックスノード(ルートノード)を作って、更新処理を完了させることができる。
【0074】
一方、NN > NMであれば、第2ステップとして、所定の条件であるNM×PS^NK ≧ NNとなる最小の正整数PSを計算する。そして、第3ステップでは、NN個の対象データを、キー情報の中の第1キーに関して並び替え、その順に沿って、概ね同じ件数のPS個のグループに分割する。
【0075】
続いて第4ステップでは、それらグループのそれぞれについて、グループに属するデータを、キー情報である第2キーに関して並び替え、その順に沿って、更に概ね同じ件数のPS個のグループに細分する。
【0076】
図9は、対象データ件数NN=28、インデックスのキー列数NK=2(縦軸と横軸)、1ノードが保持する最大エントリ数NM=4としたときのイメージを示した説明図である。このとき、NM×PS^NK ≧ NNとなる最小の正整数PSは3となる。要するに、第1キーと第2キーに関して、それぞれ並び替えられたデータが、3分割(破線参照)されたイメージを示している。
【0077】
一方、キー列数NKが2より大きい場合は、第5ステップとして、同様の手順を第NK列まで繰り返し、最終的には、1グループがNM件以下のデータから成るグループ群(PS^NK個)を得る。
【0078】
そして、第6ステップでは、各グループそれぞれについて、そのグループ内のデータを指すインデックスノード(リーフノード)を作る。また、第7ステップでは、対象データをそれらノードに置き換え、対象データ件数NNはグループ数に置き換えて、上述した第1ステップに戻って、処理を繰り返す。
【0079】
図10は、リーフノードによってグループ数NN=9個のデータが作成されたイメージを示している。そこで、再びNM×PS^NK ≧ NNとなる最小の正整数PSを計算すると、2となる。要するに、
図10は、第1キーと第2キーに関してそれぞれ並び替えられたリーフノードによるデータが、それぞれ2分割(破線参照)されたイメージを示している。
【0080】
そこで、各グループのそれぞれについて、そのグループ内のデータを指すインデックスノード(中間ノード)を作る。そして、対象データをそれらノードに置き換え、対象データ件数NNを新たなグループ数NN=4個に置き換えて、上述した第1ステップに戻って、処理を繰り返す。
【0081】
図11は、中間ノードによってグループ数NN=4個のデータが作成されたイメージを示している。そして、第1ステップで、データの数NNと1ノードが保持する最大エントリ数NM=4とを比較すると、NN(=4)≦NM(=4)となるので、更新処理を完了させることができる。
【0082】
ところで、2^NK > NMだと無限ループが起こるので、その場合は上記した第4ステップ及び第5ステップは、適宜途中で打ち切り、最終的なグループ数をNM以下に抑える。また、第3ステップから第5ステップにおける並べ替えの手法は、クイックソート等の一般的なソートアルゴリズムを想定している。
【0083】
そして、ソートアルゴリズムにおけるデータ間の比較方法は、キーの種類によって異なることになる。まず、キーが数量で、1ループ目(リーフノード作成時)の場合は、単に元データを数値として比較すればよい。
【0084】
一方、2ループ目以降は、キー情報が最小値と最大値のペアになるが、まずは最小値で比較し、最小値が等しければ最大値で比較することになる。これに対して、キーが非順序離散値、すなわちキー情報がブルームフィルタである場合の比較方法は、数量の場合と異なるので、以下で詳述する。
【0085】
比較対象となるブルームフィルタX1,Y1に対して、以下の手順で大小関係(X1 > Y1 or X1 = Y1 or X1 < Y1)を決定する。ここでは、説明を簡単にするために、16ビットで説明する。
【0086】
まず、X1について、8ビットごとに、1であるビットの有無を調べ、有を1、無を0で表した2ビットのビット列X8に変換する。
(例)0001101100011011 → 11 、0000000001000000 → 01
【0087】
続いて、X8と、X8を1ビット右シフトしたビット列とで、XOR演算(排他的論理和)を行い、その結果をX8'とする。
(例)00 xor00 → 00、01 xor 00 → 01 、10 xor 01 → 11 、11 xor 01 → 10
【0088】
同様にY8'を計算し、X8'とY8'とを2進数と見なして比較する。そして、X8' > Y8'であれば、X1 > Y1と決定して比較が完了する。また、X8' < Y8'であれば、X1 < Y1と決定して比較が完了する。
【0089】
それ以外の場合は、X1について、4ビットごとに1であるビットの有無を調べ、有を1、無を0で表した4ビットのビット列X4に変換する。
(例)0001101100011011 → 1111、0000100001000010 → 0111
【0090】
そして、X4と、X4を1ビット右シフトしたビット列とで、XOR演算を行い、その結果をX4'とする。
(例)0000 xor0000 → 0000、1010 xor 0101 → 1111 、1110 xor 0111 → 1001
【0091】
同様にY4'を計算し、X4'とY4'を2進数と見なして比較する。そして、X4' > Y4'であれば、X1 > Y1 と決定して比較を完了する。また、X4' < Y4'であれば、X1 < Y1と決定して比較を完了する。このような手順を2ビットずつ、1ビットずつで繰り返し、最後まで大小関係が決定できない場合は、X1とY1とが一致するとして、X1 = Y1と決定する。
【0092】
以上は16ビットで説明したが、32ビットや64ビットへも容易に拡張することができる。そこで、ビット数Nが2^n(n:1以上の整数)である2つのブルームフィルタ(BX,BY)の大小関係について、以下で説明する。なお、2^n以外のビット数の場合は、適宜0を上位ビットとして補って、2^nの形にすることで適用が可能になる。
【0093】
(手順1)変数KKをn-1で初期化する。
(手順2)BXとBYのそれぞれについて、所定のまとまり毎として2^KKビットごとに1であるビットの有無を調べ、有を1、無を0で表した2ビットのビット列を、BX'とBY'とする。
(例)00011011 00011011 → 11(=BX') , 00000000 01000000 → 01(=BY')
【0094】
(手順3)BX'とBY'にそれぞれ1ビット分の右シフト演算を施したビット列をBX''とBY''とする。
(例)00 → 00 , 01 → 00(=BY''), 10 → 01 , 11 → 01(=BX'')
【0095】
(手順4)BX'とBX''の排他的論理和(XOR演算)の結果をBX'''とし、BY'とBY''の排他的論理和の結果をBY'''とする。
(例)00 xor 00 = 00,01 xor 00 = 01(=BY'''),10 xor 01 = 11,11 xor 01 = 10(=BX''')
【0096】
(手順5)2進数として見たときに、BX''' > BY'''であればBX > BYと決定し、BX''' < BY'''であればBX < BYと決定し、いずれにも該当しない場合は、KK=0であればBX=BYと決定し、KK≠0であればKK-1として(手順2)から繰り返す。
【0097】
KK-1として(手順2)から繰り返したときの例示は、以下のようになる。
(手順2の例)
0001 1011 0001 1011 → 1111(=BX'), 0000 1000 0100 0010 → 0111(=BY')
(手順3の例)
1010 → 0101,1110 → 0111,0101 → 0010,0111 → 0011(=BY''),1111 → 0111(=BX'')
(手順4の例)
1111 xor 0111 = 1000(=BX'''),0111 xor 0011 = 0100(=BY'''),
1010 xor 0101 = 1111,1110 xor 0111 = 1001,0101 xor 0010 = 0111
【0098】
次に、本実施の形態のインデックス管理装置3の作用について説明する。
このように構成された本実施の形態のインデックス管理装置3は、ノード(ZA,ZB,ZC)にポインタとキー情報を格納させる処理を行うエントリ処理手段32において、キー情報が数値などの数量の場合は範囲検索に設定し、キー情報が区分値などの非順序離散値の場合は指定値検索に設定する処理を行う。そして、指定値検索の設定には、ブルームフィルタが適用される。
【0099】
このため、2値間の順序も距離も適切に定義不能な非順序離散値(区分値)が含まれる多次元データの検索が高速で行えるようになる。すなわちインデックスZが、複数列に関する範囲検索に適したインデックス構造となっているので、高速で安定した検索速度を発揮させることができる。
【0100】
さらに、一括投入された複数の多次元データに対して、所定の条件下(NM×PS^NK ≧ NN)で最小となる正整数PSを算出するとともに、更新処理の対象となるすべての多次元データをキー情報に関して並び変えて、その正整数PSに基づいて分割するという処理を繰り返すことで、格納されるエントリを含めたノードを更新する更新処理手段33を備えている。
【0101】
そして、更新処理手段33における並び替えの際には、キー情報が非順序離散値の場合は、所定のまとまり毎(2^KKビットごと)に1であるビットの有無を調べて有を1、無を0で表した2ビットのビット列に基づいて大小関係を決定する。
【0102】
要するに、データの並び変えが必要となる手法にブルームフィルタを適用できるようにすることで、既存データが多量であっても迅速に更新処理が行えるようになるうえに、検索性能の向上も見込まれるインデックスを構築することができる。
【0103】
また、記憶容量を抑えながらも、区分値(非順序離散値)を扱うことができる。要するに、確率的データ構造をとるブルームフィルタを適用することで、個別値の数に合わせて膨大な記憶容量を予め確保しておく必要がなくなり、少ない記憶容量で装置を構築することが可能になる。また、個別値が事前に把握できない場合であっても、対応することができる。
【0104】
さらに、このような単一のインデックスZによって、数量に関する範囲検索と非順序離散値の指定値検索とが同等に扱えるのであれば、インデックスZの設計作業を省力化することができる。
【0105】
また、ブルームフィルタ設定部321によって、検索方針に適したビット数Nとハッシュ関数の数Kを設定することで、偽陽性確率を小さくして、ブルームフィルタを効果的に機能させることができる。
【実施例0106】
以下、前記実施の形態で説明したインデックス管理装置3の更新処理手段33の有効性について、
図12-
図14を参照しながら説明する。なお、前記実施の形態で説明した内容と同一乃至均等な部分の説明については、同一用語又は同一符号を付して説明する。
【0107】
本実施例1では、前記実施の形態で説明したバルクローディング手法にブルームフィルタを適用するために導入した比較手法の有効性について、検証した。検証は、変数Cの値を何度か変えながら、以下の手順で行った。
【0108】
検証手順1では、C種類の非順序離散値を用意し、それらいずれかの値をとる100×100×100(=SN)件のデータを生成する。続いて検証手順2では、1ノードの最大エントリ数NMを100、ブルームフィルタのビット数Nを64、ブルームフィルタ化に使うハッシュ関数の数Kを4とした。
【0109】
図12は、上記手順により、いずれのノードも100エントリを保持している3層のインデックスが構築された状態を示している。
そして、検証手順3では、ビット列を2進数と見なして大小を決める「単純な比較方法」と、前記実施の形態で説明したブルームフィルタの比較方法を採用した「本比較方法」を用いて、2つのインデックスを前記実施の形態で説明した構築アルゴリズムで構築する。要するに、「単純な比較方法」は、「本比較方法」の有効性を確認するための比較対象として用いた。
【0110】
検証手順4では、構築した2つのインデックスそれぞれに対して、ランダムな値の検索(検索手順は前記実施の形態参照)を10000回行い、検索中にアクセスを要するノード数の平均値及び標準偏差を測定した。
【0111】
図13は、「単純な比較方法」を採用したインデックスの平均ノード数と標準偏差を一覧表にして示している。これに対して、
図14は、「本比較方法」を採用したインデックスの平均ノード数と標準偏差を一覧表にして示している。
【0112】
これらの結果を見ると、非順序離散値の種類CがC = 100,1000のときには、2つの比較方法で、大きな差はなかった。他方、C = 10000,100000では、「本比較方法」の平均ノード数の方が明らかに小さくなっており、標準偏差が示すバラツキも少なくなっていることが分かる。
【0113】
以上の検証結果から、「単純な比較方法」を用いるよりも、前記実施の形態で説明した「本比較方法」を用いた方が、多くの場合で、特に非順序離散値の種類Cが大きい場合に、安定して速い検索が可能であると考えられる。
【0114】
なお、他の構成及び作用効果については、前記実施の形態と略同様であるので説明を省略する。
【0115】
以上、図面を参照して、本発明の実施の形態を詳述してきたが、具体的な構成は、この実施の形態及び実施例に限らず、本発明の要旨を逸脱しない程度の設計的変更は、本発明に含まれる。
【0116】
例えば前記実施の形態及び実施例1では、説明を簡単にするために少ない次元で多次元データを説明したが、これに限定されるものではなく、多数の数量及び非順序離散値のキー情報が含まれる多次元データに対しても、本発明を適用することができる。