(57)【要約】【課題】データ圧縮を施すことでインデクスファイル容量を削減しつつ、元のデータを復元することなくキー値の比較処理が行える方法を提供すること【解決手段】インデクスページの新規作成処理では、ページに格納するキー値の最大値と最小値を比較して前方一致データを決定する。インデクスエントリをページに格納するときは、キー値からこの前方一致データを除く。この前方一致データは、圧縮データとしてページ制御情報に設定する。インデクスページへのエントリ追加処理では、追加するキー値がページ制御情報内の前方一致データを含まない場合、圧縮せずに格納し非圧縮エントリ数を増やす。インデクスページ内の圧縮したキーと検索対象のキーを比較する場合、検索対象のキーからページ制御情報内の前方一致データを除くことで、圧縮したキーを復元せずに比較できる。【選択図】　図２
2004062475.tif 000002
【特許請求の範囲】
【請求項１】
入力されたデータを構成する複数項目のうちの一つ以上の項目をインデクスとして記憶し、上記項目の値をキー値として昇順または降順にキー値とこれに対応するデータの格納位置情報を記憶し、上記インデクスを格納するページごとにページ内に格納するキー値の前方共通部分を各キー値から除外することを特徴とするインデクス格納方法。
【請求項２】
入力されたデータを構成する複数項目のうちの一つ以上の項目をインデクスとして記憶し、上記項目の値をキー値として昇順または降順にキー値とこれに対応するデータの格納位置情報を記憶し、上記インデクスを格納するページごとにページ内に格納する上記キー値の前方共通部分を各キー値から除外してインデクスのデータ圧縮格納を行い、圧縮できないキー値をページ制御情報内の非圧縮エントリ数にて管理するインデクス格納方法。
【請求項３】
入力されたデータを構成する複数項目のうちの一つ以上の項目をインデクスとして記憶し、上記項目の値をキー値として昇順または降順にキー値とこれに対応するデータの格納位置情報を記憶し、上記インデクスを格納するページごとにページ内に格納するキー値の前方共通部分を各キー値から除外して上記インデクスのデータ圧縮格納を行い、除外されたキー値を復元することなくキー値の大小関係を判定するインデクス格納方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、計算機上のデータベース管理システムにおけるインデクスの格納技術に関する。
【０００２】
【従来の技術】
データベースのインデクスはデータを特徴付ける項目をデータとは別に管理し、この項目の値でキー値を構成し、キー値を用いてデータの格納位置を高速に求めるためにキー値を昇順または降順に並べて行の格納位置情報とともに管理する手法がとられる。
【０００３】
インデクス全体の構造はＢｔｒｅｅと呼ばれる階層構造で実装されることが多く、この構造では、キー値順に並べ替えられたキー値データ全体を、リーフ（最下位）ページ（本特許ではインデクスをファイルに格納する上での最小単位を表す）に格納可能なデータ量に応じて分割し、これをページ間の双方向ポインタで連結する。さらに、下位のページ番号とそのページに格納されるキー値の最大値または最小値を上位ページで階層的に管理する構造である。データの検索，追加または削除の操作に際しては、対象データの項目からキー値を抽出し、ルート（最上位）ページから下位方向に当該キー値と下位ページの最大値または最小値と比較して格納されるべき下位ページを求め、最終的にリーフページ番号を求める。リーフページ内のキー値の並び順でキー値をサーチし目的のキー値を管理するインデクスエントリ（キー値と行格納情報で構成するデータ）を見つける（または追加位置をもとめる）方法である。インデクス上のキー値を圧縮して格納できれば、リーフページに格納できるインデクスエントリ数を増加させることができリーフページ数が削減でき、キー値の範囲を指定した条件検索などでは参照するリーフページ数が減少し、ランダム検索でもバッファヒット率が向上し総体的に検索性能の改善が期待できる。
【０００４】
しかし、ファイル容量を削減する手法として現在広く使用されているデータ圧縮技術は、ランレングス法、ハフマン法に代表されるようにデータそのものを別のビット列に変換してしまうものである。データベースのインデクス部は与えられた検索キーで頻繁に参照されるため、インデクスファイル単位、ページ単位の圧縮はもちろん、キー値ごとに圧縮を適用した場合でも圧縮したままではキー値の大小関係が判定できないことから、圧縮による容量削減効果よりデータ復元処理にかかる処理負荷が大きく、高速なデータ取り出しの妨げとなるためこのような圧縮技術は適用されていなかった。
【０００５】
【発明が解決しようとする課題】
上記の通り、従来のデータ圧縮技術では、圧縮したままキー値の大小関係を判定できないという問題があった。その結果、インデクス上のキー値は圧縮せずに格納され、さまざまな検索に対応するために多数のインデクスファイルを作成する場合には多大な記憶装置の容量が必要となってしまっていた。
【０００６】
本発明は、データ圧縮を施しインデクスファイル容量を削減しつつ、元のデータを復元することなくキー値の比較処理が行える方法を提供することにある。
【０００７】
【課題を解決するための手段】
上記目的を達成するために、本発明は、インデクスの格納単位であるページが同じであればインデクスのキー値は前方部分が一致しやすい特性に着目し、ページに格納されるキー値の最大値と最小値を比較して前方共通部分のビット列と長さを得、これをページ内の全キー値の前方共通部分のビットパターンとして抽出する手段と、各キー値を前方共通部分を排除したキー値に圧縮する手段と、抽出した共通部分をページごとに管理する手段とを備えることを特徴とする。
【０００８】
また本発明は、全てのインデクスエントリに圧縮を施したインデクスページを作成後、新たにインデクスエントリが追加されることに対処するため、インデクスページ内のページ制御情報に非圧縮エントリ数を保持することを特徴とする。
【０００９】
更に本発明は、共通部分が排除されたインデクスページ内から特定のキー値の検索、または特定のキー値の追加位置を求める場合において、圧縮された各キー値を元のデータに復元せずに共通部分を排除したまま比較することを特徴とする。
【００１０】
【発明の実施の形態】
以下、本発明の実施例を図を用いて説明する。本実施例ではキー値は昇順方向に並べられ、上位ページは下位ページの最大値を管理するものとして説明する。
【００１１】
図１は本発明の前提となるデータベースの構成例を示したもので、データを格納するデータファイル１２とデータの格納位置を管理するためのインデクスファイル１１からなる。インデクスファイル１１はＢｔｒｅｅ構造をしており、キー値とキー値を有するデータの格納位置を示すポインタ情報からなるインデクスエントリ１１１を持つ。
【００１２】
図２は本発明によるインデクスリーフページの構造である。インデクスリーフページにはエントリ部とページ内の格納状態を管理するページ制御情報部２１で構成される。ページ制御情報部では格納エントリ数２１１、非圧縮エントリ数２１２、前方一致データ長２１３、前方一致データ２１４などを管理する。
インデクスページに対する圧縮操作は、以下３つの処理を行うときに実行する。
（１）データの初期登録時に、インデクスページを新規作成する。
（２）インデクスページにインデクスエントリを追加する。
（３）インデクスページにインデクスエントリを追加する余地がなくなることでインデクスページの分割が発生し、インデクスページを新規作成する。
【００１３】
第一に、データ初期登録時のページ作成方法について、図３と図４を用いて説明する。初期登録時は登録データから抽出したキー値を昇順に並べ替え、順番に入力しながらページ内の空き領域がなくなるか一定の空き領域を残して格納する。まず、ページ内の格納可能な領域長をあらかじめ算出するとともに、圧縮データ長と格納エントリ数Ｎに初期値０を与える（ステップ３０１）。次に、抽出したキー値から（Ｎ＋１）件目のインデクスエントリを作成する（ステップ３０２）。その次に、格納可能領域長と（Ｎ＋１）件目のインデクスエントリ長を比較し格納可能かどうか判定する（ステップ３０３）。格納可能であれば格納可能領域長から（Ｎ＋１）件目のインデクスエントリ長を減じ、（Ｎ＋１）件目のエントリを作業領域に退避し、格納エントリ数Ｎを＋１加算する（ステップ３０４）。インデクスページにエントリを追加できる間は、ステップ３０２とステップ３０４の処理を繰り返す。ステップ３０３で格納不可と判定された場合、退避済みエントリの最小キーと最大キー（Ｎ件目のキー）を比較し前方一致データαと前方一致データ長αを得る（ステップ３０５）。この前方一致データ長αと格納エントリ数Ｎを乗ずることで圧縮データ長αを算出する（ステップ３０６）。次に、退避済みエントリの最小キーと（Ｎ＋１）件目のキーを比較し前方一致データβと前方一致データ長βを得る（ステップ３０７）。
【００１４】
また、「前方一致データ長β」と「格納エントリ数（Ｎ）＋１」を乗ずることで圧縮データ長βも算出する（ステップ３０８）。その後、「格納可能領域長に圧縮データ長βを加えた値」と「（Ｎ＋１）件目のインデクスエントリ長」を比較し、圧縮後に格納可能かどうか判定する（ステップ３０９）。格納可能であれば格納可能領域長から（Ｎ＋１）件目のインデクスエントリ長を減じ、（Ｎ＋１）件目のエントリを作業領域に退避し、格納エントリ数Ｎを＋１加算する（ステップ３１０）。
【００１５】
また、エントリの追加が確定できたので、前方一致データαと前方一致データ長αを前方一致データβと前方一致データ長βの値に更新する（ステップ３１１）。更に、（Ｎ＋１）件目のインデクスエントリを作成する（ステップ３１２）。インデクスページにエントリを追加できる間は、ステップ３０７〜ステップ３１２の処理を繰り返す。ステップ３０９で格納不可と判定された場合、確定済みの前方一致データαと前方一致データ長αと退避済みエントリをもとに、インデクスページ作成処理（図５）をステップ４０２から実行し（ステップ３１３）、次のインデクスページ作成処理に移る。
【００１６】
インデクスページ作成処理について、図５を用いて説明する。まず、キー値で昇順に並び替えられたインデクスエントリの先頭データ（最小キー）と最終データ（最大キー）を比較し、ページ内格納キー値の前方一致データと前方一致データ長を決定する（ステップ４０１）。次に、前方共通部分がある場合は格納する各インデクスエントリから前方一致データを除いたキー値を作成する操作を全エントリに施してから格納し（ステップ４０３）、前方一致データと前方一致データ長をページ制御情報に設定する（ステップ４０４）。前方共通部分がない場合は、キー値は加工せず元のキー値のまま格納する（ステップ４０５）。最後に、格納エントリ数などのページ制御情報を設定し（ステップ４０６）、処理を終了する。
【００１７】
データ初期登録時のページ作成処理では、ページ作成途中にページ内最大キーが決定できないため、非圧縮形式で作成したインデクスエントリを作業領域に退避していき、ページ長に格納できなくなった時点で仮のページ内最大キーを決定する。このページ内最大キーと最小キーを比較して前方一致データを抽出するが、各々のインデクスエントリを前方一致データの長さ分圧縮することで、仮のページ内最大キーより大きいキー値をもつインデクスエントリが格納可能になることがある。ページ内最大キーより大きいキーをもつインデクスエントリに対して１件ずつ格納可否を判定しながら作業領域に退避していき、最終的な格納エントリ数を求める。前方一致データが異なるキーをもつインデクスエントリの追加により前方一致データ長が短くなる場合、格納可能かどうか再計算する処理を繰り返すことで格納エントリ数が最終的に決定され、最終的に求まった前方一致データ長でエントリを圧縮し格納処理を行う。上記の圧縮操作は、リーフページと上位ページで共通である。ただし、右端インデクスページ（Ｂｔｒｅｅ上で階層ごとに右端に位置するページでルートページも含める）は圧縮操作を行わないが、この理由については次の項目で述べる。
【００１８】
第二に、インデクスページにエントリを追加するときの圧縮操作について説明する。右端以外のインデクスページにエントリを追加する場合、キー値の範囲として「ページ内最小キーより小さいケース」と「ページ内最小キー以上かつページ内最大キー以下のケース」がある。後者は、追加するエントリがもつキー値の前方部分とページ制御情報の前方一致データが一致するため、追加するエントリから前方一致データを除きインデクスエントリを再作成する。この再作成したエントリをページに追加後、格納エントリ数などのページ制御情報を更新する。
【００１９】
しかし前者は、追加するエントリがもつキー値の前方部分とページ制御情報の前方一致データが一致しないので、エントリを圧縮せずに格納する。その結果、ページ内に圧縮形式のエントリと非圧縮形式のエントリが混在することになるので、これらを区別するためにページ制御情報で非圧縮エントリ数を管理する。非圧縮形式のエントリは最小値側にしか現れないため、エントリごとに非圧縮と圧縮の区別をする必要はない。右端インデクスページにエントリを追加する場合、キー値の範囲として「ページ内最小キーより小さいケース」と「ページ内最小キー以上かつページ内最大キー以下のケース」だけでなく「ページ内最大キーより大きいケース」が存在するため、圧縮操作を行わない。
【００２０】
第三に、インデクスページ分割時のページ作成方法について説明をする。ページ分割では、元のページに格納されたエントリ群を２分割し各ページに格納されるキー値の最大値と最小値が決定され、各々のページに対し図５で示した圧縮操作を施す。ページ分割時は元のページのどのエントリで分割するかが問題となる。一般にキー値の範囲が狭くなるほど前方一致データ長は長くなり圧縮効果が大きくなるが、分割後のページに非圧縮エントリと圧縮エントリを混在させて格納する場合、分割後のキー値には前方共通部分が存在しないか短くなることがある。この場合圧縮されていた各エントリが長くなることにより、分割後のページにも格納できなくなる。分割にあたってはこのようなことを考慮する必要がある。また、上位ページとリーフページを問わず同様の分割処理を行い、分割した両方のページに圧縮操作を施す。ただし、右端インデクスページの分割処理は、圧縮操作をしていないインデクスページを常に右端インデクスページだけにするため、キー値がより小さいインデクスエントリを格納するページには圧縮操作を施すが、もう一方のページには圧縮操作を施さない。
【００２１】
分割する前のページの状態には、「非圧縮エントリと圧縮エントリが混在するページ」と「非圧縮エントリだけのページ」と「圧縮エントリだけのページ」の３通りある。まず、「非圧縮エントリと圧縮エントリが混在するページ」の分割処理について、図６を用いて説明する。このケースでは、分割位置として非圧縮エントリと圧縮エントリの境界を基準にする。非圧縮エントリ数が少ないと格納効率が低下するため、なるべく使用領域長が均等になるように補正処理を行う。
【００２２】
ページ分割位置決定後のページ作成処理は、「非圧縮エントリと圧縮エントリが混在するページの作成」と「非圧縮エントリのみ存在するページの作成」と「圧縮エントリのみ存在するページの作成」の三つに分けられる。いずれの場合も、ページ内に格納されるキー値の最大値と最小値を比較し前方一致するデータ長とそのデータを抽出し直す。ここで抽出された共通部分はページ内のすべてのキー値に一致することとなる。従って、すべてのキー値からこの長さ分の前方データを削除して格納する。そしてページ制御情報内には、格納エントリ数、非圧縮エントリ数とともに前方一致データ長及びそのデータを設定する。ただし、「非圧縮エントリと圧縮エントリが混在するページの作成」の場合、圧縮し直すと格納可能領域長を超えてしまうことがある。このときは、圧縮操作をせずエントリを元のまま格納する。
【００２３】
次に、「非圧縮エントリだけのページ」と「圧縮エントリだけのページ」の分割処理について説明する。このケースでは、格納エントリ数が均等になるように分割する。ページ分割位置決定後のページ作成処理は、「非圧縮エントリのみ存在するページの作成」または「圧縮エントリのみ存在するページの作成」のときと同じである。
ここでインデクスページ分割時の補正処理について、図７と図８を用いて詳述する。まず、追加エントリを含めたＬα（非圧縮エントリ群の全体長）・Ｎα（非圧縮エントリ群を構成するエントリの数）・Ｌβ（圧縮エントリ群の全体長）・Ｎβ（圧縮エントリ群を構成するエントリの数）を求める（ステップ６０１〜６０９）。これらを求める際、追加するエントリのキー値（ページ分割の契機となったキー値）の前方部分がページ制御情報内の前方一致データと一致するかどうかで処理を二つに分ける（ステップ６０１）。一致する場合、非圧縮エントリ群にエントリを追加しないので、ＬαとＮαにページ分割前の値を設定する（ステップ６０２、６０３）。逆に圧縮エントリ群にエントリを追加するので、Ｌβに「ページ分割前の圧縮エントリ群の長さ＋追加エントリ長−前方一致データ長」を代入し（ステップ６０４）、Ｎβに「圧縮エントリ数（格納エントリ数−非圧縮エントリ数）＋１」を代入する（ステップ６０５）。ステップ６０１で一致しないと判定された場合、非圧縮エントリ群にエントリを追加するので、Ｌαに「ページ分割前の非圧縮エントリ群の長さ＋追加エントリ長」を代入し（ステップ６０６）、Ｎαに「非圧縮エントリ数＋１」を代入する（ステップ６０７）。逆に圧縮エントリ群にエントリを追加しないので、ＬβとＮβにページ分割前の値を設定する（ステップ６０８、６０９）。
【００２４】
次に、ステップ６０１〜６０９で求めた値をもとに分割位置を決定する（ステップ６１０〜６２３）。ページ分割後に各々のページが使用する領域長はＬαとＬβで目安をつけることができるので、この二つを比較する（ステップ６１０）。ＬαとＬβが等しい場合、ページはほぼ均等に分割できるのでＮα番目のインデクスエントリを分割位置として決定する（ステップ６１１）。ＬαがＬβより大きい場合、ページを均等に分割するため非圧縮エントリ群から圧縮エントリ群へエントリを移していく。このとき、ＬαがＬβ以下になるまで以下四つの処理を繰り返す。ただし、この過程で非圧縮エントリ群にエントリがなることがあるので、四つの処理を実行する前に「Ｎαが２以上か」を判定する（ステップ６１２）。
（１）Ｌαから任意の非圧縮エントリ長を減算する（ステップ６１３）。
（２）Ｎαから１を減算する（ステップ６１４）。
（３）（Ｎα＋１）件目の非圧縮エントリを含めて、前方一致データ長とＬβを再算出。（ステップ６１５）。
（４）Ｎβに１を加算する（ステップ６１６）。
【００２５】
その後、Ｎα番目のインデクスエントリを分割位置として決定する（ステップ６１１）。ＬαがＬβより小さい場合、ページを均等に分割するため圧縮エントリ群から非圧縮エントリ群へエントリを移していく。このとき、ＬαがＬβ以上になるまで以下四つの処理を繰り返す。ただし、この過程で圧縮エントリ群にエントリがなることがあるので、四つの処理を実行する前に「Ｎβが２以上か」を判定する（ステップ６１８）。
（１）Ｌαに任意の非圧縮エントリ長を加算する（ステップ６１９）。
（２）Ｎαに１を加算する（ステップ６２０）。
（３）Ｌβから任意の圧縮エントリ長を減算する（ステップ６２１）。
（４）Ｎβから１を減算する（ステップ６２２）。
【００２６】
その後、Ｎα番目のインデクスエントリを分割位置として決定する（ステップ６１１）。分割位置決定（ステップ６１１）後、１からＮαまでの非圧縮エントリ群を１ページに格納し、もう一つのページに１からＮβまでの圧縮エントリ群を格納する。このとき、エントリ群の全体長（ＬαとＬβ）が格納可能領域長を越えなければ図５の圧縮操作を行うが、超えてしまう場合はエントリ群をページ分割前のエントリの形式で格納する。
【００２７】
最後に、特定のキー値を検索する場合の比較方式について、図９を用いて説明する。この比較方式は、全てのインデクスページに共通である。まず、ページ制御情報から前方一致データがあるかどうかを判定する（図９の（１））。前方一致データがなければ、ページ内の非圧縮エントリ群に対して検索するキー値でサーチを行い目的のデータを取り出す（図９の（４））。前方一致データがあれば、この長さに合わせて検索するキー値と前方一致データを比較する（図９の（２））。前方一致データと一致しなければ、ページ内の非圧縮エントリ群に対して検索するキー値でサーチを行い目的のデータを取り出す（図９の（４））。前方一致データと一致すれば、圧縮エントリ群に対して検索するキー値から前方共通部分を除いてサーチを行い目的のデータを取り出す（図９の（３））。いずれの場合も従来に比べ検索範囲を狭めることができる。非圧縮エントリ群に対して検索する場合、検索キーのすべてのデータを比較する。圧縮エントリ群に対して検索する場合には、検索キーの前方共通部分を除くデータで比較する。
【００２８】
以上説明したように、インデクスページ内に存在するキー値の前方部分が一致しやすい特性を利用することで、インデクスページの格納効率を向上させることが可能になる。これに伴い、インデクスアクセス時のＩ／Ｏ回数を削減することも可能となる。更に、前方一致データとそれ以外のデータを分けて検索することで、圧縮したデータを復元することもなく高速な検索が可能になる。
【００２９】
【発明の効果】
以上説明したように、本発明によれば、インデクスページ内に存在するキー値の前方部分が一致しやすい特性を利用することで、インデクスページの格納効率を向上させることが可能になる。
【図面の簡単な説明】
【図１】本発明適用の前提となるインデクスの格納構造を示す概略図、
【図２】本発明の圧縮方法を適用したインデクスページを示す図、
【図３】インデクス初期登録時のページ作成方法を示すフロ−チャ−ト図１、
【図４】インデクス初期登録時のページ作成方法を示すフロ−チャ−ト図２、
【図５】インデクスページ作成時の圧縮方法を示すフロ−チャ−ト図、
【図６】インデクスページ分割時のページ作成例を示す図、
【図７】インデクスページ分割時の補正処理を示すフロ−チャ−ト図１、
【図８】インデクスページ分割時の補正処理を示すフロ−チャ−ト図２、
【図９】インデクスページ内での比較方法を示す図である。
【符号の説明】
１１：インデクスファイル
１２：データファイル
２１：ページ制御情報
２１１：ページ制御情報
２１２：非圧縮エントリ数
２１３：前方一致データ長
２１４：前方一致データ
【図１】
2004062475.tif 000003
【図２】
2004062475.tif 000004
【図３】
2004062475.tif 000005
【図４】
2004062475.tif 000006
【図５】
2004062475.tif 000007
【図６】
2004062475.tif 000008
【図７】
2004062475.tif 000009
【図８】
2004062475.tif 000010
【図９】
2004062475.tif 000011