(57)【要約】【課題】  sparse indexの書き込み性能を維持したまま、入力データ順序の逆転にも対応したデータ構造によりデータを蓄積すると共に、蓄積されたデータを探索キーにより検索することを可能にする。【解決手段】  データを蓄積する際には、sparse indexに基づく構造のデータに加えて、データファイルの各論理ブロックに１対１で対応したデータであって、当該論理ブロックの範囲内のキー値が別の論理ブロックにある場合に、その別のブロックへのオフセットを論理ブロック単位で示すオフセットデータを保存する。また、検索する際には、索引ファイルに基づき対象となる論理ブロックを探索しても所望のキー値を持つレコードが見つからない場合に、オフセットデータが示すオフセットだけ当該論理ブロックより後ろの論理ブロックを読み込み、その論理ブロックを対象として探索を行う。【選択図】  図１
2011165000.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ上で二次記憶装置に論理ブロック単位で逐次データ蓄積を行う場合に、データの順序の逆転が起こっても高速な書き込みと完全一致検索及び範囲検索を行うためのデータ蓄積装置であって、
インタフェースを介して入力されたレコードを論理ブロック分だけ蓄積するバッファメモリと、
前記バッファメモリに蓄積されたレコードを読み出し、該レコードを前記二次記憶装置に蓄積する際に、該レコードのデータがsparse indexに基づく構造であり、該二次記憶装置の各論理ブロックに１対１で対応し、該論理ブロックの範囲内のキー値が別の論理ブロックにある場合に、該別の論理ブロックへのオフセットを論理ブロック単位で示すオフセットデータを該二次記憶装置に書き込むシステム制御手段を有する
ことを特徴とするデータ蓄積装置。
【請求項２】
前記二次記憶装置は、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
前記データファイルの各論理ブロックのレコードのキー値に対する索引を格納した索引ファイルと、
を有し、
前記データファイルの各論理ブロックは、
実データを格納するレコード部と、特定の論理ブロックへのオフセットを論理ブロック単位で表す固定長のビット列からなるヘッダ部から構成され、
前記論理ブロックは扱うキー値の範囲を持ち、
前記システム制御手段は、
前記論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックのヘッダ部のビット列のオフセットと等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すように前記データファイルに書き込む手段を含む
請求項１記載のデータ蓄積装置。
【請求項３】
前記システム制御手段は、
前記バッファメモリのレコードをキー値に基づいて昇順にソートするソート手段と、
前記バッファメモリのレコードを前記データファイルの前記レコード部に書き込み、前記データファイルのオフセットデータの初期値として、全ビットを「０」にしたビット列を前記ヘッダ部に書き込む初期化手段と、
前記索引ファイルを参照して、索引内の最大のキー値を探索し、その値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、前記索引ファイルに書き込む索引ファイル生成手段と、
前記バッファメモリの先頭のレコードのキー値が前記下限値Ｌであれば、前記索引ファイルにおいて参照中のレコードのキー値以上で最も値が小さいキー値を探索し、該キー値が指すレコードを含む論理ブロックを前記データファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成手段と、
前記読み込んだ論理ブロックのヘッダ部分のオフセットを表すビット列ｂを読み込み、前記ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成手段と、
前記ビット列ｃを、読み込んだ論理ブロックのヘッダ部にオフセットデータとして前記データファイルに上書きする書き込み手段と、
前記バッファメモリから次のレコードを読み出して、該レコードのキー値が前記下限値Ｌ以下である場合は、前記第１のビット列生成手段、前記第２のビット列生成手段、前記書き込み手段を、該バッファメモリに次のレコードがなくなるまで繰り返す手段と、
を有する請求項２記載のデータ蓄積装置。
【請求項４】
前記二次記憶装置は、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックを格納するデータファイルと、
前記データファイルの各論理ブロックのレコードのキー値に対する索引を格納する索引ファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列は前記データファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、
を有し、
前記各論理ブロックは扱うキー値の範囲を持ち、
前記システム制御手段は、
前記論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックに対応したオフセットファイルのビット列の前記オフセット数と等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すように前記オフセットファイルに書き込む手段を含む
請求項１記載のデータ蓄積装置。
【請求項５】
前記システム制御手段は、
前記バッファメモリのレコードをキー値に基づいて昇順にソートするソート手段と、
前記バッファメモリのレコードを前記データファイルの前記レコード部に書き込む手段と、
前記索引ファイルを参照して索引内の最大のキー値を探索し、該キー値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、前記索引ファイルに書き込む索引ファイル生成手段と、
前記書き込んだ論理ブロック内で最大のキー値をキー値とし、初期値として全ビットを「０」にしたビット列をオフセットデータとしてオフセットファイルに書き込む手段と、
前記バッファメモリの先頭のレコードのキー値が前記下限値Ｌであれば、前記索引ファイルのキー値が指すレコードを含む論理ブロックを前記データファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成手段と、
前記索引ファイルのキー値に基づいて読み込んだ前記データファイルの論理ブロックに対応したオフセットデータを前記オフセットファイルから探索し、探索したオフセットデータのビット列ｂを読み込み、前記ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成手段と、
前記ビット列ｃを、前記オフセットファイルの読み込んだオフセットデータに上書きする書き込み手段と、
前記バッファメモリから次のレコードを読み出して、該レコードのキー値が前記下限値Ｌ以下である場合は、前記第１のビット列生成手段、前記第２のビット列生成手段、前記書き込み手段を、該バッファメモリに次のレコードがなくなるまで繰り返す手段と、
を有する請求項４記載のデータ蓄積装置。
【請求項６】
コンピュータ上で二次記憶装置に論理ブロック単位で逐次データ蓄積を行う場合に、データの順序の逆転が起こっても高速な書き込みと完全一致検索及び範囲検索を行うためのデータ蓄積方法であって、
前記二次記憶装置と、
インタフェースを介して入力されたレコードを論理ブロック分だけ蓄積するバッファメモリと、を有する装置において、
前記バッファメモリに蓄積されたレコードを読み出し、該レコードを前記二次記憶装置に蓄積する際に、該レコードのデータがsparse indexに基づく構造であり、前記二次記憶装置の各論理ブロックに１対１で対応し、該論理ブロックの範囲内のキー値が別の論理ブロックにある場合に、該別の論理ブロックへのオフセットを論理ブロック単位で示すオフセットデータを該二次記憶装置に書き込む制御ステップを行う
ことを特徴とするデータ蓄積方法。
【請求項７】
前記二次記憶装置は、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
前記データファイルの各論理ブロックのレコードのキー値に対する索引ファイルを有し、
前記データファイルの各論理ブロックは、
実データを格納するレコード部と、特定の論理ブロックへのオフセットを論理ブロック単位で表す固定長のビット列からなるヘッダ部から構成され、
前記論理ブロックは扱うキー値の範囲を持ち、
前記制御ステップにおいて、
前記論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックのヘッダ部のビット列のオフセットと等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すように前記データファイルに書き込む
請求項６記載のデータ蓄積方法。
【請求項８】
前記制御ステップにおいて、
前記バッファメモリのレコードをキー値に基づいて昇順にソートするソートステップと、
前記バッファメモリのレコードを前記データファイルの前記レコード部に書き込み、前記データファイルのオフセットデータの初期値として全ビットを「０」にしたビット列を前記ヘッダ部に書き込む初期化ステップと、
前記索引ファイルを参照して、索引内の最大のキー値を探索し、その値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、前記索引ファイルに書き込む索引ファイル生成ステップと、
前記バッファメモリの先頭のレコードのキー値が前記下限値Ｌであれば、前記索引ファイルにおいて参照中のレコードのキー値以上で最も値が小さいキー値を探索し、該キー値が指すレコードを含む論理ブロックを前記データファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成ステップと、
前記読み込んだ論理ブロックのヘッダ部分のオフセットを表すビット列ｂを読み込み、前記ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成ステップと、
前記ビット列ｃを、読み込んだ論理ブロックのヘッダ部にオフセットデータとして前記データファイルに上書きする書き込みステップと、
前記バッファメモリから次のレコードを読み出して、該レコードのキー値が前記下限値Ｌ以下である場合は、前記第１のビット列生成ステップ、前記第２のビット列生成ステップ、前記書き込みステップを、該バッファメモリに次のレコードがなくなるまで繰り返す、
請求項７記載のデータ蓄積方法。
【請求項９】
前記二次記憶装置は、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックを格納するデータファイルと、
前記データファイルの各論理ブロックのレコードのキー値に対する索引を格納する索引ファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列は前記データファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、
を有し、
前記各論理ブロックは扱うキー値の範囲を持ち、
前記制御ステップにおいて、
前記論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックに対応したオフセットファイルのビット列の前記オフセット数と等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すように前記オフセットファイルに書き込む
請求項６記載のデータ蓄積方法。
【請求項１０】
前記制御ステップにおいて、
前記バッファメモリのレコードをキー値に基づいて昇順にソートするソートステップと、
前記バッファメモリのレコードを前記データファイルの前記レコード部に書き込むステップと、
前記索引ファイルを参照して索引内の最大のキー値を探索し、該キー値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、前記索引ファイルに書き込む索引ファイル生成ステップと、
前記書き込んだ論理ブロック内で最大のキー値をキー値とし、初期値として全ビットを「０」にしたビット列をオフセットデータとしてレコードをオフセットファイルに書き込むステップと、
前記バッファメモリの先頭のレコードのキー値が前記下限値Ｌであれば、前記索引ファイルのキー値ガ指すレコードを含む論理ブロックを前記データファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成ステップと、
前記索引ファイルのキー値に基づいて読み込んだ前記データファイルの論理ブロックに対応したオフセットデータを前記オフセットファイルから探索し、探索したオフセットデータのビット列ｂを読み込み、前記ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成ステップと、
前記ビット列ｃを、前記オフセットファイルの読み込んだオフセットデータに上書きする書き込みステップと、
前記バッファメモリから次のレコードを読み出して、該レコードのキー値が前記下限値Ｌ以下である場合は、前記第１のビット列生成ステップ、前記第２のビット列生成ステップ、前記書き込みステップを、該バッファメモリに次のレコードがなくなるまで繰り返す、
請求項９記載のデータ蓄積方法。
【請求項１１】
請求項１乃至５のデータ蓄積装置により二次記憶装置のデータファイルに蓄積されたデータを検索するためのデータ検索装置であって、
前記二次記憶装置は、少なくとも、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
前記データファイルの各論理ブロックのレコードのキー値に対する索引ファイルと、を有し、
完全一致検索または範囲検索を行うための検索条件としてキー値が入力されると、
前記キー値から前記二次記憶装置の前記索引ファイルを検索し、得られた索引に基づいて所望のキー値を持つレコードを検索しても見つからない場合に、索引に対応する論理ブロックのオフセットデータを参照し、得られたオフセット分だけ該論理ブロックより後ろの論理ブロックを読み込み、読み込まれた論理ブロックを対象として、前記キー値による検索を行う検索手段を有する
ことを特徴とするデータ検索装置。
【請求項１２】
前記検索条件として、探索キーが入力されると、前記索引ファイルから探索キー値以上で最も値の小さいキー値を探索し、該キー値が指し示すレコードを含むデータファイルの論理ブロックを読み込む手段と、
読み込んだ前記論理ブロック内のレコード部から二分探索を用いて探索キーを持つレコードを検索し、前記探索キーを持つレコードが見つかった場合は、該レコードを出力する手段と、
見つからなかった場合は、前記論理ブロックのヘッダにあるオフセットデータのビット列を参照し、まだチェックしていないビットの内ビットが１となっているビット番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、読み込んだ論理ブロックから二分探索を用いて探索キーを持つレコードを探索する手段と、
を有する
請求項１１記載のデータ検索装置。
【請求項１３】
下限キー値以上、上限キー値未満という検索条件が与えられると、前記索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックを前記データファイルから読み込む手段と、
読み込んだ前記論理ブロックのヘッダ部のオフセットを示すビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的にアドレス集合Ｕ記憶手段に格納する手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値未満である場合に、次のレコードを参照する手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードから該論理ブロックの末尾のレコードまでのすべてのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、さらに次の論理ブロックが存在する場合には次の論理ブロックを読み込む手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照する手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値以上である場合に、前記アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部のすべてのレコードのキー値について、前記下限キー値以上、前記上限キー値未満であるかを判定し、該キー値が前記下限キー値以上、前記上限キー値未満であれば、該キー値を持つレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に格納する手段と、
前記レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力する手段と、
を有する請求項１１記載のデータ検索装置。
【請求項１４】
前記二次記憶装置において、
前記索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列は前記データファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
入力された検索条件のキー値以上で最も値の小さいキー値を前記索引ファイルから検索し、その値が指すレコードを前記データファイルの論理ブロックから読み込む手段と、
読み込んだ論理ブロック内のレコード部から二分探索を用いて、検索条件のキー値を持つレコードを検索する二分探索手段と、
前記二分探索手段において、レコードが見つかった場合は当該レコードを出力し、見つからない場合は、該索引ファイルから検索されたキー値を用いて前記オフセットファイルから論理ブロックに対応したオフセットデータを検索し、該オフセットデータのビット列でまだチェックしていない「１」となっているビットの番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、前記二分探索手段を行う処理をビット列が持つビットが「１」となっている全ての桁について行う手段と、
を有する請求項１１記載のデータ検索装置。
【請求項１５】
前記二次記憶装置において、
前記索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列は前記データファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
下限キー値以上、上限キー値未満という検索条件が与えられると、前記索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックを前記データファイルから読み込む手段と、
読み込んだ前記論理ブロックの末尾のレコードを参照し、該レコードのキー値を元に、該論理ブロックに対応するオフセットデータを前記オフセットファイルから検索する手段と、
検索したオフセットデータのビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的に記憶手段のアドレス集合Ｕ記憶手段に格納する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値未満である場合に、次のレコードを参照する手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードから該論理ブロックの末尾のレコードまでの全てのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、さらに次の論理ブロックが存在する場合には次の論理ブロックを読み込む手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照する手段と、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値以上である場合に、前記アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部の全てのレコードのキー値について、前記下限キー値以上、前記上限キー値未満であるかを判定し、該キー値が前記下限キー値以上、前記上限キー値未満であれば、該キー値を持つレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に格納する手段と、
前記レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力する手段と、
を有する請求項１１記載のデータ検索装置。
【請求項１６】
請求項６乃至１０のデータ蓄積方法により、二次記憶装置のデータファイルに蓄積されたデータを検索するためのデータ検索方法であって、
前記二次記憶装置は、少なくとも、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
前記データファイルの各論理ブロックのレコードのキー値に対する索引ファイルと、を有し、
完全一致検索または範囲検索を行うための検索条件としてキー値が入力されると、
前記キー値から前記二次記憶装置の前記索引ファイルを検索し、得られた索引に基づいて所望のキー値を持つレコードを検索しても見つからない場合に、索引に対応する論理ブロックに対応するオフセットデータを参照し、得られたオフセット分だけ該論理ブロックより後ろの論理ブロックを読み込み、読み込まれた論理ブロックを対象として、前記キー値による検索を行う
ことを特徴とするデータ検索方法。
【請求項１７】
前記検索条件として、探索キーが入力されると、前記索引ファイルから探索キー値以上で最も値の小さいキー値を探索し、該キー値が指し示すレコードを含むデータファイルの論理ブロックを読み込むステップと、
読み込んだ前記論理ブロック内のレコード部から二分探索を用いて探索キーを持つレコードを検索し、前記探索キーを持つレコードが見つかった場合は、該レコードを出力するステップと、
見つからなかった場合は、前記論理ブロックのヘッダにあるオフセットデータのビット列を参照し、まだチェックしていないビットの内ビットが１となっているビット番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、読み込んだ論理ブロックから二分探索を用いて探索キーを持つレコードを探索するステップと、
を行う請求項１６記載のデータ検索方法。
【請求項１８】
下限キー値以上、上限キー値未満という検索条件が与えられると、前記索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックを前記データファイルから読み込むステップと、
読み込んだ前記論理ブロックのヘッダ部のオフセットを示すビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的にアドレス集合Ｕ記憶手段に格納するステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値未満である場合に、次のレコードを参照するステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードから該論理ブロックの末尾のレコードまでのすべてのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、さらに次の論理ブロックが存在する場合には次の論理ブロックを読み込むステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照するステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値以上である場合に、前記アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部のすべてのレコードのキー値について、前記下限キー値以上、前記上限キー値未満であるかを判定し、該キー値が前記下限キー値以上、前記上限キー値未満であれば、該キー値を持つレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に格納するステップと、
前記レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力するステップと、
を行う請求項１６記載のデータ検索方法。
【請求項１９】
前記二次記憶装置において、
前記索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列は前記データファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
入力された検索条件のキー値以上で最も値の小さいキー値を前記索引ファイルから検索し、その値が指すレコードを前記データファイルの論理ブロックから読み込むステップと、
読み込んだ論理ブロック内のレコード部から二分探索を用いて、検索条件のキー値を持つレコードを検索する二分探索ステップと、
前記二分探索手段において、レコードが見つかった場合は当該レコードを出力し、見つからない場合は、該索引ファイルから検索されたキー値を用いて前記オフセットファイルから論理ブロックに対応したオフセットデータを検索し、該オフセットデータのビット列でまだチェックしていない「１」となっているビットの番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、前記二分探索ステップを行う処理をビット列が持つビットが「１」となっている全ての桁について行うステップと、
を行う請求項１６記載のデータ検索方法。
【請求項２０】
前記二次記憶装置において、
前記索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列は前記データファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
下限キー値以上、上限キー値未満という検索条件が与えられると、前記索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックを前記データファイルから読み込むステップと、
読み込んだ前記論理ブロックの末尾のレコードを参照し、該レコードのキー値を元に、該論理ブロックに対応するオフセットデータを前記オフセットファイルから検索するステップと、
検索したオフセットデータのビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的にアドレス集合Ｕ記憶手段に格納するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値未満である場合に、次のレコードを参照するステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードから該論理ブロックの末尾のレコードのまでの全てのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納し、さらに、次の論理ブロックが存在する場合には次の論理ブロックを読み込むステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値未満である場合に、その参照しているレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照するステップと、
読み込んだ前記論理ブロックのレコード部の参照しているレコードのキー値が前記下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値以上であり、かつ、参照しているレコードのキー値が前記上限キー値以上である場合に、前記アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部の全てのレコードのキー値について、前記下限キー値以上、前記上限キー値未満であるかを判定し、該キー値が前記下限キー値以上、前記上限キー値未満であれば、該キー値を持つレコードを、前記検索条件を満たすレコード集合Ｒ記憶手段に格納するステップと、
前記レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力するステップと、
を行う請求項１６記載のデータ検索方法。
【請求項２１】
請求項１乃至５のいずれかに記載のデータ蓄積装置を構成する各手段としてコンピュータを機能させるためのデータ蓄積プログラム。
【請求項２２】
請求項１１乃至１５のいずれかに記載のデータ検索装置を構成する各手段としてコンピュータを機能させるためのデータ検索プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ蓄積装置及び方法及びプログラム及びデータ検索装置及び方法及びプログラムに係り、特に、二次記憶装置にデータを蓄積、及び、二次記憶装置のデータを検索するためのデータ蓄積装置及び方法及びプログラム及びデータ検索装置及び方法及びプログラムに関する。
【０００２】
詳しくは、コンピュータ上で二次記憶装置に論理ブロック単位で逐次データ蓄積を行うデータ蓄積装置及び方法及びプログラム、及び蓄積されたデータを検索条件に基づいて検索するデータ検索装置及び方法及びプログラムに関する。
【背景技術】
【０００３】
従来の二次記憶装置へのデータ蓄積方法では、レコードといういくつかの情報を１つに纏めたデータをデータ格納する際の最小単位として扱っている。また、二次記憶装置への最小アクセス単位として物理ブロックがあり、これをシステム上で仮想的に扱えるようにしたものを論理ブロックと呼ぶ。ファイルは複数の論理ブロックから成り立ち、論理ブロックは複数のレコードを含むことが多い。
【０００４】
また、特定のレコードを効率的に検索するために、索引が用いられている。索引はレコードが持つ任意の属性の値について作成することができる。このときこの索引を作成する任意の属性の値のことを「キー値」と呼ぶ。この索引付けの方法のうち、範囲検索を行える方法として、dense indexとsparse indexがある（例えば、非特許文献１参照）。Dense indexはデータの入力順に左右されず、入力された全てのレコードについて索引を作成する。これに対し、sparse indexでは、データの入力順を利用して、入力されたレコードのうち一部のレコードについてのみ索引を作成する。索引が作成されないレコードに関しては、入力順がキー値についてソートされているという前提の元で探索を行う。このため、sparse indexはデータの入力順がキー値についてソートされているときに限り使うことのできる方法である。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】Abraham Silberschatz, Henry F. Korth, S. Sudarshan, "Database System concepts fifth Edition", pp. 483-485, McGraw-Hill (2006).
【発明の概要】
【発明が解決しようとする課題】
【０００６】
センサネットワークを通じて集められる大量の時系列センサデータなどを時刻をキー値として範囲検索可能な形でリアルタイムに二次記憶装置へ蓄積しようとする場合、データ書き込みの高速性が求められる。しかしながら、従来の索引付け方法のうち、dense indexを用いる場合、入力される各レコード毎に索引を作成する必要があるため、データ書き込み時のコストがsparse indexに比べて高く、データの書き込み速度がデータの発生に追いつかない。一方で、sparse indexを用いるためには、入力されるデータがキー値（この場合、時刻）についてソートされた状態で入力される必要がある。しかし、センサネットワークを通じて集められる大量の時系列データはネットワークの遅延などによって入力されるデータの時刻データが逆転することが考えられる。このため、時刻をキー値とすると、キー値によってソートされていないデータとなるため、sparse indexを用いることができない。
【０００７】
本発明は、上記の点に鑑みなされたもので、sparse indexの書き込み性能を維持したまま、入力データ順序の逆転にも対応したデータ構造によりデータを蓄積するデータ蓄積装置及び方法及びプログラム、及び、蓄積されたデータを検索するためのデータ検索装置及び方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
図１は、本発明の原理構成図である。
【０００９】
本発明（請求項１）は、コンピュータ上で二次記憶装置１３０に論理ブロック単位で逐次データ蓄積を行う場合に、データの順序の逆転が起こっても高速な書き込みと完全一致検索及び範囲検索を行うためのデータ蓄積装置であって、
インタフェース１１０を介して入力されたレコードを論理ブロック分だけ蓄積するバッファメモリ１２０と、
バッファメモリ１２０に蓄積されたレコードを読み出し、該レコードを二次記憶装置１３０に蓄積する際に、該レコードのデータがsparse indexに基づく構造であり、該二次記憶装置１３０の各論理ブロックに１対１で対応し、該論理ブロックの範囲内のキー値が別の論理ブロックにある場合に、該別の論理ブロックへのオフセットを論理ブロック単位で示すオフセットデータを該二次記憶装置１３０に書き込むシステム制御手段１００を有する。
【００１０】
また、本発明（請求項２）は、請求項１のデータ蓄積装置において、
二次記憶装置１３０は、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
データファイルの各論理ブロックのレコードのキー値に対する索引を格納した索引ファイルと、
を有し、
データファイルの各論理ブロックは、
実データを格納するレコード部と、特定の論理ブロックへのオフセットを論理ブロック単位で表す固定長のビット列からなるヘッダ部から構成され、
論理ブロックは扱うキー値の範囲を持ち、
システム制御手段１００は、
論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックのヘッダ部のビット列のオフセットと等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すようにデータファイルに書き込む手段を含む。
【００１１】
また、本発明（請求項３）は、請求項２のデータ蓄積装置において、
システム制御手段１００は、
バッファメモリ１２０のレコードをキー値に基づいて昇順にソートするソート手段と、
バッファメモリ１２０のレコードをデータファイルのレコード部に書き込み、データファイルのオフセットデータの初期値として、全ビットを「０」にしたビット列をヘッダ部に書き込む初期化手段と、
索引ファイルを参照して、索引内の最大のキー値を探索し、その値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイルに書き込む索引ファイル生成手段と、
バッファメモリ１２０の先頭のレコードのキー値が下限値Ｌであれば、索引ファイルにおいて参照中のレコードのキー値以上で最も値が小さいキー値を探索し、該キー値が指すレコードを含む論理ブロックをデータファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成手段と、
読み込んだ論理ブロックのヘッダ部分のオフセットを表すビット列ｂを読み込み、ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成手段と、
ビット列ｃを、読み込んだ論理ブロックのヘッダ部にオフセットデータとしてデータファイルに上書きする書き込み手段と、
バッファメモリ１２０から次のレコードを読み出して、該レコードのキー値が下限値Ｌ以下である場合は、第１のビット列生成手段、第２のビット列生成手段、書き込み手段を、該バッファメモリに次のレコードがなくなるまで繰り返す手段と、を有する。
【００１２】
また、本発明（請求項４）は、請求項１のデータ蓄積装置において、
二次記憶装置１３０は、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックを格納するデータファイルと、
データファイルの各論理ブロックのレコードのキー値に対する索引を格納する索引ファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列はデータファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、
を有し、
各論理ブロックは扱うキー値の範囲を持ち、
システム制御手段１００は、
論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックに対応したオフセットファイルのビット列のオフセット数と等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すようにオフセットファイルに書き込む手段を含む。
【００１３】
また、本発明（請求項５）は、請求項４のデータ蓄積装置において、
システム制御手段１００は、
バッファメモリ１２０のレコードをキー値に基づいて昇順にソートするソート手段と、
バッファメモリ１２０のレコードをデータファイルのレコード部に書き込む手段と、
索引ファイルを参照して索引内の最大のキー値を探索し、該キー値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイルに書き込む索引ファイル生成手段と、
書き込んだ論理ブロック内で最大のキー値をキー値とし、初期値として全ビットを「０」にしたビット列をオフセットデータとしてオフセットファイルに書き込む手段と、
バッファメモリ１２０の先頭のレコードのキー値が下限値Ｌであれば、索引ファイルのキー値が指すレコードを含む論理ブロックをデータファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成手段と、
索引ファイルのキー値に基づいて読み込んだデータファイルの論理ブロックに対応したオフセットデータをオフセットファイルから探索し、探索したオフセットデータのビット列ｂを読み込み、ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成手段と、
ビット列ｃを、オフセットファイルの読み込んだオフセットデータに上書きする書き込み手段と、
バッファメモリ１２０から次のレコードを読み出して、該レコードのキー値が下限値Ｌ以下である場合は、第１のビット列生成手段、第２のビット列生成手段、書き込み手段を、該バッファメモリ１２０に次のレコードがなくなるまで繰り返す手段と、を有する。
【００１４】
図２は、本発明の原理を説明するための図である。
【００１５】
本発明（請求項６）は、コンピュータ上で二次記憶装置に論理ブロック単位で逐次データ蓄積を行う場合に、データの順序の逆転が起こっても高速な書き込みと完全一致検索及び範囲検索を行うためのデータ蓄積方法であって、
二次記憶装置と、
インタフェースを介して入力されたレコードを論理ブロック分だけ蓄積するバッファメモリと、を有する装置において、
バッファメモリに蓄積されたレコードを読み出し（ステップ１）、該レコードを二次記憶装置に蓄積する際に、該レコードのデータがsparse indexに基づく構造であり、二次記憶装置の各論理ブロックに１対１で対応し（ステップ２）、該論理ブロックの範囲内のキー値が別の論理ブロックにある場合に（ステップ３）、該別の論理ブロックへのオフセットを論理ブロック単位で示すオフセットデータを該二次記憶装置に書き込む（ステップ４）制御ステップを行う。
【００１６】
また、本発明（請求項７）は、請求項６のデータ蓄積方法において、
二次記憶装置は、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
データファイルの各論理ブロックのレコードのキー値に対する索引ファイルを有し、
データファイルの各論理ブロックは、
実データを格納するレコード部と、特定の論理ブロックへのオフセットを論理ブロック単位で表す固定長のビット列からなるヘッダ部から構成され、
論理ブロックは扱うキー値の範囲を持ち、
制御ステップにおいて、
論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックのヘッダ部のビット列のオフセットと等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すようにデータファイルに書き込む。
【００１７】
また、本発明（請求項８）は、請求項７のデータ蓄積方法において、
制御ステップにおいて、
バッファメモリのレコードをキー値に基づいて昇順にソートするソートステップと、
バッファメモリのレコードをデータファイルのレコード部に書き込み、データファイルのオフセットデータの初期値として全ビットを「０」にしたビット列をヘッダ部に書き込む初期化ステップと、
索引ファイルを参照して、索引内の最大のキー値を探索し、その値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイルに書き込む索引ファイル生成ステップと、
バッファメモリの先頭のレコードのキー値が下限値Ｌであれば、索引ファイルにおいて参照中のレコードのキー値以上で最も値が小さいキー値を探索し、該キー値が指すレコードを含む論理ブロックをデータファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成ステップと、
読み込んだ論理ブロックのヘッダ部分のオフセットを表すビット列ｂを読み込み、ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成ステップと、
ビット列ｃを、読み込んだ論理ブロックのヘッダ部にオフセットデータとしてデータファイルに上書きする書き込みステップと、
バッファメモリから次のレコードを読み出して、該レコードのキー値が下限値Ｌ以下である場合は、第１のビット列生成ステップ、第２のビット列生成ステップ、書き込みステップを、該バッファメモリに次のレコードがなくなるまで繰り返す。
【００１８】
また、本発明（請求項９）は、請求項６のデータ蓄積方法において、
二次記憶装置は、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックを格納するデータファイルと、
データファイルの各論理ブロックのレコードのキー値に対する索引を格納する索引ファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列はデータファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、
を有し、
各論理ブロックは扱うキー値の範囲を持ち、
制御ステップにおいて、
論理ブロックが扱うキー値が他の論理ブロックに格納された場合、該キー値が格納された論理ブロックと該キー値を含むキー値の範囲を持つブロックとのオフセット数を論理ブロック単位で求め、該キー値を範囲に持つ論理ブロックに対応したオフセットファイルのビット列のオフセット数と等しいビット番号のビットを「１」にすることで、該論理ブロックが扱う範囲のキー値がビット列の「１」となったビットのビット番号が示すオフセット数だけ離れた論理ブロックにも格納されていることを示すようにオフセットファイルに書き込む。
【００１９】
また、本発明（請求項１０）は、請求項９のデータ蓄積方法において、
制御ステップにおいて、
バッファメモリのレコードをキー値に基づいて昇順にソートするソートステップと、
バッファメモリのレコードをデータファイルのレコード部に書き込むステップと、
索引ファイルを参照して索引内の最大のキー値を探索し、該キー値を書き込んだ論理ブロックで扱うキー値の下限値Ｌとし、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイルに書き込む索引ファイル生成ステップと、
書き込んだ論理ブロック内で最大のキー値をキー値とし、初期値として全ビットを「０」にしたビット列をオフセットデータとしてレコードをオフセットファイルに書き込むステップと、
バッファメモリの先頭のレコードのキー値が下限値Ｌであれば、索引ファイルのキー値ガ指すレコードを含む論理ブロックをデータファイルから読み込み、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスの距離をオフセットＸとし、Ｘ番目のビットのみを「１」とした桁数ｈのビット列ａを生成する第１のビット列生成ステップと、
索引ファイルのキー値に基づいて読み込んだデータファイルの論理ブロックに対応したオフセットデータをオフセットファイルから探索し、探索したオフセットデータのビット列ｂを読み込み、ビット列ａと該ビット列ｂのＯＲ条件で結合したビット列ｃを生成する第２のビット列生成ステップと、
ビット列ｃを、オフセットファイルの読み込んだオフセットデータに上書きする書き込みステップと、
バッファメモリから次のレコードを読み出して、該レコードのキー値が下限値Ｌ以下である場合は、第１のビット列生成ステップ、第２のビット列生成ステップ、書き込みステップを、該バッファメモリに次のレコードがなくなるまで繰り返す。
【００２０】
本発明（請求項１１）は、請求項１乃至５のデータ蓄積装置により二次記憶装置のデータファイルに蓄積されたデータを検索するためのデータ検索装置であって、
二次記憶装置は、少なくとも、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
データファイルの各論理ブロックのレコードのキー値に対する索引ファイルと、を有し、
完全一致検索または範囲検索を行うための検索条件としてキー値が入力されると、
キー値から二次記憶装置の索引ファイルを検索し、得られた索引に基づいて所望のキー値を持つレコードを検索しても見つからない場合に、索引に対応する論理ブロックのオフセットデータを参照し、得られたオフセット分だけ該論理ブロックより後ろの論理ブロックを読み込み、読み込まれた論理ブロックを対象として、キー値による検索を行う検索手段を有する。
【００２１】
また、本発明（請求項１２）は、請求項１１のデータ検索装置において、
検索条件として、探索キーが入力されると、索引ファイルから探索キー値以上で最も値の小さいキー値を探索し、該キー値が指し示すレコードを含むデータファイルの論理ブロックを読み込む手段と、
読み込んだ論理ブロック内のレコード部から二分探索を用いて探索キーを持つレコードを検索し、探索キーを持つレコードが見つかった場合は、該レコードを出力する手段と、
見つからなかった場合は、論理ブロックのヘッダにあるオフセットデータのビット列を参照し、まだチェックしていないビットの内ビットが１となっているビット番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、読み込んだ論理ブロックから二分探索を用いて探索キーを持つレコードを探索する手段と、を有する。
【００２２】
また、本発明（請求項１３）は、請求項１１のデータ検索装置において、
下限キー値以上、上限キー値未満という検索条件が与えられると、索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックをデータファイルから読み込む手段と、
読み込んだ論理ブロックのヘッダ部のオフセットを示すビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的にアドレス集合Ｕ記憶手段に格納する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値未満である場合に、次のレコードを参照する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値未満である場合に、その参照しているレコードから該論理ブロックの末尾のレコードまでのすべてのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、さらに次の論理ブロックが存在する場合には次の論理ブロックを読み込む手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以下である場合に、その参照しているレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以上である場合に、アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部のすべてのレコードのキー値について、下限キー値以上、上限キー値未満であるかを判定し、該キー値が下限キー値以上、上限キー値未満であれば、該キー値を持つレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納する手段と、
レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力する手段と、
を有する。
【００２３】
また、本発明（請求項１４）は、請求項１１のデータ検索装置において、
二次記憶装置は、
索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列はデータファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
入力された検索条件のキー値以上で最も値の小さいキー値を索引ファイルから検索し、その値が指すレコードをデータファイルの論理ブロックから読み込む手段と、
読み込んだ論理ブロック内のレコード部から二分探索を用いて、検索条件のキー値を持つレコードを検索する二分探索手段と、
二分探索手段において、レコードが見つかった場合は当該レコードを出力し、見つからない場合は、該索引ファイルから検索されたキー値を用いてオフセットファイルから論理ブロックに対応したオフセットデータを検索し、該オフセットデータのビット列でまだチェックしていない「１」となっているビットの番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、二分探索手段を行う処理をビット列が持つビットが「１」となっている全ての桁について行う手段と、を有する。
【００２４】
また、本発明（請求項１５）は、請求項１１のデータ検索装置において、
二次記憶装置は、
索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列はデータファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
下限キー値以上、上限キー値未満という検索条件が与えられると、索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックをデータファイルから読み込む手段と、
読み込んだ論理ブロックの末尾のレコードを参照し、該レコードのキー値を元に、該論理ブロックに対応するオフセットデータをオフセットファイルから検索する手段と、
検索したオフセットデータのビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的に記憶手段のアドレス集合Ｕ記憶手段に格納する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値未満である場合に、次のレコードを参照する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値未満であれば、参照しているレコードから末尾までのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納し、さらに、次の論理ブロックが存在する場合には次の論理ブロックを読み込む手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以下である場合に、その参照しているレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照する手段と、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以上である場合に、アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部の全てのレコードのキー値について、下限キー値以上、上限キー値未満であるかを判定し、該キー値が下限キー値以上、上限キー値未満であれば、該キー値を持つレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納する手段と、
レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力する手段と、を有する。
【００２５】
本発明（請求項１６）は、請求項６乃至１０のデータ蓄積方法により二次記憶装置のデータファイルに蓄積されたデータを検索するためのデータ検索方法であって、
二次記憶装置は、少なくとも、
入力されるレコードを論理ブロック毎に格納するデータファイルと、
データファイルの各論理ブロックのレコードのキー値に対する索引ファイルと、を有し、
完全一致検索または範囲検索を行うための検索条件としてキー値が入力されると、
キー値から二次記憶装置の索引ファイルを検索し、得られた索引に基づいて所望のキー値を持つレコードを検索しても見つからない場合に、索引に対応する論理ブロックに対応するオフセットデータを参照し、得られたオフセット分だけ該論理ブロックより後ろの論理ブロックを読み込み、読み込まれた論理ブロックを対象として、キー値による検索を行う。
【００２６】
また、本発明（請求項１７）は、請求項１６のデータ検索方法において、
検索条件として、探索キーが入力されると、索引ファイルから探索キー値以上で最も値の小さいキー値を探索し、該キー値が指し示すレコードを含むデータファイルの論理ブロックを読み込むステップと、
読み込んだ論理ブロック内のレコード部から二分探索を用いて探索キーを持つレコードを検索し、探索キーを持つレコードが見つかった場合は、該レコードを出力するステップと、
見つからなかった場合は、論理ブロックのヘッダにあるオフセットデータのビット列を参照し、まだチェックしていないビットの内ビットが１となっているビット番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、読み込んだ論理ブロックから二分探索を用いて探索キーを持つレコードを探索するステップと、を行う。
【００２７】
また、本発明（請求項１８）は、請求項１６のデータ検索方法において、
下限キー値以上、上限キー値未満という検索条件が与えられると、索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックをデータファイルから読み込むステップと、
読み込んだ論理ブロックのヘッダ部のオフセットを示すビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的にアドレス集合Ｕ記憶手段に格納するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値未満である場合に、次のレコードを参照するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値未満である場合に、その参照しているレコードから該論理ブロックの末尾のレコードまでのすべてのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、さらに次の論理ブロックが存在する場合には次の論理ブロックを読み込むステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以下である場合に、その参照しているレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以上である場合に、アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部のすべてのレコードのキー値について、下限キー値以上、上限キー値未満であるかを判定し、該キー値が下限キー値以上、上限キー値未満であれば、該キー値を持つレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納するステップと、
レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力するステップと、を行う。
【００２８】
また、本発明（請求項１９）は、請求項１６のデータ検索方法において、
二次記憶装置は、
索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列はデータファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
入力された検索条件のキー値以上で最も値の小さいキー値を索引ファイルから検索し、その値が指すレコードをデータファイルの論理ブロックから読み込むステップと、
読み込んだ論理ブロック内のレコード部から二分探索を用いて、検索条件のキー値を持つレコードを検索する二分探索ステップと、
二分探索手段において、レコードが見つかった場合は当該レコードを出力し、見つからない場合は、該索引ファイルから検索されたキー値を用いてオフセットファイルから論理ブロックに対応したオフセットデータを検索し、該オフセットデータのビット列でまだチェックしていない「１」となっているビットの番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックを読み込み、二分探索ステップを行う処理をビット列が持つビットが「１」となっている全ての桁について行うステップと、を行う。
【００２９】
また、本発明（請求項２０）は、請求項１６のデータ検索方法において、
二次記憶装置は、
索引ファイルと、
入力されたレコード毎にキー値と実データを格納するレコード部を有する論理ブロックのみを格納するデータファイルと、
複数の固定長のビット列からなり、各ビット列はそれぞれある論理ブロックに１対１で対応し、かつ、各ビット列はデータファイルの特定の論理ブロックへのオフセットを論理ブロック単位で表すオフセットファイルと、を有し、
下限キー値以上、上限キー値未満という検索条件が与えられると、索引ファイルから該下限キー値以上で最も値が小さいキー値を探し、該キー値が指し示すレコードを含む論理ブロックをデータファイルから読み込むステップと、
読み込んだ論理ブロックの末尾のレコードを参照し、該レコードのキー値を元に、該論理ブロックに対応するオフセットデータをオフセットファイルから検索するステップと、
検索したオフセットデータのビット列を参照し、「１」となっているビットがあれば、該ビットが指す論理ブロックのアドレスを一時的にアドレス集合Ｕ記憶手段に格納するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値未満である場合に、次のレコードを参照するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値未満であれば、参照しているレコードから末尾までのレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納し、さらに、次の論理ブロックが存在する場合には次の論理ブロックを読み込むステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以下である場合に、その参照しているレコードを、検索条件を満たすレコード集合Ｒ記憶手段に追加格納し、次のレコードを参照するステップと、
読み込んだ論理ブロックのレコード部の参照しているレコードのキー値が下限キー値以上で、かつ、該論理ブロックの末尾のレコードのキー値が上限キー値以上であり、かつ、参照しているレコードのキー値が上限キー値以上である場合に、アドレス集合Ｕ記憶手段が持つ各アドレスを参照し、各アドレスが指し示す論理ブロックを読み込み、該論理ブロックのレコード部の全てのレコードのキー値について、下限キー値以上、上限キー値未満であるかを判定し、該キー値が下限キー値以上、上限キー値未満であれば、該キー値を持つレコードを、検索条件を満たすレコード集合Ｒ記憶手段に格納するステップと、
レコード集合Ｒ記憶手段に格納されているレコードを検索結果として出力するステップと、を行う。
【００３０】
本発明（請求項２１）は、請求項１乃至５のいずれかに記載のデータ蓄積装置を構成する各手段としてコンピュータを機能させるためのデータ蓄積プログラムである。
【００３１】
本発明（請求項２２）は、請求項１１乃至１５のいずれかに記載のデータ検索装置を構成する各手段としてコンピュータを機能させるためのデータ検索プログラムである。
【発明の効果】
【００３２】
上記のように本発明によれば、以下のような効果がある。
【００３３】
何らかの原因で順序が逆転したデータに関しても、オフセットデータを参照することで検索可能となるため、完全にソートされていないデータに対しても、sparse indexと同様の速度での高速なデータ書き込みと、完全一致検索及び範囲検索を行うことが可能となる。
【図面の簡単な説明】
【００３４】
【図１】本発明の原理構成図である。
【図２】本発明の原理を説明するための図である。
【図３】本発明の第１の実施の形態におけるデータ蓄積装置の構成図である。
【図４】本発明の第１の実施の形態におけるデータファイルのデータ構造を示す図である。
【図５】本発明の第１の実施の形態におけるデータ追加処理を示すフローチャート（その１）である。
【図６】本発明の第１の実施の形態におけるデータ追加処理を示すフローチャート（その２）である。
【図７】本発明の第１の実施の形態におけるキー値による完全一致検索処理のフローチャートである。
【図８】本発明の第１の実施の形態におけるキー値による範囲検索処理のフローチャート（その１）である。
【図９】本発明の第１の実施の形態におけるキー値による範囲検索処理のフローチャート（その２）である。
【図１０】本発明の第２の実施の形態におけるデータ蓄積装置の構成図である。
【図１１】本発明の第２の実施の形態におけるデータ構造を示す図である。
【図１２】本発明の第２の実施の形態におけるデータ追加処理のフローチャート（その１）である。
【図１３】本発明の第２の実施の形態におけるデータ追加処理のフローチャート（その２）である。
【図１４】本発明の第２の実施の形態におけるキー値による完全一致検索処理のフローチャートである。
【図１５】本発明の第２の実施の形態におけるキー値による範囲検索処理のフローチャート（その１）である。
【図１６】本発明の第２の実施の形態におけるキー値による範囲検索処理のフローチャート（その２）である。
【発明を実施するための形態】
【００３５】
以下、図面と共に本発明の実施の形態を説明する。
【００３６】
本発明のデータ構造では、sparse indexと同様の形態を採りながら、新たな「オフセットデータ」というデータを付け加えるものとする。
【００３７】
［第１の実施の形態］
本実施の形態は、オフセットデータをビット列長ｈのビット列とし、二次記憶装置内のデータファイルの各論理ブロックのヘッダ部に書き込む方法である。また、このとき、オフセットデータのビット列によるオフセット数の表現方法は、ビット列のビット番号を用いて行う。このため、ビット列長ｈは表現できるオフセット数に影響する。ビット列長ｈの場合、表現できるオフセット数の最大値はｈとなる。このため、順序逆転によってあるレコードがｈよりも大きい論理ブロック数分遅れて入力された場合、このレコードを指し示すことはできない。よって、入力するデータの順序逆転が起こり得る範囲に併せてビット列長ｈを適宜設定する必要がある。
【００３８】
図３は、本発明の第１の実施の形態におけるデータ蓄積装置の構成を示す。
【００３９】
同図に示すデータ蓄積装置は、システム制御部１００、インタフェース１１０、バッファメモリ１２０、二次記憶装置１３０から構成される。なお、同図では、データ蓄積装置として記載しているが、システム制御部１００は後述するように、データ検索時には検索機能を有する。
【００４０】
インタフェース１１０はバッファメモリ１２０と、バッファメモリ１２０はインタフェース１１０と二次記憶装置１３０との間でそれぞれデータのやり取りを行う。二次記憶装置１３０内には、索引ファイル１３１とデータファイル１３２の２つのファイルが存在する。このときデータファイル１３２はオフセットデータを含む。
【００４１】
システム制御部１００は、インタフェース１１０に対して入力データが書き込み要求なのか読み出し要求なのかを解析する入力データ解析部１０１と、バッファメモリ１２０に対して入出力されるデータをバッファするためのメモリの管理を行うメモリ管理部１０２と、二次記憶装置１３０に対する入力データのファイルへの書き込みなどのファイル操作を行うファイル操作部１０３を有する。
【００４２】
図４は、本発明の第１の実施の形態におけるデータファイルのデータ構造を示す。
【００４３】
データファイル１３２の各論理ブロックはレコード部とヘッダ部から構成され、レコード部は入力されたレコード、ヘッダ部にはオフセットデータを持つ。同図のデータファイル１３２の最初の論理ブロックではヘッダ部のオフセットデータのビット列の１桁目が「１」となっているため、１つ後ろの論理ブロックに最初の論理ブロックが扱う範囲のキー値のレコードがあることがわかる。なお、ヘッダ部のオフセットデータのビット列が「０」の場合は論理ブロックが扱う範囲のキー値のレコードがないことを示す。
【００４４】
＜データ追加処理＞
図５、図６は、本発明の第１の実施の形態におけるデータ追加処理を示すフローチャートである。
【００４５】
データ追加（蓄積）処理では、システム制御部１００の入力データ解析部１０１が書き込み要求であると判定すると、入力されたデータ（入力レコード）をメモリ管理部１０２を介してバッファメモリ１２０上に蓄積する（ステップ１０１）。このとき、メモリ管理部１０２は、入力レコードが論理ブロックサイズ分だけ蓄積されるまで入力レコードをバッファメモリ１２０に蓄積し続ける。
【００４６】
入力レコードがバッファメモリ１２０内に論理ブロックサイズ分だけ蓄積されたならば（ステップ１０２、Ｙｅｓ）、メモリ管理部１０２は、バッファメモリ１２０内のレコードをキー値について昇順にソートする（ステップ１０３）。
【００４７】
その後、ファイル操作部１０３は、バッファメモリ１２０内のレコードを読み出し、当該レコードと、オフセットデータの初期値として全ビットを「０」にしたビット列とを、それぞれ論理ブロックのレコード部、ヘッダ部として二次記憶装置１３０のデータファイル１３２に書き込む（ステップ１０４）。このとき、書き込んだ論理ブロックのアドレスをメモリ（図示せず）に格納しておくものとする。
【００４８】
次に、ファイル操作部１０３は、索引ファイル１３１を参照して索引ファイル１３１内の最大のキー値を探し、その値をステップ１０４で書き込んだ論理ブロックで扱うキー値の下限値Ｌとして一時的にメモリ（図示せず）に記憶する（ステップ１０５）。
【００４９】
その後、ファイル操作部１０３は、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイル１３１を更新する（ステップ１０６）。
【００５０】
さらに、ファイル操作部１０３は、バッファメモリ１２０内のレコードを参照し、先頭のレコードから順にレコードのキー値が、メモリ（図示せず）内の下限値Ｌ以下となるレコードを探す（ステップ１０７）。参照したレコードが下限値Ｌよりも大きい場合（ステップ１０８、Ｎｏ）は、そこで探索を終了し、書き込み処理を終了する。また、参照したレコードが下限値Ｌ以下の場合（ステップ１０８、Ｙｅｓ）、索引ファイル１３１を調べ、そのキー値以上で最も値が小さいキー値を探す（ステップ１０９）。
【００５１】
ここで、探索したキー値が指し示す論理ブロックが、バッファメモリ１２０内の他のレコードが参照された際に読み込まれており、オフセットデータの更新が行われていたのであれば（ステップ１１０、Ｙｅｓ）、その論理ブロックの更新処理は取りやめ、バッファメモリ１２０上で次のレコードがあれば（ステップ１１８、Ｙｅｓ）、次のレコードを参照し、同様の処理を行う（ステップ１１９）。次のレコードがなければ（ステップ１１８、Ｎｏ）、そこで探索終了とし、書き込み処理を終了する。
【００５２】
一方、探索したキー値が指す論理ブロックが、バッファメモリ１２０内の他のレコードが参照された際に、まだ読み込まれておらず、データファイル１３２のオフセットデータの更新がまだ行われていないのであれば（ステップ１１０，Ｎｏ）、探索した索引のキー値を更新済みとして一時的にメモリ（図示せず）に格納し（ステップ１１１）、当該索引のキー値が指し示す論理ブロックを読み込み、その論理ブロックのアドレスをメモリ（図示せず）に格納する（ステップ１１２）。
【００５３】
次に、ファイル操作部１０３は、メモリ（図示せず）に格納されているステップ１１２で読み込んだ論理ブロックと、ステップ１０４で書き込んだ論理ブロックとのアドレスを比較し、ブロック数がいくつ離れているかを算出し、これをオフセットＸとする（ステップ１１３）。このオフセットＸを用いてＸ番目のビットのみを「１」としたビット列長ｈのビット列ａを生成する（ステップ１１４）。次に、読み込んだ論理ブロックのヘッダ部分のオフセットを表すビット列ｂを読み込み（ステップ１１５）、ビット列ａとｂの論理和をとったビット列ｃを生成する（ステップ１１６）。ビット列ｃを読み込んだページの新しいオフセットデータとしてヘッダ部分に上書き書き込みし、データファイル１３２に反映させる。（ステップ１１７）。
【００５４】
バッファメモリ１２０上の次のレコードがあれば（ステップ１１８、Ｙｅｓ）、それを参照し、同様の処理を行う。次のレコードがなければ（ステップ１１８、Ｎｏ）、データ追加処理を終了する。
【００５５】
＜データ完全一致検索処理＞
図７は、本発明の第１の実施の形態におけるキー値による完全一致検索処理のフローチャートである。
【００５６】
まず、探索したいキー値がインタフェース１１０を介して入力される（ステップ２０１）。ファイル操作部１０３は、二次記憶装置１３０の索引ファイル１３１から探索キー値以上で最も値が小さいキー値を探し、その値が指すレコードを含む論理ブロックを読み込む（ステップ２０２）。次に、読み込んだ論理ブロック内のレコード部から二分探索を用いて探索キー値を持つレコードを探す（ステップ２０３）。
【００５７】
このとき、探索キー値を持つレコードが見つかったのであれば（ステップ２０４、Ｙｅｓ）、探索キー値を持つレコードを出力して終了する（ステップ２１１）。探索キー値が見つからなかった場合は（ステップ２０４、Ｎｏ）、別の論理ブロックにあるレコードを調べるため、読み込んだ論理ブロックのヘッダ部にあるオフセットデータのビット列を参照する（ステップ２０５）。その後、ビット列からビットが「１」となっている全てのビットについて、そのビット番号ＸをオフセットＸとし、この論理ブロックからＸブロック後ろの論理ブロックを読み込む（ステップ２０６）。読み込んだ論理ブロック内のレコード部から二分探索を用いて探索キーの値を持つレコードを探し（ステップ２０７）、レコードが見つかれば（ステップ２０８、Ｙｅｓ）それを出力して終了する。ビット列が持つ「１」となっているビットが指す全ての論理ブロックを参照し（ステップ２０９、Ｙｅｓ）、レコードが見つからなければ（ステップ２０８、Ｎｏ）、「探索キー値を持つレコードは無し」と出力し（ステップ２１０）、終了する。
【００５８】
＜データの範囲検索処理＞
図８、図９は、本発明の第１の実施の形態におけるキー値によるデータの範囲検索処理のフローチャートである。
【００５９】
まず、入力として下限キー値以上、上限キー値未満という検索条件が与えられると（ステップ３０１）、これらの下限キー値、上限キー値をメモリ（図示せず）に格納する。ファイル操作部１０３は、索引ファイル１３１から下限キー値以上で最も値が小さいキー値を探して、その値が指すレコードを含む論理ブロックをデータファイル１３２から読み込む（ステップ３０２）。このとき、読み込んだ論理ブロックのヘッダ部のオフセットを示すビット列を参照し、「１」となっているビットがあればそれが指す論理ブロックのアドレスを一時的にメモリ（図示せず）のアドレスの集合Ｕに記憶する（ステップ３０３）。
【００６０】
次に、ファイル操作部１０３は、論理ブロックのレコード部の先頭のレコードから順番にレコードのキー値が下限キー値以上かどうか調べていく（ステップ３０４）。下限キー値以上のレコードが見つかったら（ステップ３０５、Ｙｅｓ）、まず論理ブロック内で最大のキー値を持つ末尾のレコードを参照し、そのキー値が上限キー値以上かどうかを調べる（ステップ３０７）。このとき、上限キー値以上でなければ（ステップ３０７、Ｎｏ）、この論理ブロックの現在参照しているレコードから末尾のレコードまでの全てのレコードは検索条件を満たすとして、メモリ（図示せず）上の検索条件を満たすレコード集合Ｒ記憶手段に追加する（ステップ３０８）。
【００６１】
その後、ファイル操作部１０３は、データファイル１３２内に次の論理ブロックがあれば（ステップ３０９，Ｙｅｓ）、それを読み込み、同様の処理を行う（ステップ３１０）。
【００６２】
一方、論理ブロックがなければ（ステップ３０９、Ｎｏ）、データファイル１３２上の末尾の論理ブロックまで読み込んだこととなる。このとき、各論理ブロックのオフセットデータはその論理ブロックよりも後ろのブロックを指し示すものであるので、末尾の論理ブロックまで読み込んだ時点でアドレス集合Ｕが指し示す全ての論理ブロックについても、末尾の論理ブロックまで順に論理ブロックを読み込んでいく過程で探索が行われていることになる。よって、そこで、検索終了となり、メモリ（図示せず）に格納されているレコード集合Ｒを出力して終了する（ステップ３２３）。
【００６３】
末尾のレコードのキー値が上限キー値以上だった場合は（ステップ３０７、Ｙｅｓ）、参照しているレコードから末尾のレコードまで順番にキー値が上限値未満かどうかの比較を行っていく。もし、参照しているレコードのキー値が上限キー未満であれば（ステップ３１１、Ｙｅｓ）、そのレコードをメモリ（図示せず）上の検索条件を満たすレコード集合Ｒ記憶手段に追加する（ステップ３１２）。条件キー値未満でないレコードを見つけたら（ステップ３１１、Ｎｏ）、次はオフセットデータが指している論理ブロックのレコードについて検索を行う。
【００６４】
メモリ（図示せず）に格納されたアドレス集合Ｕが持つ全てのアドレスが参照されていないのならば（ステップ３１４、Ｎｏ）、まだ参照していないアドレスを参照し（ステップ３１５）、該アドレスが指す論理ブロックが探索済みであれば（ステップ３１６、Ｙｅｓ）、Ｕが持つ他のアドレスの論理ブロックを参照するため、ステップ３１４に移行する。
【００６５】
一方、該アドレスが指す論理ブロックがまだ探索済みでなければ（ステップ３１６、Ｎｏ）、該論理ブロックのレコード先頭のレコードを参照する（ステップ３１７）。参照しているレコードのキー値が下限キー値未満である場合は（ステップ３１８、Ｎｏ）、次のレコードを参照し（ステップ３１９）、ステップ３１８に移行する。参照しているレコードのキー値が下限キー値以上の場合は（ステップ３１８、Ｙｅｓ）、参照しているレコードのキー値が上限キー値未満かどうか判定し、上限キー値未満でなければ（ステップ３２０、Ｎｏ）、該論理ブロックの探索は終了したとして、他の論理ブロックのアドレスを参照するために、ステップ３１４に移行する。上限キー値未満であれば（ステップ３２０、Ｙｅｓ）、参照しているレコードを検索条件を満たすレコードとしてレコード集合Ｒに追加し（ステップ３２１）、次のレコードを参照し（ステップ３２２）、ステップ３２０に移行する。
【００６６】
アドレス集合Ｕが持つすべてのアドレスが指す論理ブロックの探索が終わったら（ステップ３１４、Ｙｅｓ）、検索終了となり、メモリ（図示せず）に格納されているレコード集合Ｒを出力して終了する（ステップ３２３）。
【００６７】
上記の図５〜図９に示したように、sparse indexを用いた索引付け方法であっても、オフセットデータを用いたデータ構造を利用してデータ書き込みを行うことで、順序逆転が起こるようなデータに対する完全一致検索及び範囲検索処理を可能としている。
【００６８】
［第２の実施の形態］
前述の第１の実施の形態では、オフセットデータをデータファイルに格納する場合を示したが、本実施の形態では、オフセットデータをデータファイルとは別のファイルであるオフセットファイルに格納する場合について説明する。
【００６９】
図１０は、本発明の第２の実施の形態におけるデータ蓄積装置の構成を示す。
【００７０】
同図に示すデータ蓄積装置は、図３に示す装置構成とは二次記憶装置内のファイル構成が異なり、本実施の形態では、索引ファイル２３１、データファイル２３２、及びオフセットデータを含むオフセットファイル２３３から構成される。他の構成については、図３の構成と同様である。なお、同図では、データ蓄積装置として説明するが、システム制御部２００は後述するように、データ検索時には検索機能を有する。
【００７１】
図１１は、本発明の第２の実施の形態におけるデータ構成を示す。
【００７２】
データファイル２３２の各論理ブロックは入力されたレコードのみから構成される。
【００７３】
オフセットファイル２３３の各レコードは、データファイル２３２の各論理ブロックに対応しており、キー値とビット列長ｈのオフセットデータから構成される。オフセットファイルのキー値はデータファイル２３２の論理ブロックとオフセットファイル２３３のオフセットデータとを１対１で対応付けるために用いる。オフセットデータのビット列によるオフセット数の表示方法は、第１の実施の形態と同様にビット列のビット番号を用いて行う。
【００７４】
＜データ追加処理＞
図１２、１３は、本発明の第２の実施の形態におけるデータ追加処理のフローチャートである。
【００７５】
データ追加処理では、システム制御部２００の入力データ解析部２０１が書き込み要求であると判定すると、メモリ管理部２０２を介してバッファメモリ１２０上に蓄積する（ステップ４０１）。このとき、入力レコードが論理ブロックサイズ分だけ蓄積されるまで入力レコードをバッファメモリ１２０に蓄積し続ける。
【００７６】
入力レコードがバッファメモリ１２０内に論理ブロックサイズ分だけ蓄積されたならば（ステップ４０２、Ｙｅｓ）、メモリ管理部２０２は、バッファメモリ１２０内のレコードをキー値について昇順にソートする（ステップ４０３）。その後、ファイル操作部２０３は、バッファメモリ１２０内のレコードを読み出し、当該レコードを二次記憶装置２３０のデータファイル２３２に書き込み、当該論理ブロックのアドレスをメモリ（図示せず）に格納する（ステップ４０４）。
【００７７】
次に、ファイル操作部２０３は、索引ファイル２３１を参照して当該索引ファイル２３１内の最大のキー値を探し、その値をステップ４０４で書き込んだ論理ブロックで扱うキー値の下限値Ｌとして一時的にメモリ（図示せず）に記憶する（ステップ４０５）。その後、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイル２３１を更新する（ステップ４０６）。
【００７８】
さらに、ファイル操作部２０３は、データファイル２３２に書き込んだ論理ブロック内で最大のキー値をキー値、初期値として全ビットを「０」にしたビット列をオフセットデータとしてそのレコードをオフセットファイル２３３に書き込む（ステップ４０７）。
【００７９】
ファイル操作部２０３は、バッファメモリ１２０内の先頭のレコードを参照し（ステップ４０８）、参照中のレコードのキー値が、ステップ４０５でメモリ（図示せず）に格納されている下限値Ｌ以下であるかを判定し、Ｌより大きければ（ステップ４０９、Ｎｏ）、処理を終了し、Ｌ以下であれば（ステップ４０９、Ｙｅｓ）、索引ファイル２３１において参照中のレコードのキー値以上で最も値が小さいキー値を探す（ステップ４１０）。
【００８０】
ファイル操作部２０３は、探索したキー値が更新済みであるかを判定し、更新済みであれば（ステップ４１１、Ｙｅｓ）、バッファメモリ１２０上に次のレコードが存在するかを判定し、存在する場合は（ステップ４２０、Ｙｅｓ）、バッファメモリ１２０上の次のレコードを参照し（ステップ４２１）、ステップ４０９の処理に移行する。一方、更新済みでない場合は（ステップ４１１、Ｎｏ）、探索した索引キー値を更新済みとして一時的にメモリ（図示せず）に記憶する（ステップ４１２）。索引のキー値が指すレコードを含む論理ブロックをデータファイル２３２から読み込み、当該論理ブロックのアドレスをメモリ（図示せず）に格納する（ステップ４１３）。
【００８１】
次に、メモリ（図示せず）から、読み込んだ論理ブロックのアドレスと書き込んだ論理ブロックのアドレスを取得し、読み込んだ論理ブロックと書き込んだ論理ブロックのアドレスを比較し、ブロック数がいくつ離れているかを算出し、その値をオフセットＸとし（ステップ４１４）、Ｘ番目のビットのみ「１」とした桁数ｈのビット列ａを生成する（ステップ４１５）。
【００８２】
ファイル操作部２０３は、索引のキー値に基づいてデータファイル２３２から読み込んだ論理ブロックに対応したオフセットデータをオフセットファイル２３３から探索して取得し（ステップ４１６）、探索したオフセットデータのビット列ｂを読み込む（ステップ４１７）。ステップ４１５で生成されたビット列ａとステップ４１７で読み込まれたビット列ｂのＯＲをとったビット列ｃを生成する（ステップ４１８）。当該ビット列ｃを、読み込んだオフセットデータファイル２３３のオフセットデータ上に上書きする（ステップ４１９）。
【００８３】
バッファメモリ１２０上に次のレコードが存在する場合は（ステップ４２０、Ｙｅｓ）、バッファメモリ１２０上の次のレコードを参照し、ステップ４０８に移行する（ステップ４２１）。次のレコードが存在しない場合は（ステップ４２０、Ｎｏ）、処理を終了する。
【００８４】
本実施の形態のデータ追加処理において、第１の実施の形態における図５のデータ追加処理との違いは、オフセットファイル２３３にキー値、オフセットデータというレコードの形でデータを書き込むこと（ステップ４０４）と、データファイル２３２の論理ブロックに対応したオフセットデータを参照するために、データファイル２３２の論理ブロックのキー値を元にオフセットファイル２３３からオフセットデータを探索する必要があることである（ステップ４１６）。
【００８５】
＜データ完全一致検索処理＞
図１４は、本発明の第２の実施の形態におけるキー値による完全一致検索処理のフローチャートである。
【００８６】
まず、探索したい探索キーのキー値がインタフェース１１０を介して入力される（ステップ５０１）。ファイル操作部２０３は、二次記憶装置２３０の索引ファイル２３１から探索キー値以上で最も値が小さいキー値を探し、その値をメモリ（図示せず）に一時的に格納し、その値が指すレコードを含む論理ブロックをデータファイル２３２から読み込む（ステップ５０２）。次に、二分探索を用いて読み込んだ論理ブロック内のレコード部から探索キー値を持つレコードを探す（ステップ５０３）。
【００８７】
このとき、探索キー値を持つレコードが見つかったのであれば（ステップ５０４、Ｙｅｓ）、探索キー値を持つレコードを出力して終了する（ステップ５１２）。探索キー値が見つからなかった場合は（ステップ５０４、Ｎｏ）、ステップ５０２でメモリ（図示せず）に格納されている索引ファイル２３１のキー値に基づいてオフセットファイル２３３から読み込んだ論理ブロックに対応したオフセットデータを探索し（ステップ５０５）、探索したオフセットデータのビット列を参照する（ステップ５０６）。このとき、ビット列においてまだチェックしていない「１」となっているビットの番号ＸをオフセットＸとし、Ｘブロック後ろの論理ブロックをデータファイル２３２から読み込む（ステップ５０７）。
【００８８】
データファイル２３２から読み込んだ論理ブロック内のレコード部から二分探索を用いて探索キー値を持つレコードを探し（ステップ５０８）、探索キー値を持つレコードが見つかった場合は（ステップ５０９、Ｙｅｓ）、探索キー値を持つレコードを出力する（ステップ５１２）。一方、レコードが見つからない場合は（ステップ５０９、Ｎｏ）、ビット列が持つビットが「１」となっている全ての桁を参照したかを判定し、全ての桁を参照していれば（ステップ５１０、Ｙｅｓ）、探索キーを持つレコードが無いことを出力して終了する（ステップ５１１）。すべての桁を参照していない場合は（ステップ５１０、Ｎｏ）、ステップ５０７に移行する。
【００８９】
本実施の形態のデータの完全一致検索処理において、第１の実施の形態における図７のキー値によるデータの完全一致検索処理との違いは、図５と図１２との違いと同様に、オフセットデータを参照する際にキー値を用いてオフセットファイル２３３からオフセットデータを探索する（ステップ５０５）必要があることである。
【００９０】
＜範囲検索処理＞
図１５、１６は、本発明の第２の実施の形態におけるキー値による範囲検索処理のフローチャートである。
【００９１】
まず、入力として下限キー値以上、上限キー値未満という検索条件が与えられると、下限キー値、上限キー値をメモリ（図示せず）に格納し（ステップ６０１）、ファイル操作部２０３は、索引ファイル２３１から下限キー値以上で最も値が小さいキー値を探して、その値が指すレコードを含む論理ブロックをデータファイル２３２から読み込む（ステップ６０２）。このとき、読み込んだ論理ブロックの末尾のレコードを参照し、そのレコードのキー値を元に論理ブロックに対応したオフセットデータをオフセットファイル２３３から探索する（ステップ６０３）。
【００９２】
探索したオフセットデータのビット列を参照し、「１」となっているビットがあれば、それが指す論理ブロックのアドレスを一時的にメモリ（図示せず）のアドレスの集合Ｕに記憶する（ステップ６０４）。
【００９３】
次に、ファイル操作部２０３は、データファイル２３２から読み込んだ論理ブロックのレコード部の先頭のレコードを参照し（ステップ６０５）、当該参照しているレコードのキー値が下限キー値未満である場合は（ステップ６０６、Ｎｏ）、次のレコードを参照し（ステップ６０７）、同様の処理を行う（ステップ６０６）。一方、当該参照しているレコードのキー値が下限キー値以上であり（ステップ６０６、Ｙｅｓ）、論理ブロック末尾のレコードのキー値が上限キー値未満の場合は（ステップ６０８、Ｎｏ）、参照しているレコードから末尾までのレコードを、メモリ（図示せず）上の検索条件を満たすレコード集合Ｒに追加する（ステップ６０９）。次の論理ブロックが存在する場合は（ステップ６１０、Ｙｅｓ）、次の論理ブロックをデータファイル２３２から読み込んでステップ６０３に移行する（ステップ６１１）。
【００９４】
一方、ステップ６０８において、論理ブロックの末尾のレコードのキー値が上限値以上である場合は（ステップ６０８、Ｙｅｓ）、参照しているレコードのキー値が上限キー値未満であるかを判定し、そうである場合は（ステップ６１２、Ｙｅｓ）、参照しているレコードをメモリ（図示せず）上の検索条件を満たすレコード集合Ｒに追加し（ステップ６１３）、次のレコードを参照し（ステップ６１４）、ステップ６１２に移行する。
【００９５】
ステップ６１２において参照しているレコードのキー値が上限値以上である場合は（ステップ６１２、Ｎｏ）、アドレスの集合Ｕが持つすべてのアドレスを参照したかを判定し、参照した場合は（ステップ６１５、Ｙｅｓ）、レコード集合Ｒの内容を出力して終了する（ステップ６２４）。アドレスの集合Ｕにまだ参照していないアドレスがある場合は（ステップ６１５、Ｎｏ）、まだ、参照していないＵが持つ論理ブロックのアドレスを参照し（ステップ６１６）、参照したアドレスの論理ブロックが既に探索済みであるかを判定する。
【００９６】
参照したアドレスの論理ブロックがすでに探索済みの場合は（ステップ６１７、Ｙｅｓ）、Ｕが持つ他のアドレスの論理ブロックを参照するため、ステップ６１５に移行する。
【００９７】
一方、参照したアドレスの論理ブロックがまだ探索されていない場合は（ステップ６１７、Ｎｏ）、論理ブロックをデータファイル２３２から読み込みレコード部の先頭のレコードを参照する（ステップ６１８）。参照しているレコードのキー値が下限キー値未満である場合は（ステップ６１９、Ｎｏ）、次のレコードを参照し（ステップ６２０）、ステップ６１９に移行する。参照しているレコードのキー値が下限キー値以上の場合は（ステップ６１９、Ｙｅｓ）、参照しているレコードのキー値が上限キー値未満かどうか判定し、上限キー値未満で無ければ（ステップ６２１、Ｎｏ）、該論理ブロックの探索は終了したとして、他の論理ブロックのアドレスを参照するために、ステップ６１５に移行する。上限キー値未満であれば（ステップ６２１、Ｙｅｓ）、参照しているレコードを検索条件を満たすレコードとしてレコード集合Ｒに追加し（ステップ６２２）、次のレコードを参照し（ステップ６２３）、ステップ６２１に移行する。
【００９８】
本実施の形態の範囲検索処理において、第１の実施の形態における図８、図９との違いは、図８と図１４の違いと同様に、オフセットデータを参照する際にキー値を用いてオフセットファイル２３３からオフセットデータを探索する必要があることである。
【００９９】
第２の実施の形態の第１の実施の形態に対するメリットは、データファイル２３２の論理ブロックのレコード部を参照する際に、ヘッダ部を読み飛ばす必要がないことと、オフセットファイル２３３にはオフセットデータが纏めて格納されているため、オフセットデータをまとめてメモリ上に置いておくことができ、これによりオフセットデータの更新による二次記憶装置２３０へのアクセス回数を減らすことができることである。
【０１００】
なお、第２の実施の形態においては、データ追加処理時に、「論理ブロック内での最大のキー値をキー値、初期値として全ビットを「０」にしたビット列をオフセットデータとしてレコードをオフセットファイル２３３に書き込む」処理を省略することも可能である。
【０１０１】
この場合、後から入力されたレコードに順序逆転があり、オフセットとしてビットを１にする必要が生じた場合にのみオフセットファイルを更新すればよいため、二次記憶装置２３０へのアクセス回数をより減らすことができる。また、オフセットファイルのサイズも小さくなるため、オフセットデータの探索効率の向上も見込める。
【０１０２】
なお、上記のデータ蓄積装置（データ検索装置）の各構成要素をプログラムとして構築し、データ蓄積装置（データ検索装置）として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
【０１０３】
また、構築されたプログラムをハードディスクや、フレキシブルディスク・ＣＤ−ＲＯＭ等の可搬記憶媒体に格納し、コンピュータにインストールする、または、配布することが可能である。
【０１０４】
なお、本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において種々変更・応用が可能である。
【符号の説明】
【０１０５】
１００  システム制御手段、システム制御部
１０１  入力データ解析部
１０２  メモリ管理部
１０３  ファイル操作部
１１０  インタフェース
１２０  バッファメモリ
１３０  二次記憶装置
１３１  索引ファイル
１３２  データファイル（オフセットデータを含む）
２００  システム制御部
２０１  入力データ解析部
２０２  メモリ管理部
２０３  ファイル操作部
２３０  二次記憶装置
２３１  索引ファイル
２３２  データファイル
２３３  オフセットファイル
【図１】
2011165000.tif 000003
【図２】
2011165000.tif 000004
【図３】
2011165000.tif 000005
【図４】
2011165000.tif 000006
【図５】
2011165000.tif 000007
【図６】
2011165000.tif 000008
【図７】
2011165000.tif 000009
【図８】
2011165000.tif 000010
【図９】
2011165000.tif 000011
【図１０】
2011165000.tif 000012
【図１１】
2011165000.tif 000013
【図１２】
2011165000.tif 000014
【図１３】
2011165000.tif 000015
【図１４】
2011165000.tif 000016
【図１５】
2011165000.tif 000017
【図１６】
2011165000.tif 000018