IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社エヌ・ティ・ティ・データ・セキスイシステムズの特許一覧

<>
  • 特許-インデックス管理装置 図1
  • 特許-インデックス管理装置 図2
  • 特許-インデックス管理装置 図3
  • 特許-インデックス管理装置 図4
  • 特許-インデックス管理装置 図5
  • 特許-インデックス管理装置 図6
  • 特許-インデックス管理装置 図7
  • 特許-インデックス管理装置 図8
  • 特許-インデックス管理装置 図9
  • 特許-インデックス管理装置 図10
  • 特許-インデックス管理装置 図11
  • 特許-インデックス管理装置 図12
  • 特許-インデックス管理装置 図13
  • 特許-インデックス管理装置 図14
  • 特許-インデックス管理装置 図15
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-05-01
(45)【発行日】2024-05-13
(54)【発明の名称】インデックス管理装置
(51)【国際特許分類】
   G06F 16/22 20190101AFI20240502BHJP
【FI】
G06F16/22
【請求項の数】 3
(21)【出願番号】P 2020005268
(22)【出願日】2020-01-16
(65)【公開番号】P2021114037
(43)【公開日】2021-08-05
【審査請求日】2022-12-22
(73)【特許権者】
【識別番号】593230202
【氏名又は名称】株式会社エヌ・ティ・ティ・データ・セキスイシステムズ
(74)【代理人】
【識別番号】240000327
【弁護士】
【氏名又は名称】弁護士法人クレオ国際法律特許事務所
(72)【発明者】
【氏名】金澤 康平
【審査官】成瀬 博之
(56)【参考文献】
【文献】特開2007-052698(JP,A)
【文献】特開2011-070607(JP,A)
【文献】特開2011-170461(JP,A)
【文献】Changqing Chen 他4名,The C-ND Tree: A Multidimensional Index for Hybrid Continuous and Non-ordered Discrete Data Spaces,Advances in Database Technology EDBT 2009,2009年03月,462-471頁
(58)【調査した分野】(Int.Cl.,DB名)
G06F 16/00-16/958
(57)【特許請求の範囲】
【請求項1】
2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置であって、
複数のノードからなる階層構造のインデックスを生成するインデックス生成手段と、
前記ノードにポインタと、前記数量及び前記非順序離散値を含む複数のキー情報を格納させる処理を行うエントリ処理手段とを備え、
前記エントリ処理手段は、前記数量については前記ポインタが指す前記データベースのレコード群にある値の最小値と最大値の組を前記キー情報として記録し、前記非順序離散値については前記レコード群にある値をブルームフィルタに変換したもののビットOR演算の結果を前記キー情報として記録するものであって、
前記キー情報の幅を、前記数量であれば最大値と最小値の差で定義し、前記非順序離散値であれば前記ブルームフィルタのビット列中の「1」の数で定義して、前記ノードが格納する前記複数のキー情報の全体のサイズを前記幅に基づいて求められるようにすることで、新たに前記多次元データが前記データベースに追加データとして追加された場合に、前記サイズの増加量が最小になるようにエントリ又はノードを追加する更新処理手段をさらに備え、
前記更新処理手段では、前記ノードのエントリの中から、前記追加データの追加前のキー情報及び前記追加データに基づいて計算された追加後の前記サイズと、前記追加前のキー情報の前記サイズとを比較して差分が最小となるエントリを選択し、選択されたエントリのポインタが指し示すノードに移るという処理を、前記インデックスのルートノードからリーフノードに至るまで繰り返すことで、前記データベースの前記追加データを指し示すポインタを持つエントリを追加エントリとするリーフノードを決定するとともに、前記ルートノードから前記追加エントリを持つ前記リーフノードへの経路上に含まれる各エントリの修正を行うことを特徴とするインデックス管理装置。
【請求項2】
前記数量である前記キー情報に関しては、設定された検索条件の下限値から上限値の範囲内の値を持つレコードを抽出する範囲検索を行い、前記非順序離散値である前記キー情報に関しては、前記検索条件の値と一致する値を持つレコードを抽出する指定値検索を行うことを特徴とする請求項1に記載のインデックス管理装置。
【請求項3】
前記更新処理手段では、新たに前記多次元データが追加された場合で、かつ前記ノードのエントリ数が上限を超過する場合に、その上層に新たにノード又はエントリを生成させることを特徴とする請求項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】
【文献】特開2003-330943号公報
【文献】特許第3708809号公報
【非特許文献】
【0009】
【文献】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
【発明の概要】
【発明が解決しようとする課題】
【0010】
しかしながら、C-ND木は、非順序離散値の「範囲」を表現するのに単純なビット配列を用いるため、予め取り得るすべての個別値を知っておく必要がある。また、個別値の数が非常に多い場合は、要求される記憶容量が膨大になる。
【0011】
そこで、本発明は、非順序離散値が含まれる多次元データの検索が高速で行えるようになるうえに、記憶容量を抑えることができるインデックス管理装置を提供することを目的としている。
【課題を解決するための手段】
【0012】
前記目的を達成するために、本発明のインデックス管理装置は、2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置であって、複数のノードからなる階層構造のインデックスを生成するインデックス生成手段と、前記ノードにポインタとキー情報を格納させる処理を行うエントリ処理手段とを備え、前記エントリ処理手段は、前記キー情報が前記数量の場合は範囲検索に設定し、前記キー情報が前記非順序離散値の場合は指定値検索に設定する処理を行うとともに、前記指定値検索の設定にはブルームフィルタが適用されることを特徴とする。ここで、前記ブルームフィルタを適用するために、ビット数Nとハッシュ関数の数Kが設定できる構成とすることが好ましい。
【発明の効果】
【0013】
このように構成された本発明のインデックス管理装置は、ノードにポインタとキー情報を格納させる処理を行うエントリ処理手段において、キー情報が数量の場合は範囲検索に設定し、キー情報が非順序離散値の場合は指定値検索に設定する処理を行う。そして、指定値検索の設定には、ブルームフィルタが適用される。
【0014】
このため、2値間の順序も距離も適切に定義不能な非順序離散値が含まれる多次元データの検索が高速で行えるようになるうえに、記憶容量を抑えることもできるようになる。そして、ビット数Nとハッシュ関数の数Kを適切に設定することで、ブルームフィルタを効果的に機能させることができる。
【図面の簡単な説明】
【0015】
図1】本発明の実施の形態のインデックス管理装置が組み込まれる多次元データ検索システムの全体構成の概要を説明するブロック図である。
図2】インデックスの基本構造を例示した説明図である。
図3】数値と区分値とが含まれる多次元データのインデックスを使った検索例の説明図である。
図4】ブルームフィルタの偽陽性確率を計算した結果を例示した説明図である。
図5】ブルームフィルタのパラメータ検討時の想定データを例示した説明図である。
図6】インデックスの各段における各ノードの子孫が含む平均区分値数を仮定した説明図である。
図7】ハッシュ関数の数Kついての検討において、(a)は区分値Aの偽陽性確率の算出結果を示した一覧表、(b)は区分値Bの偽陽性確率の算出結果を示した一覧表である。
図8】実施例1の追加レコードがあった場合にインデックスが更新される概要を示した説明図である。
図9】更新処理の全体の流れを説明するフローチャートである。
図10】空エントリにデータが追加される例を示した説明図である。
図11】更新処理の中の分割処理の流れを説明するフローチャートである。
図12】分割処理の第1のケースを例示した説明図である。
図13】分割処理の第2のケースを例示した説明図である。
図14】分割処理の第3のケースを例示した説明図である。
図15】分割処理の第4のケースを例示した説明図である。
【発明を実施するための形態】
【0016】
以下、本発明の実施の形態について図面を参照して説明する。
本実施の形態のインデックス管理装置は、多次元データが格納されたデータベースを備えた多次元データ検索システム1に組み込まれる。図1は、多次元データ検索システム1の全体構成の概要を示したブロック図である。
【0017】
多次元データ検索システム1は、入力手段2と、インデックス管理装置3と、データベース4とを備えている。入力手段2には、キーボードやマウスやタッチパネルなどの指令やデータなどを直接入力する手段、フラッシュメモリやハードディスなどの記憶媒体から取り込ませる手段、インターネットやLANなど通信回線を介して取り込ませる手段などがある。
【0018】
また、データベース4には、インデックスZの構造やデータなどのインデックス情報41と、検索対象となる多次元データであるレコード42などが格納される。本実施の形態では、レコード42として、数量のデータと非順序離散値のデータとが組み合わされたものが扱われる。
【0019】
ここで、「数量」とは、2値間の順序と距離が適切に定義可能なデータで、大小の比較が可能な長さや重さや時刻などの数値が該当する。一方、「非順序離散値」とは、2値間の順序も距離も適切に定義不能なデータで、色の種類や地名や文字などの区分値が該当する。
【0020】
図2は、複数のレコード(「R00」,「R01」などの行IDによって識別されるデータ行)が記録されたデータベースであるレコード群Wと、そのレコード群Wの中から所期のレコードを短時間で抽出させるために作成されるインデックスZとを模式的に例示した図である。
【0021】
このインデックスZの基本構造は、ノードを3段以上にわたって階層的に配置するツリー構造(木構造)である。最上段(最上層)のノードはルートノード(根ノード)ZAと呼ばれ、最下段(最下層)のノードはリーフノード(葉ノード)ZCと呼ばれる。そして、ルートノードZAとリーフノードZCとの間に配置される1段以上のノードは、中間ノード(内部ノード)ZBと呼ばれる。
【0022】
各ノード(ZA,ZB,ZC)は、ノードを識別するためのノードIDと、ノードにデータを格納するためのエントリとによって構成される。ノード(ZA,ZB,ZC)のエントリには、ポインタとキー情報とが格納される。
【0023】
「ポインタ」とは、リーフノードZC以外のノード(ZA,ZB)では、エントリに記録されたキー情報に対応する下位のノード(子ノード)を指し示すデータをいう。一方、リーフノードZCでは、元データとなるレコード(例えば行ID「R00」で識別される1行のデータ組)を指し示すデータがポインタとなる。
【0024】
「キー情報」とは、レコードに含まれるデータの中で検索に用いられるデータをいう。本実施の形態では、数量も非順序離散値もキー情報になり得る。リーフノードZCに格納されるキー情報は、元データ(例えば1行のレコード)のキー列の値である。リーフノードZC以外のノード(ZA,ZB)では、子孫(子ノードやそれに繋がる子ノードなど)となる全リーフノードZCのキー情報の要約が記録される。例えば数値列であれば、最小値と最大値の組がキー情報として記録され、区分値列であれば後述するブルームフィルタがキー情報として記録される。
【0025】
例えば図2で説明すると、最上層のルートノードZAには、ノードIDが「N10」のノードが存在し、「N10」に格納された10個のエントリ(エントリ0からエントリ9)には、中間ノードZBの対応するノードを指すポインタ(例えば「エントリ0」には「N20」)と、キー情報となる数値「0~600」と、キー情報となる区分値「11010101」とが記録されている。ここで、数値は「0~600」という範囲で設定され、区分値は「11010101」という指定値で設定されている。
【0026】
中間ノードZBにおいても、同様に複数のエントリが格納されたノードが配置されていて、例えばノードIDが「N20」の「エントリ0」に該当する場合は、下位のノードIDが「N30」のノードに移行していくことになる。そして、最下層のリーフノードZCのノードID「N90」に辿り着いた場合には、その「エントリ0」が指し示すレコード群Wの行IDが「R00」のレコードが抽出されることになる。
【0027】
上述したデータ検索を別の表現で説明すると、検索対象となったノードXがリーフノードZCであって、ノードXのキー情報が検索条件に合致する場合は、ノードXのポインタが指す元データの1行(「R00」,「R01」など)が検索の結果集合Sに加えられることになる。一方、検索対象となったノードXがリーフノードZC以外であれば、ノードXのエントリのうち、子孫が検索条件に合致する可能性のあるキー情報が記録されたエントリのそれぞれについて、下位のノードの探索が行われることになる。
【0028】
このような検索を高速で行わせるための本実施の形態のインデックス管理装置3は、図1に示すように、ツリー構造のインデックスZを生成させるインデックス生成手段31と、各ノードのエントリに格納されるデータの処理などを行うエントリ処理手段32と、新たにレコードが追加されるなどしてインデックスZの更新が必要になったときに動作する更新処理手段33とを備えている。また、エントリ処理手段32には、後述するブルームフィルタのパラメータの設定などを行うためのブルームフィルタ設定部321が設けられる。
【0029】
続いて図3を参照しながら、数値と区分値とが含まれる多次元データのインデックスZを使った検索例について説明する。まず検索するにあたっては、検索条件が設定される。ここでは、検索条件を「50 ≦数値列≦ 70 かつ 区分値列= A」とする。区分値列の「A」は、ブルームフィルタ「00010001」に置き換えられる。
【0030】
検索条件に基づいてルートノードZAを参照すると、ノードID「N10」の「エントリ0」が数値の範囲検索においても区分値の指定値検索においても検索条件に該当しているため、下位の中間ノードZBのノードID「N20」に移行する。
【0031】
中間ノードZBの「N20」では、「エントリ0」は数値列が検索条件に該当しないが、「エントリ1」が数値列と区分値列の両方が検索条件に該当しているため、「エントリ1」のポインタ「N31」に従って、リーフノードZCの「N31」に移行する。そして、検索条件に該当する「エントリ1」のポインタ「R05」に従って、レコード群Wから行ID「R05」の1行のレコードが抽出される。このレコードには、キー情報である数値や区分値の他に、キー情報とされていない非キー列にある「へ」というデータも記録されている。なお、この例では、ルートノードZAのノードID「N10」の「エントリ1」が検索条件に該当しないので、「エントリ1」が指す下位のノードへの更なる検索は不要になる。
【0032】
ここで、C-ND木(非特許文献1)では、区分値を表現するのに単純なビット配列を用いるため、予め取り得るすべての個別値を把握して、その数に合わせてビット数を確保しておく必要がある。このため、想定される区分値の種類(数)が多くなると記憶容量が増大することになるし、区分値の範囲が想定できない場合は適用できないこともある。
【0033】
そこで、本実施の形態のインデックス管理装置3では、区分値をブルームフィルタを適用して表現する。ブルームフィルタは、集合にある要素が含まれるか否かを、確率的に判定できるデータ構造で、空間効率のよい構造と言える。ブルームフィルタを適用することによって、個別値の多寡にかかわらず、一定のビット数で非順序離散値の範囲が表現できるようになる。
【0034】
ブルームフィルタを適用するにあたっては、適当な正整数Nと、1個以上(K個とする)の異なるハッシュ関数(F_1, F_2,・・・,F_K)を予め決めておく。ただし、各ハッシュ関数は、値域が1~Nの整数であることが必要である。これは任意のハッシュ関数の結果に対して、Nによる剰余+1を計算することで可能である。
【0035】
例えば、データ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演算の結果となる。
【0036】
例えば、ビット数Nが「8」の場合に、“赤”というデータに対しては、F_1(“赤”)=1,F_2(“赤”)=4であるとすると、ブルームフィルタB(“赤”)は「00001001」となる。また、“青”というデータに対しては、F_1(“青”)=4,F_2(“青”)=8であるとすると、ブルームフィルタB(“青”)は「10001000」となる。そして、これらのビットOR演算結果は、B({“赤”,“青”}) = 10001001となる。
【0037】
任意の集合Sにおいて、データXに対し「B(X) AND B(S) ≠ B(X) ならばXはSに属しない」が成り立つ。ここで「AND」は、ビットAND演算を示す。一方、「B(X) AND B(S) = B(X) ならば X ∈ S」は成り立たない。したがって、集合の要約としてブルームフィルタを記録しておけば、あるデータがその集合に含まれるかどうかを、元の集合を参照することなく容易に判定することができる。ただし、「属しない場合(No)」は確実な結果となり、「属する場合(Yes)」は確率的な結果となる。
【0038】
例えば、B(S) = 10001001の場合に、B(“黄”) = 00100001であれば、B(“黄”) AND B(S) = 00000001 ≠ B(“黄”)となり、確実に“黄”は集合Sに属さないと言える。一方、B(“紫”) = 10000001であれば、B(“紫”) AND B(S) = 10000001 = B(“紫”)となり、“紫”は集合Sに属する(”紫”∈S)可能性があると言える。
【0039】
そして、数値xの集合Sをその最小値(m)と最大値(M)とで要約する場合も、「x < m 又は M < x ならばxはSに属しない」は成り立つが、「m ≦ x ≦ Mならばx ∈ S」は成り立たないので、ブルームフィルタはそのような要約の非数値版として捉えることができる。
【0040】
続いて、各データのサイズに関する説明を行う。あるデータ列に関する幅を決める場合に、数値の場合であれば、「最大値-最小値」をデータ全体の幅とすることができる。一方、区分値の場合は、ブルームフィルタ中の「1」の数を全体の幅とすることができる。例えば、「10010001」であれば、幅は「3」となる。また、「正規化幅=幅/データ全体の幅」であるとする。
【0041】
そして、各データのサイズを、各列に関する相対幅(正規化幅)の2乗和とすると、例えば数値のみのデータであれば、各列の最小値から最大値で定義される超直方体の対角線の長さの2乗をサイズとみなすことができる。
【0042】
そこで、図2に示したインデックスZを例にして、データのサイズの説明を続ける。データ全体の幅は、数値列についてはルートノードZAを見ると「900 - 0」になるため「900」、区分値列については最大で「11111111」(図2のレコード群Wでは、区分値(A,B)のみ例示)になるため「8」である。
【0043】
また、中間ノードZBの「N20」の「エントリ0」の幅は、数値列が「90」、区分値列が「4」となる。このため、「N20」の「エントリ0」の正規化幅は、数値列が「0.1」、区分値列が「0.5」となり、「N20」の「エントリ0」のサイズは0.26となる。
【0044】
ところでブルームフィルタには、偽陰性(false negative)はないが、偽陽性(false positive)による誤検出の可能性がある。また、要素を集合に追加することはできるが、削除することはできない。そして、集合に要素が追加されるにつれて、偽陽性の可能性が高くなるという性質がある。
【0045】
そこで、ブルームフィルタのビット数Nとハッシュ関数の数Kを適切に設定して適用する必要がある。以下では、図4図7を参照しながら、適用にあたっての各パラメータの検討結果について説明する。
【0046】
まず、ビット数がN個のブルームフィルタの偽陽性確率について説明する。1個の値のハッシュ関数1個によるブルームフィルタ表現における、あるビットが0である確率P1は、P1 = (1 - 1 / N)となる。これより、1個の値のハッシュ関数K個によるブルームフィルタ表現における、あるビットが0である確率P2は、P2 = P1^K = (1 - 1 / N)^Kとなる。
【0047】
さらに、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)となる。
【0048】
この結果、K個のハッシュ関数を用いて、M個の値を含むブルームフィルタが、実際には含んでいない値を含むかもしれない(含む可能性がある)と判定する確率(偽陽性確率)は、ハッシュ関数K個の結果に対応するブルームフィルタのビットが全て1である確率であるため、P4^K = (1 - (1 - 1 / N)^(K×M))^Kとなる。
【0049】
図4に、ビット数がN = 128の場合に、上述したM個の値とK個の値を様々に変化させてブルームフィルタの偽陽性確率を計算した結果を例示した。すなわち、偽陽性確率の式から、所与のN,Mに対して偽陽性確率を最小化するKの値が計算できる。
【0050】
続いて、ブルームフィルタを適用するにあたって、決めるべきパラメータについて説明する。まず、ブルームフィルタのビット数Nがパラメータになる。ビット数Nは、データ列ごとに異なるビット数を設定することも考えられるが、ここでは一定の値とする。
【0051】
また、ブルームフィルタの計算時に用いるハッシュ関数の数Kもパラメータになる。さらに、1ノードのエントリ数の上限(E_max)と下限(E_min)も決めるべきパラメータになる。1ノードのエントリ数の上限(E_max)を超えてデータが追加された場合には、ノード分割が起こることになる。また、1ノードのエントリ数の下限(E_min)は、(E_max / 2)が上限で、それを超えるとノード分割時に違反が生じることになる。
【0052】
パラメータの最適値を検討するにあたって、想定データ条件として、10億(≒ 2^30)件程度のレコード数からなるレコード群Wを想定し、2つの数値列と2つの区分値列が含まれているものとした。図5に、想定データの一部を例示した。ここで、区分値列が取り得る値の数は、区分値列Aについては「16」、区分値列Bついては「256」とする。
【0053】
まず、ビット数Nの検討を行う。多くの場合、数値は8バイト以下で表現される。したがって、数値列のキー情報には、最小値と最大値を記憶させるために、16バイトが必要となる。区分値列についても、同程度のバイト数に収まることが望ましいので、ビット数Nを128ビット(= 16バイト)とする。
【0054】
続いて、エントリ数の上限(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に設定する。
【0055】
エントリ数の下限(E_min)については、小さく設定することでノード分割における選択肢が増え、結果として検索性能が向上する可能性もあるが、評価が難しい。一方、ディスクI/Oの観点から言えば、大きい方が1ノードに空のエントリが少なくなってよいので、上限であるE_max / 2 = 64を、エントリ数の下限(E_min)に設定する。
【0056】
最後に、ハッシュ関数の数Kについて検討する。上記した想定データ件数(10億件)の場合、上記したエントリ数の上限(E_max)及び下限(E_min)の条件下では、インデックスZの木(ツリー)の高さは、5段となる。
【0057】
そこで、データ追加手順やノード分割手順において、サイズが小さく抑えられるようにブルームフィルタが含む値数が小さくなるような選択が行われることを考慮して、インデックスZの各段において、各ノードの子孫が含む平均区分値数が、図6の表に示した値になると仮定する。
【0058】
この図6に示した平均区分値数と図4に示したブルームフィルタの偽陽性確率とを基にすれば、元テーブルに含まれていない区分値を検索した場合にアクセスするノード数の期待値が計算できる。アクセスノード数は、必要なディスクI/Oの数とほぼ同じ数になるので、偽陽性が検索性能に与える影響を評価する指標として妥当なものであると言える。
【0059】
そこで、偽陽性に与える影響を各区分値(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となる。
【0060】
同様に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の偽陽性確率の算出結果を一覧表にして示した。
【0061】
一方、区分値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となる。
【0062】
そして、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の偽陽性確率の算出結果を一覧表にして示した。
【0063】
以上の結果から、上記した想定データ条件では、ハッシュ関数の数Kは「K = 4」又は「K = 5」とするのが適切と思われる。
【0064】
次に、本実施の形態のインデックス管理装置3の作用について説明する。
このように構成された本実施の形態のインデックス管理装置3は、ノード(ZA,ZB,ZC)にポインタとキー情報を格納させる処理を行うエントリ処理手段32において、キー情報が数値などの数量の場合は範囲検索に設定し、キー情報が区分値などの非順序離散値の場合は指定値検索に設定する処理を行う。そして、指定値検索の設定には、ブルームフィルタが適用される。
【0065】
このため、2値間の順序も距離も適切に定義不能な非順序離散値(区分値)が含まれる多次元データの検索が高速で行えるようになる。すなわちインデックスZが、複数列に関する範囲検索に適したインデックス構造となっているので、高速で安定した検索速度を発揮させることができる。
【0066】
また、記憶容量を抑えながらも、区分値(非順序離散値)を扱うことができる。要するに、確率的データ構造をとるブルームフィルタを適用することで、個別値の数に合わせて膨大な記憶容量を予め確保しておく必要がなくなり、少ない記憶容量で装置を構築することが可能になる。また、個別値が事前に把握できない場合であっても、対応することができる。
【0067】
さらに、このような単一のインデックスZによって、数量に関する範囲検索と非順序離散値の指定値検索とが同等に扱えるのであれば、インデックスZの設計作業を省力化することができる。
【0068】
また、ブルームフィルタ設定部321によって、検索方針に適したビット数Nとハッシュ関数の数Kを設定することで、偽陽性確率を小さくして、ブルームフィルタを効果的に機能させることができる。
【実施例1】
【0069】
以下、前記実施の形態で説明したインデックス管理装置3の更新処理手段33の詳細について、図8図15を参照しながら説明する。なお、前記実施の形態で説明した内容と同一乃至均等な部分の説明については、同一用語又は同一符号を付して説明する。
【0070】
図8は、新たに多次元データが追加レコードW1としてレコード群Wに追加された場合に、インデックスが更新されることの概要を説明するための図である。ここで、図2を更新前のインデックスZとし、図8を更新後のインデックスNZとする。
【0071】
すなわち、レコード群Wに追加レコードW1(行ID:R08)が追加されると、その追加レコードW1の検索を可能にするために、インデックスZがインデックスNZに更新される。図8に示したインデックスNZは、図2に示したインデックスZと比べて、ルートノードZA、中間ノードZB、リーフノードZCの各階層のノードのエントリが更新されている。
【0072】
そこで、図9を参照しながら、更新処理の全体の流れについて説明する。まず、ステップS1では、更新処理手段33を起動させる。続いて、ステップS2では、検討ノードXをルートノードとするとともに、新規に追加される追加レコードW1の読み込みが行われる。
【0073】
ステップS3から、追加処理が開始される。ここで、エントリに格納されるポインタやキー情報をデータDとする。そしてステップS4では、検討ノードXがリーフノードZCであるか否かを判定する。
【0074】
検討ノードXがリーフノードZC以外の中間ノードZBやルートノードZAの場合は、データDを子孫の階層(下位のノード)に加えた場合に、サイズの増加量が最小となるもの(データE)を探索する(ステップS5)。
【0075】
サイズが最小になるデータEの探索について、図10の具体例を使って説明する。ここで、追加レコードW1は、行IDが「R05」、数値列が「50」、区分値列が「A」であったとする。一方、数値列に関するデータ全体の幅は、「90 - 10 = 80」となる。また、区分値列に関するデータ全体の幅は、集合{A,B,C}のブルームフィルタ表現中の「1」の数になる。よって、この集合のビットOR演算をすると、(00010001 OR 10010000 OR 00011000) = 10011001となって、区分値列のデータ全体の幅は「4」となる。
【0076】
そこで、ルートノードZAのノードID「N10」をチェックすると、「エントリ0」を選んだ場合のサイズ増加量は(40/80)^2 - (0/80)^2 ≒ 0.25となり、「エントリ1」を選んだ場合のサイズ増加量は(4/4)^2 - (3/4)^2 ≒ 0.44となる。このため、サイズの増加量が少ない「エントリ0」が選択される。
【0077】
続いて中間ノードZBのノードID「N20」をチェックすると、エントリは1つしかないので、唯一である「エントリ0」が選択される。そして、「エントリ0」のポインタに従って、リーフノードZCのノードID「N30」が選択される。要するに、子孫の階層にデータDを加えた場合にサイズの増加量が最小となる探索結果は、リーフノードZCのノードID「N30」の「E1」から遡って、中間ノードZBのノードID「N20」の「エントリ0」→ルートノードZAのノードID「N10」の「エントリ0」となる。
【0078】
そこで、リーフノードZCのノードID「N30」の空エントリであった「E1」に、追加レコードW1のポインタ及びキー情報であるデータDを書き込むとともに、それより上位のエントリにデータEが書き込まれる。なお、データの書き込み作業には、エントリの修正作業も含まれる。そして、ステップS6では、選んだエントリが指すノードに検討ノードXを変更する処理が行われ、ステップS4に戻る。
【0079】
一方、ステップS4において、検討ノードXがリーフノードZCであった場合は、ステップS7に進んで、データDを疑似エントリのデータEaに変換するとともに分割処理に移行する。分割処理については、図11の分割処理の流れを示したフローチャートを使って説明する。
【0080】
まずステップS11では、リーフノードZCである検討ノードXのエントリ数が、上限に達しているか否かを判定する。そして、空エントリがあれば、ステップS12に移行して、空エントリにデータEaを書き込む。例えば図12において、リーフノードZCのノードID「N30」の「E1」が空エントリであったならば、そこにデータEa(例えばR05,50,A)が書き込まれて、分割処理が終了する。
【0081】
これに対して、検討ノードXのエントリ数が上限に達している場合は、新しくノードYを作成する(ステップS13)。例えば図12において、リーフノードZCとなるノードYとしてノードID「N33」が作成される。ここで、ノードXは、ノードID「N30」であるとする。
【0082】
続くステップS14では、ノードX(N30)のエントリ(E0,E1)とデータEaとを、要素数がエントリ数の下限(E_min)以上となる2つのグループに分ける。グループに分ける際は、2グループのサイズの和が最小になるような分け方を選択する(ステップS15)。
【0083】
例えば図12に示したリーフノードZCのノードID「N30」は、既にエントリ数が上限に達しているので分割することになる。この際、「R00」と「R05」と「R06」とをどのように分けるかによって、サイズ和が異なることになる。
(1)R00,R05とR06とに分けた場合のサイズ和
((40/90)^2 + (2/4)^2) + ((0/90)^2 + (2/4)^2) ≒ 0.70
(2)R00とR05,R06とに分けた場合のサイズ和
((0/90)^2 + (2/4)^2) + ((30/90)^2 + (3/4)^2) ≒ 0.92
(3)R00,R06とR05とに分けた場合のサイズ和
((10/90)^2 + (3/4)^2) + ((0/90)^2 + (2/4)^2) ≒ 0.82
以上の結果から、上記(1)の分け方によるサイズ和が最小になるので、第1グループ(R00,R05)と第2グループ(R06)とに分ける。
【0084】
そしてステップS16では、2つに分けたうちの第1グループのデータをノードXのエントリに書き込み、第2グループのデータをノードYのエントリに書き込む。例えば図12において、第1グループのデータ(R00,R05)は、ノードID「N30」のエントリ(E0,E1)にそれぞれ書き込まれ、第2グループのデータ(R06)は、分割されたノードID「N33」のエントリ(E0)に書き込まれる。
【0085】
さらに、ステップS17では、ノードXがルートノードZAか否かを判定して、ルートノードZAでない場合は、ステップS18に進んでノードXの親ノードのキー情報の更新処理に移行する。またステップS19では、データEaをノードYを指す疑似エントリに変更する。そして、ステップS20では検討ノードXをその親ノードに変更する処理が行われ、ステップS11に戻ることになる。
【0086】
ここで、図12に分割処理の一例を示した。この例では、ノードYとなるノードID「N33」の親ノード(上位のノード)である中間ノードZBのノードID「N20」の「エントリ1」及びルートノードZAのノードID「N10」の「エントリ0」を更新する。
【0087】
これに対して、親ノードのエントリ数が上限に達している場合は、再帰的に親ノードも分割することになるので、親ノードにノードYを指す疑似エントリが一時的に作成される。例えば図13に例示したケースでは、分割により作成されたリーフノードZCのノードID「N33」の親ノードである中間ノードZBのノードID「N21」のエントリ数が上限に達していたため、「エントリ1」の隣に疑似エントリを作成している。そして、この「疑似」エントリに、キー情報などのデータが一時的に書き込まれる。
【0088】
図14は、ルートノードZAに疑似エントリを作成した例を説明する図である。この例では、分割により作成された中間ノードZBのノードID「N22」の親ノードであるルートノードZAのノードID「N10」のエントリ数が上限に達していたため、「エントリ1」の隣に疑似エントリが作成されて、キー情報などのデータが書き込まれている。
【0089】
一方、ステップS17においてノードXがルートノードZAであると判定された場合は、ステップS30に移行して、ノードX,Yを指す2つのエントリを持つ新しいルートノード(新ルートノードZ0)を上層に作成する。この場合は、インデックスZの段数が1段、増えることになる。
【0090】
図15は、ルートノードZAの上位に新ルートノードZ0を作成した例を説明する図である。この例では、分割により作成されたルートノードZAのノードID「N11」及びノードID「N10」の親ノードとして新ルートノードZ0となるノードID「N00」を作成して、ルートノードZAのノードID「N10」とノードID「N11」をそれぞれ指す「エントリ0」と「エントリ1」を設け、ポインタとキー情報をデータとして書き込んでいる。
【0091】
このように構成されたインデックス管理装置3の更新処理手段33によって、追加レコードW1があった場合でも簡単にインデックスZを更新することが可能になり、高速検索を維持していくことができる。
なお、他の構成及び作用効果については、前記実施の形態と略同様であるので説明を省略する。
【0092】
以上、図面を参照して、本発明の実施の形態を詳述してきたが、具体的な構成は、この実施の形態及び実施例に限らず、本発明の要旨を逸脱しない程度の設計的変更は、本発明に含まれる。
【0093】
例えば前記実施の形態及び実施例1では、説明を簡単にするために少ない次元で多次元データを説明したが、これに限定されるものではなく、多数の数量及び非順序離散値のキー情報が含まれる多次元データに対しても、本発明を適用することができる。
【符号の説明】
【0094】
3 :インデックス管理装置
31 :インデックス生成手段
32 :エントリ処理手段
321 :ブルームフィルタ設定部
33 :更新処理手段
Z :インデックス
Z0 :新ルートノード
ZA :ルートノード
ZB :中間ノード
ZC :リーフノード
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15