(57)【要約】【課題】繰り返し値を有するテーブルのブロック圧縮のための、コンピュータプログラム製品を含む方法および装置を提供する。【解決手段】繰り返し値を連続させるために圧縮されたデータの列を表わす値識別子が整列され、ブロック辞書が生成される。ブロック辞書は値識別子の各ブロックについて生成される。各ブロック辞書はブロック識別子のリストを含み、各ブロック識別子は値識別子と対応付けされ、ブロック内の各々のユニークな値についてブロック識別子が存在する。ブロックは基準のサイズを有し、ブロック辞書は複数のブロックについて再使用される。【選択図】図１０
2008287723.tif 000002
【特許請求の範囲】
【請求項１】
データ処理装置に動作を実行させるコンピュータプログラムであって、
前記動作は、
辞書を基にした圧縮によりデータの列を圧縮する処理を含み、前記圧縮する処理は値識別子の列を生成する処理を含み、前記値識別子の各々は前記データの列内のユニークな値を表わし、
前記値識別子を整列する処理と、
前記値識別子の各ブロックについてブロック識別子の第１リストを生成する処理とをさらに含み、前記第１リストを生成する処理は、ブロック内の各々のユニークな値識別子についてユニークなブロック識別子を取得する処理と、同一の値識別子について同一のブロック識別子を取得する処理とを含み、
前記動作は、
ブロック辞書の列を生成する処理をさらに含み、前記ブロック辞書の列を生成する処理は、各ブロックについてブロック辞書を生成する処理を含み、
前記ブロック辞書は、
ブロック識別子の第２リストを含み、各ブロック識別子は値識別子と対応付けされ、前記第２リスト内のブロック識別子の各々のユニークな値について前記ブロック辞書内に存在するブロック識別子をさらに含み、
前記動作は、
ブロックのオフセットの列を生成する処理をさらに含み、前記ブロックのオフセットの列の各値は前記ブロック辞書の列内でブロックが開始するオフセットを示すコンピュータプログラム。
【請求項２】
前記値識別子は、テーブルの同一の行にわたってデータの依存関係を有する構造化ビジネスデータを表わす値である請求項１に記載のコンピュータプログラム。
【請求項３】
前記ビジネスデータは、結合されたテーブルの集合としてモデル化されたビジネスオブジェクトを含む請求項２に記載のコンピュータプログラム。
【請求項４】
前記動作は複数のハードウェアサーバ上で並列に実行される請求項１に記載のコンピュータプログラム。
【請求項５】
前記データの列への変更は、前記データの列から分離された差分バッファ内に記憶され、前記変更は非同期に統合される請求項１に記載のコンピュータプログラム。
【請求項６】
前記動作は、前記ブロック辞書における検索を可能とするために、前記ブロック辞書の列および前記ブロックのオフセットの列を記憶する処理をさらに含む請求項１に記載のコンピュータプログラム。
【請求項７】
前記値識別子の各ブロックのサイズは固定された行の数である請求項１に記載のコンピュータプログラム。
【請求項８】
前記動作は、構造化データのテーブル内の他の列とともに前記データの列を整列する処理をさらに含み、
前記データの列を整列する処理は、
値識別子のグループを生成するように前記データの列を整列する処理と、
前の列に基づいて続く列のブロックを選択的に整列する処理とを含み、前の列のブロックが１つの同一の値識別子を有するならば、続く列のブロックが整列される請求項１に記載のコンピュータプログラム。
【請求項９】
ブロック識別子は、前記第１リスト内の前記値識別子の各々について割り当てられ、前記第１リスト内の前記ブロック識別子の順序付けは、前記値識別子の順序付けに合致し、前記第１リスト内の前記ブロック識別子は、各ブロックについて開始する番号付けされた系列を含み、各ブロック辞書は、各ブロック辞書についてブロック識別子を表わすために最小のビット長が使用されるように２進数符号化により圧縮され、各ブロック辞書について、ブロック識別子の各々のユニークな値についてブロック識別子が１回のみ存在する請求項１に記載のコンピュータプログラム。
【請求項１０】
コンピュータ実装される方法であって、
辞書を基にした圧縮によりデータの列を圧縮する過程を有し、前記圧縮する過程は値識別子の列を生成する過程を有し、前記値識別子の各々は前記データの列内のユニークな値を表わし、
前記方法は、
前記値識別子を整列する過程と、
前記値識別子の各ブロックについてブロック識別子の第１リストを生成する過程とをさらに有し、前記第１リストを生成する過程は、ブロック内の各々のユニークな値識別子についてユニークなブロック識別子を取得する過程と、同一の値識別子について同一のブロック識別子を取得する過程とを有し、
前記方法は、
ブロック辞書の列を生成する過程をさらに有し、前記ブロック辞書の列を生成する過程は、各ブロックについてブロック辞書を生成する過程をさらに有し、
前記ブロック辞書は、
ブロック識別子の第２リストを含み、各ブロック識別子は値識別子と対応付けされ、前記第２リスト内のブロック識別子の各々のユニークな値について前記ブロック辞書内に存在するブロック識別子をさらに含み、
前記方法は、
ブロックのオフセットの列を生成する過程をさらに有し、前記ブロックのオフセットの列の各値は前記ブロック辞書の列内でブロックが開始するオフセットを示す方法。
【請求項１１】
前記値識別子は、テーブルの同一の行にわたってデータの依存関係を有する構造化ビジネスデータを表わす値である請求項１０に記載の方法。
【請求項１２】
前記データの列への変更は、前記データの列から分離された差分バッファ内に記憶され、前記変更は非同期に統合される請求項１０に記載の方法。
【請求項１３】
前記ブロック辞書における検索を可能とするために、前記ブロック辞書の列および前記ブロックのオフセットの列を記憶する過程をさらに有する請求項１０に記載の方法。
【請求項１４】
前記方法は、構造化データのテーブル内の他の列とともに前記データの列を整列する過程をさらに含み、
前記データの列を整列する過程は、
値識別子のグループを生成するために前記データの列を整列する過程と、
前の列に基づいて続く列のブロックを選択的に整列する過程とを含み、前の列のブロックが１つの同一の値識別子を有するならば、続く列のブロックが整列される請求項１０に記載の方法。
【請求項１５】
データ処理装置に動作を実行させるコンピュータプログラムであって、
前記動作は、
データの圧縮された列を表わす値識別子を整列する処理と、
複数のブロック辞書を生成する処理とを含み、前記ブロック辞書は、前記値識別子の複数のブロックの各々についての存在し、
前記ブロック辞書の各々は、ブロック識別子のリストを含み、各ブロック識別子は値識別子と対応付けされ、ブロック内の各々のユニークな値について存在するブロック識別子をさらに含むコンピュータプログラム。
【請求項１６】
前記動作は、辞書を基にした圧縮により前記データの列を圧縮する処理をさらに含み、前記圧縮する処理は前記値識別子の列を生成する処理を含み、前記値識別子の各々は前記データの列内のユニークな値を表わす請求項１５に記載のコンピュータプログラム。
【請求項１７】
前記動作は、前記ブロック辞書における検索を可能とするために、前記ブロック辞書を記憶する処理をさらに含む請求項１５に記載のコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この開示はデジタルコンピュータによるデータ処理に関し、より詳しくは、繰り返し値を有するテーブルのブロック圧縮に関する。
【背景技術】
【０００２】
検索エンジンは、結果を見つけるために関係テーブルのようなデータベーステーブル内の大量のデータを検索する。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
数百万のレコードを含むテーブルの結合のような膨大な量のデータのために、データ処理はたくさんのハードウェア資源を必要とする。例えば、ユーザ要求の実行に関係する全てのレコードを記憶するために大量のランダムアクセスメモリ領域が必要とされる。
【課題を解決するための手段】
【０００４】
ここで開示される発明は、繰り返し値を有するテーブルのブロック圧縮に関する技術を実現する、コンピュータプログラム製品を含む方法および装置を提供する。
【０００５】
一態様において、値識別子の列を生成するために辞書を基にした圧縮によりデータの列が圧縮され、値識別子は整列され、ブロック識別子のリストが生成され、ブロック辞書の列が生成され、ブロックのオフセットの列が生成される。値識別子の各ブロックについて、各々のユニークな値識別子についてユニークなブロック識別子が存在し、同一の値識別子について同一のブロック識別子が存在する。各ブロック辞書についてブロック識別子のリストが存在し、各ブロック識別子は値識別子と対応付けされ、ブロック識別子の各々のユニークな値についてブロック辞書内に存在するブロック識別子が存在する。ブロックのオフセットの列の各々の値は、ブロック辞書の列においてブロックが開始するオフセットを示す。
【０００６】
関係する態様において、圧縮されたデータの列を表わす値識別子が整列され、ブロック辞書が生成される。ブロック辞書は値識別子の各ブロックについて生成される。ブロック辞書の各々はブロック識別子のリストを含み、各ブロック識別子は値識別子と対応付けされ、ブロック内の各々のユニークな値についてブロック識別子が存在する。
【０００７】
本発明は、例えば、コンピュータプログラム製品（例えば、コンピュータ読み取り可能な媒体に有形に実現されたソースコードまたはコンパイルされたコード）、コンピュータ実装される方法、および、システムとして実現されうる。
【０００８】
変形は、次の特徴のうち１つまたは複数を含みうる。
値識別子は、テーブルの同一の行にわたってデータの依存関係を有する構造化ビジネスデータを表わす値としうる。ビジネスデータは、結合されたテーブルの集合としてモデル化されたビジネスオブジェクトを含みうる。
ブロック辞書、ブロックベクトル等は、複数のハードウェアサーバ上で並列に生成されうる。
データの列への変更は、データの列から分離された差分バッファ内に記憶され、変更は非同期に統合されうる。
ブロック辞書、（例えば、ブロックベクトルまたはブロックベクトルの列内の）ブロック識別子、ブロックのオフセット値は記憶され、ブロック辞書における検索が可能とされうる。
値識別子の各ブロックのサイズは固定された行の数でありうる。
データの列は、構造化データのテーブル内の他の列とともに整列されうる。整列は、値識別子のグループを生成するようにデータの列を整列する処理と、前の列に基づいて続く列のブロックを選択的に整列する処理とを含みうる。前の列のブロックが１つの同一の値識別子を有するならば、続く列のブロックが整列される。
ブロック識別子は、値識別子の各々について割り当てられうる。ブロック識別子の順序付けは、値識別子の順序付けに合致しうる。ブロック識別子は、各ブロックについて開始する番号付けされた系列を含みうる。各ブロック辞書についてブロック識別子を表わすために最小のビット長が使用されるように、各ブロック辞書が２進数符号化により圧縮されうる。各ブロック辞書について、ブロック識別子の各々のユニークな値についてブロック識別子が１回のみ存在しうる。
【発明の効果】
【０００９】
ここで説明される発明は、次の効果のうち１つまたは複数を実現するように実装することができる。大量のデータを含む関係テーブルのような大量のデータベースのデータの効果的な処理は、設置されたメモリ（例えば、揮発性メモリ）内、または、ディスク記憶装置上にデータボリュームを保持するために、および、（例えば、ハードディスクドライブからメモリへ）データを移動するときの効果的なデータフローのために、高レベルのデータ圧縮を要求しうる。減少されたデータボリュームはより少ない設置されたメインメモリまたはハードディスクの容量を必要とし、減少されたデータフローはプロセッサのキャッシュ、プロセッサのアーキテクチャ、ネットワークの帯域幅において、より少ない需要を生じうるので、情報処理ハードウェアの状況において複数の効果を有しうる。これら全ては、ハードウェアの要求条件、応答時間、全体のシステム性能における有益な効果を有しうる。データのかなりの圧縮がコスト効果の高いデータのメモリ内の処理を可能とする（サーバ数または物理メモリ量が減少されうる）ので、ビジネスデータのようなデータはメモリ内で圧縮および検索されうる。ブロック識別子のベクトル、および、データの列の１つまたは複数のブロックについての圧縮されたブロック辞書を生成することによって圧縮を実現しうる。好ましくは、ブロック辞書およびブロック内の値の出現を表わすベクトルの組み合わせによって圧縮された方法で、複数の頻繁に出現するデータの列の値が表わされうる。ブロック辞書によって占有される領域を最小化するため、ブロック辞書内のブロック識別子を符号化するために最小のビット数が使用されうる。ブロック辞書のメモリ消費を減少させるためにデータの複数のブロックにわたってブロック辞書が再使用されうる。複数のデータの列はブロック辞書およびフロック識別子のベクトルを使用して圧縮されうる。構造化データのために、データの依存関係が存在する他のデータの列に基づいてデータの列を整列することによって、データの依存関係が維持されうる。
【発明を実施するための最良の形態】
【００１０】
添付図面および以下の説明において１つまたは複数の実施形態の詳細を述べる。さらなる特徴、態様、効果は、発明の詳細な説明、図面、特許請求の範囲から明らかになる。
各図面における同様な参照符号および記号は同様の構成要素を示す。
【００１１】
概して、図１〜１０において、辞書を基にした圧縮、ビットベクトル圧縮（またはベクトルを基にした圧縮）、整列ビットベクトル圧縮（または短縮ベクトルを基にした圧縮）、ブロックベクトル圧縮と呼ばれる技術の組み合わせを使用してデータが圧縮される。データは構造化ビジネスデータとすることが可能であり、ここで、データはテーブルのようなデータ構造に組織化された属性またはキー数値（key figure）とすることが可能であり、属性またはキー数値は依存関係を有することが可能である、という意味でデータは構造化されている。例えば、情報のテーブルにおいて、行は行内のデータの間で依存関係を有し、行の各列内のデータは行の他の列内の他のデータと対応付けされている。テーブル内のある行内のようなデータ構造の一部の中で、または、全データ構造にわたって、数千または数百万の行にわたって、非常に多くの場合、ヌル（null）のデータ値のような特別な値が実例とされうるという意味で、データは疎な分布を形成しうる。例えば、２０００万のエントリを有するデータの列は１９００万のヌルのエントリを含み、１９００万のヌルのエントリは必ずしも近接していない様々な行内に位置しうる。
【００１２】
図１Ａは、構造化データのテーブル１０５、そのテーブルの列についての辞書１１０、属性テーブル１１５、インデックス１２０を表わすブロック図である。概して、図１Ａは、テーブル１０５内の列１２５に、列１２５内の値について値識別子１３０（ValueId）を指定する辞書１１０、それぞれの文書識別子１４０（DocID）について値識別子１３５を列挙する属性テーブル１１５、それぞれの値識別子１５０について文書識別子リスト（DocIDList）１４５を列挙するインデックス１２０がどのように設けられるかを表わす。
【００１３】
辞書１１０は、辞書を基にした圧縮と呼ぶものを提供するために使用され、辞書を基にした圧縮は、より少ないメモリを占める識別子を用いてテーブル内の値を表わすことによって、テーブル内に記憶されるデータ量を削減するために辞書１１０を使用することを含む。概して、辞書１１０は、整列されうる、列内に現れる値およびその値の識別子（すなわち、値識別子）のリストである。
【００１４】
一例として、辞書を基にした圧縮によってデータテーブルからの列によって占有されるメモリまたはディスク領域を削減するために、列内に現れる異なる値の整列されたリストが生成され、その異なる値は番号が付けられる。（例えば、値それ自体を表わす文字列ではなく整数として実現される）番号は、値が現れるテーブル内の値の位置保持記号として使用される。値を表わすために必要な最大の番号が留意される。列の基数（cardinality）Ｃがその中に現れる異なる値の数であるように定義され、かつ、列の全体の長さがＮならば、Ｃの値がＮよりずっと小さい場合、辞書を基にした圧縮は、テーブル内の値を記憶するのとは異なり削減されたメモリ消費のような利益をもたらす。整列されたＣの値のリストは辞書と呼ばれ、これらの値が、例えば、ユーザに読み取り可能な結果を返却することが決定される必要があってもなくても、テーブル内に現れる番号の値を検索するために使用される。
【００１５】
例えば、テーブル１０５は列１２５を含み、列１２５はINTEL、ABB、HPのような値を有する。辞書１１０は値識別子１３０を含み、値識別子１３０は列１２５内に存在する異なる値を表わす。例えば、属性テーブル１１５は列１２５の各行についての値識別子を含む。例えば、第１行１６０は文書識別子１（“DocID 1”）と呼ばれ、値INTELと対応付けされた値識別子４を有する辞書１１０に基づいて、値識別子４を用いて属性テーブル１１５内に表わされる値INTELを含む。テーブル１０５の列１２５の値は、属性テーブル１１５の値識別子と置換することが可能であり、これは列１２５によって表わされるデータのメモリ領域を減少させる。新たなテーブル内の値識別子は、辞書１１０とともに、列１２５の値に再構成するために使用される。
【００１６】
値の検索を容易にし、従って、クエリーの実行のためにより適合した形式で列の内容を表現するために、インデックス１２０が生成され、そのインデックスは列１２５を置換する。インデックス１２０は、それらの値識別子によって組織化された列１２５の行のリストのテーブルである。例えば、１つのリスト１５５は、第４の値識別子が列１２５の行１、４、８と対応付けされていることを示す。
【００１７】
テーブルのメモリへの影響の一例として、図１Ａのテーブル１０５のようなテーブルＴ内の行数は1,000,000であるＮに等しく、各行を符号化するために必要とされるバイト数は500であり、ここで500バイトは4,000ビットに等しく、４キロバイトに等しい。圧縮なしで、テーブルＴは1,000,000×500バイトの領域を必要とし、これは500メガバイトのメモリ領域に等しく、１秒でテーブルＴを移動するために必要とされる帯域幅は４ギガバイト／秒である。
【００１８】
データがどのように組織化されるかの一例として、テーブルＴの列Ａ内の異なる値の数は、250であるＡの基数Ｃに等しい。この例において、列Ａについての辞書は0から250の整数によって番号付けされたＣの値のリストである。250までの整数の２進数表現は、（2の8乗が256に等しいので）１バイトである８ビットを必要とする。列Ａと同様の10個の列からなる例示のテーブルＴについて、任意の列内の平均の圧縮されていない列のエントリは50バイトを占める（500バイトが10個の列に分割されて列あたり50バイトである）。列Ａについての辞書は約100キロビットを必要とする（250のエントリ×（１個の１バイトの値識別子＋辞書のエントリ内の対応する値を表わす50バイト）が約12キロバイトであることから、約100キロビットである）。従って、辞書を基にした圧縮を使用して、列Ａは1,000,000バイトを占め、これは辞書を基にした圧縮を使用して列Ａによって必要とされる約1.01メガバイトである合計の領域（圧縮された列＋対応する辞書の領域）を有する約１メガバイトであるが、圧縮なしで列Ａによって占有される名目上の領域は50メガバイトである。従って、圧縮率は約50である。
【００１９】
図１Ｂは、構造化データのテーブル１７０、そのテーブルの列についての辞書１７２、属性テーブル１７４、差分インデックス（delta index）１７６を表わすブロック図である。概して、図１Ｂのブロック図の特徴は、図１Ａの特徴と同様に作用する。例えば、テーブル１０５、１７０の両方は、上述した図１Ａ、１Ｂのそれぞれの辞書１１０、１７２を使用して辞書を基にした圧縮を用いて圧縮されたレコードを記憶する。
【００２０】
図１Ａのブロック図と異なり、図１Ｂのブロック図は差分インデックス１７６を含み、これは列のデータへの追加、修正、削除を含む変更を記憶するために使用される。特に、差分インデックス１７６は、圧縮された列内のデータへの変更の結果を含む。差分インデックス１７６の辞書の値は、典型的な差分インデックスの場合には、時系列順に順序付けされる。時系列順の順序は、示された文書識別子との差分インデックス１７６内の値の対応付けによって示されるように、時間にわたってデータに行われる変更の順序付けを反映する。例えば、値識別子３と対応付けされた文書識別子１、４、８のリスト１７８は、文書識別子１が文書識別子４の前に追加され、文書識別子４が文書識別子８の前に追加されたことを示す。差分インデックス１７６の辞書の値の時系列順の順序付けは、前のエントリの修正なしで差分の書き込みを効果的に可能とする。
【００２１】
図１Ｂのテーブル１７０は、図１Ａのテーブル１０５への変更または差分を反映する。例えば、差分インデックス１７６に対応するテーブル１７０の各行は、メインインデックス（main index）１２０に対応するテーブル１０５に追加する行を表わす。もう１つの例として、テーブル１７０内の行がテーブル１０５の行と同一のレコード識別子を有する場合、差分インデックス１７６に対応するテーブル１７０内の行は、テーブル１０５内の行の置換を表わす。もう１つの例として、テーブル１７０内の行は、テーブル１０５内の同一のレコード識別子を有する行の間の差（例えば、同一のレコードの様々な列内の値における正または負の差分）を表わす。
【００２２】
差分インデックス１７６の実装は異なりうる。例えば、図１Ｂは、差分値の辞書を基にした圧縮を含むものとして差分インデックス１７６を表わすが、その通りである必要はない。
【００２３】
図１Ｃは、メインおよび差分インデックスからの結果の集合の生成を表わす例である。例えば、差分インデックス１７６は、（例えば、図１Ａのメインインデックス１２０のような）圧縮された列のデータのインデックスとともに使用され、差分インデックス１７６はインデックス内のデータへの変更を記憶する。（例えば、差分バッファを参照して以下で説明するように、）差分インデックス１７６および圧縮された列のデータのインデックスの両方が検索され、２つの情報源からの結果は、圧縮されたデータに行われる変更を反映する合成された結果を生成するために結合される。
【００２４】
この例において、（“IBM”とラベルが付された）会社についての総売上は、メインインデックスから総売上を見つけ出し、それを差分インデックスからの総売上を用いて増加させることによって計算される。特に、コマンド１８０“RETURN TOTAL REVENUE FOR IBM SALES”（IBMの販売について総売上を返答せよ）は、サーバプログラムによって２つの操作に分割され、２つの操作は、メインインデックスからのIBMについての売上についての第１操作１８２（図１Ａの行５および６は、メインインデックス内の“IBM”について、３の値識別子に対応し、11ユーロの総売上を有する）と、差分インデックスからのIBMについての売上についての第２操作１８４（図１Ｂの行５および６は、差分インデックス内の“IBM”について、４の値識別子に対応し、10ユーロの総売上を有する）とを含む。そして、それら２つの操作からの結果は、オペランド１８６によって結合され、この結合は、差分インデックスの結果を用いてメインインデックスの結果を増加させることを含む。差分は正または負でありうる。メインインデックス内のエントリへの更新は、まず古い行を削除し、そして更新された行を挿入することによって処理され、一実施形態において、削除は差分インデックスにおける負の差分によって表わし、挿入は正の差分によって表わすことができる。
【００２５】
図２Ａ、２Ｂは、構造化データのテーブル２０２、２０４を表わすブロック図である。概して、第１テーブル２０２は辞書を基にした圧縮により圧縮されたのではない販売テーブルの実装を表わし、第２テーブル２０４は辞書を基にした圧縮により圧縮された第１テーブル２０２の実装を表わす。
【００２６】
第１テーブル２０２は、異なる種類のデータの組み合わせに基づいて、異なる種類のデータを表わす列、および、異なるレコードを表わす行を含む。例えば、列は、販売番号２０６、日付２０８、場所コード２１０、製品コード１２１、販売製品数２１４、パッケージング属性２１６、通貨単位２１８、セントにおける合計値２２０、請求番号２２２を表わす。第１行２２４は、販売番号S2551、日付20040904、場所L164、製品コードP21191等を含むレコードである情報の組み合わせを含む。
【００２７】
第２テーブル２０４は、辞書を基にして圧縮された値として第１テーブルの列２０６〜２２２の値を表わす。圧縮された値の種類は、（値の圧縮に関係がないという理由のために）属性を含むがキー数値を含まず、属性は辞書２３２内の識別子によって表わされる。例えば、第１テーブル２０２の販売数２０６の値は、第２テーブル２０４の第１列２２８内の６桁の整数値（約２５万までの値について１８ビットの整数の識別子によって表わされる）として圧縮され、それらの整数値は、第１辞書２３０内の値を表わすが、第１テーブル２０２の販売数のキー数値２１４は辞書内に表わされない（値の圧縮に関係する必要がないという理由のために浮動小数点数として表わされる）。第１辞書２３０内の第１販売識別子0000は、第２テーブル２０４の第１列２２８の値S2500を表わす。
【００２８】
図２Ａ、２Ｂは、ある種類の辞書を基にした圧縮を含むが、そのような圧縮は異なりうる。例えば、図２Ｂの第２テーブル２０４において、キー数値は辞書を基にした圧縮により圧縮されないが、ある実施形態において、キー数値と属性の組み合わせが辞書を基にした圧縮により圧縮され、または、キー数値のみが圧縮され、または、選択されたキー数値と属性の組み合わせが圧縮される。
【００２９】
図３は、属性およびキー数値の基数を表わすテーブル３００である。例えば、テーブル３００は、図２Ａ、２Ｂの第１、第２テーブル２０２、２０４のそれぞれの列の基数のリストを含む。基数を表わすことに加えて、テーブル３００は、各基数について、それぞれの列を符号化するために必要とされるビット数を含む。例えば、２の２乗は４であり、これは３以上で最小の２の整数乗であるので、基数３の列M3を符号化するために必要とされるビット数は２である。
【００３０】
テーブル３００の列は、もう１つのテーブルの列を識別する第１列３０５、対応付けされた列内の値の基数を示す第２列３１０、対応付けされた基数に基づいて対応付けされた列を符号化するために必要とされるビット数を示す第３列３１５を含む。例えば、テーブル３００の第１エントリ３２０は、M1として識別される属性の列が２４の基数を有することを示し、（２の５乗は２４以上である最小の２の整数乗であるので）２進数で符号化するために５ビットを必要とする。
【００３１】
テーブル３００は、値の基数に基づいて列の値の幅を生成することによってテーブルのメモリへの影響を減少させるために使用され、辞書を基にした圧縮と組み合わせて使用される。
【００３２】
図４Ａ、４Ｂは、ベクトルを基にした圧縮により圧縮される列を表わすブロック図である。この圧縮は、ビットベクトル圧縮と呼ばれる。概して、この圧縮は、列内の最も頻度の高い値を発見し、列についてのビットベクトルを使用して値が出現することまたは出現しないことを表わすことを含む。例えば、１は値が出現することを表わし、０は値が出現しないことを表わす。さらに、この圧縮は、頻出値（frequently occurring value）の出現数を生成し、より小さいまたは減少したビットベクトルを生成するためにビットベクトルから頻出値の出現を除去することを含む。例えば、図４Ａにおける一連のブロック図と異なり、図４Ｂにおける一連のブロック図は、さらに、整列された値のビットベクトルを頻出値の出現数、および、他の値を表わす短縮ビットベクトルに減少させることを含む。図４Ａ、４Ｂの列内の値は、辞書を基にした圧縮の値である。
【００３３】
図４Ａの第１の一連のブロック図において、ビットベクトル４０６は、第１矢印４０４によって示されるように、値の列４０２について生成される。ビットベクトル４０６は、第２矢印４０８によって示されるように、０および１で占められ、０は頻出値0000が出現しないことを表わし、１はその値が出現することを表わす。ビットベクトルを占めるために使用される頻出値は、最頻出値（most-frequently occurring value）、または、他の値より頻繁に出現する値である。値が頻繁に出現するか否かを判定することは、データの列の走査からの値の勘定、または、最も頻繁に出現することが期待される値の統計分析（例えば、例外値のみが非ヌルである例外のテーブルにおいて、ヌル値が最頻出値であることが期待される）に基づく。値が頻繁に出現するか否かの判定についての出現の範囲は、データの列に制限される（すなわち、頻繁に発生する値は列ごとに異なりうる）。値の列４０２は、第３矢印４１０によって示されるように、最頻出値の出現を除去することによって圧縮される。例えば、値0000は、圧縮された列４１２を生成するために列４０２から除去される。圧縮された列４１２に基づいて列４０２からの値を再構成するために、ビットベクトル４０６は、圧縮された列４１２内の値の位置、および、頻出値の位置を示すために使用される。
【００３４】
例えば、辞書を基にした圧縮が実行されると、該当する列について次のようにビットベクトルを配置することによってさらなる圧縮を達成することができる。ヌル値のような頻繁に繰り返される値を含む所定の列Ａについて、列Ａ内に最も頻繁な値Ｆが発見され、その列についてビットベクトルＶを使用して符号化される。ビットベクトルＶはＮ項を有し、Ｎは列Ａ内の行数を表わす正の整数である。Ｖが列Ａと並ぶ列として書かれるならば、ＶはＡ内の値Ｆの各々の出現と並ぶ１、および、Ａ内の任意の他の行と並ぶ０を含みうる。ビットベクトルＶは列ベクトルＡから分離され、値Ｆを含む全ての行は圧縮された列ベクトルＡ＊を生成するためにＡから削除される。列Ａは、ビットベクトルＶによって指定されるように値Ｆを再挿入することによって圧縮された列ベクトルＡ＊から再構成され、辞書を基にした圧縮技術によって指定されるように辞書を使用することによって、圧縮されていない読み取り可能な値の列をＡから再構成することができる。
【００３５】
メモリ内の削減がどのように実現されるかの一例として、1,000,000に等しいＮ行を有し、列Ａを有する一例のテーブルＴについて、列Ａ内の最も頻繁な値ＦがＡ内に990,000回出現するものとする。Ａ内の他の10,000個の値は、Ａについての辞書内に列挙された残りの異なる値の集合から得られ、250である合計Ｃ個の異なる値を含みうる。この例において、列ＡについてのビットベクトルＶは1,000,000ビットを含み、これは約１メガビット、約125キロバイトである。圧縮された列Ａ＊は10,000個のエントリを含み、各々は８ビット（すなわち、１バイト）の整数で符号化され、10キロバイト（すなわち、10,000個のエントリ×１バイト）の占有領域を与える。圧縮なしで列Ａによって必要とされる全体領域は、（圧縮されていない列Ａの例を参照して説明したように）50メガバイトである。ベクトル圧縮に必要とされる全体領域は、辞書のための領域、圧縮された列Ａ＊のための領域、ビットベクトルＶのための領域を含む。列Ａのベクトルを基にした圧縮のバージョンに必要とされる全体の領域は、147キロバイト（辞書のために12キロバイト、圧縮された列のために10キロバイト、ビットベクトルのために125キロバイト）である。約340の圧縮率が実現される（すなわち、圧縮されていない50,000キロバイト／ベクトルを基にした圧縮の実装により圧縮された147キロバイト）。
【００３６】
図４Ａの第１の一連のブロック図と異なり、図４Ｂの第２の一連のブロック図は、頻出値の出現数を表わす量の生成を助けるためにデータの列を整列することを含む。図４Ｂの第２の一連のブロック図において、整列された列４１８への第１矢印４１６によって表わされているように、列４１４の整列されたバージョンが生成される。そして、ビットベクトル４２２および減少した列４２４への第２矢印４２０によって表わされているように、頻出値がビットベクトル４２２によって表わされ、整列された列４１８は頻出値を置換させ、減少した列４２４は頻出値0000が除去されている。第３矢印４２６によって表わされているように、頻出値の出現の量を表わす数４２８が生成される。さらに、減少または短縮ビットベクトル４３０を生成するために、頻出値のグループを除去するようにビットベクトル４２２が減少される。あるデータはビットベクトル４２２の先頭または上端に整列されないので、短縮ビットベクトル４３０は、減少された列４２４内で頻出値が後に出現するか否かを判定するために使用される。例えば、様々な列にわたるデータの間の依存関係、整列規則、または、要因の組み合わせは、列の値が、頻出値のグループに整列されることを妨げる。完全な列を再構成するために、グループにおける値の出現数４２８および短縮ビットベクトル４３０が、減少された列４２４と組み合わせて使用される。
【００３７】
例えば、辞書を基にした圧縮およびベクトルを基にした圧縮によってテーブルが圧縮されると、多くの列が頻出値の多くの実例（instance）（例えば、多くのヌルまたは０の値）を有する場合において、さらなるレベルの圧縮が可能である。（例えば、図６のテーブル６００を参照して説明するように、）テーブル内の行は、列内の最頻出値のできるだけ多くをそれらの列の上端に持って行くように整列され、ビットベクトルはそれらの列について生成される。（図４Ｂの数４２８によって表わさているように、）頻出値がブロック内で何回出現するかを記録する数によって、ビットベクトル内で、頻出値の最も上端のブロックが置換される。その数の使用はビットベクトルを短縮し、全体の圧縮率を増加させることを可能とする。
【００３８】
より詳細な例として、一例のテーブルＴは、F_1である列１内の最頻出値、F_2である列２内の最頻出値、同様にF_Mまでを有するＭ列を有し、列Ｊ内の値F_Jの出現数は｜F_J｜と書かれ、列Ｊは任意の列（すなわち、１からＭまでの任意の列）である。列は、最も頻繁な値Ｆの頻度によって列の順序付けが与えられるように番号が付与され、最も多くＦ値を有する列は最初であり、最も少なくＦ値を有する列は最後である。従って、列１からＭは、（例えば、図６のテーブル６００内の列６０２の番号付与のように）｜F_1｜＞｜F_2｜＞・・・＞｜F_M｜であるように番号が付与される。
【００３９】
テーブルＴの行は、全ての値F_1が上端に存在するように列１によって整列される。整列の順序は、上端の｜F_1｜行の内部の順序付けに無関心であり、全ての値F_2が上端に存在するように列２によって整列されうる。ここで、整列の順序は、値F_2を有する行の上端のブロックの内部の順序付けに無関心であり、これらの行は全ての値F_3が上端に存在するように列３によって整列されうる。値F_Mを上端に置くように値F_(M-1)を有する行の最も上のブロックが整列されるまで、行の整列が継続される（例えば、最後の列Ｍ以外の全てについて継続される）。（図６のテーブル６００内に表わされているように、）減少して完成させて、全てのF_1行は上端に、多数のF_2行は上端に、いくぶん少ないF_3行は上端に、等、存在する。この整列の方法は、最終的な圧縮率を最大化するために論理的に最適な整列ではないこともありうるが、実装が比較的容易であり、より複雑なアプローチより高速に実行され（例えば、より効率的に処理資源を利用する）、多くの場合、最適な整列に近い。
【００４０】
詳細な例を続け、列１からＭについてビットベクトルV_1からV_Mが書かれ、列Ｊについての各ビットベクトルV_Jは、値F_Jの出現について‘１’の値、任意の他の値について‘０’の値を含む。結果は、各々が値F_Jの詰め込まれたブロックで開始するビットベクトルV_Jの集合である。各V_J、値F_Jの詰め込まれたブロックについて、V_J内で何ビットが削除されたかを記録する数n_Jをそれらの位置に書き込む。疎な（sparse）テーブルＴ（すなわち、値の実例が必ずしも隣接していない最も頻繁な値の頻繁な出現を有するテーブル）について、短縮ビットベクトルV*_J＋数n_Jによって占められる領域は、完全なビットベクトルV_Jによって占められる領域より著しく小さい。
【００４１】
短縮ベクトルを基にした圧縮は、値の列の集計の効率を大きく向上させる。例えば、全ての頻繁な値F_Jが０である場合において、列のうち長さn_Jを有する最初の区分の値を集計することは（n_J×０は０であるので）些細なことであり、この些細であることを利用するコードは、短縮ベクトルを基にした圧縮なしの場合よりずっとすっきりし高速である。
【００４２】
どのぐらいの圧縮が実現されるかの一例として、上述したようにテーブルＴが、1,000,000であるＮ行を有し、A_1からA_10まで10列を有し、列A_1内に最も頻繁な値F_1が990,000回出現し、A_1内の他の10,000個の値は合計で250個の異なる値を含み、各々は１バイトであるとする。最頻出値F_1について、短縮ベクトルを基にした圧縮なしでベクトルを基にした圧縮を使用して、列A*_1は10キロバイトを占有し、ビットベクトルV_1は125キロバイトを占有する。
【００４３】
短縮ベクトルを基にした圧縮を使用して、短縮ビットベクトルV*_1は10,000ビットを含み、1.25キロバイトを占有する。整列された列A_1についてのV_1についての１ビットのブロックを表わす番号n_1は、１０進数表記で990,000とし、２進数表記で２０ビット（すなわち、３バイトより少ない）を必要としうる。短縮ベクトルを基にした圧縮を使用して圧縮されたA_1によって必要とされる合計の領域は、辞書のための領域、短い列A*_1のための領域、短いビットベクトルV*_1のための領域、数n_1のための領域を含みうる。そのため、短縮ベクトルを基にした圧縮を使用したA_1のための領域は27キロバイト（12キロバイト、10キロバイト、12.5キロバイト、3バイト）より小さい。
【００４４】
上述のように、圧縮なしで列A_1によって必要とされる全体の領域は50メガバイトでありうる。短縮ベクトルを基にした圧縮を使用して、圧縮率は1800より大きい（50,000キロバイト／27キロバイト、適切に概数で表わした）。2から10までであるJについての値F_Jのうちいくつがそれらの列の上端に整列されるかに応じて、列A_2からA_10のような短縮ベクトルを基にした圧縮を有する他の列についての圧縮率はより小さくなりうるが、疎なテーブルについて全体の圧縮率はそのような圧縮を十分価値あるものにするためになお十分高くすることができ、必要とされるオーバーヘッドのコードが、必要に応じて列を再構成し、選択された値を読み出すことを可能とする。
【００４５】
ベクトルを基にした圧縮および短縮ベクトルを基にした圧縮の両方について、列の圧縮および伸長、全体の列を伸長することなく列内の値の効果的な読み出しを容易にするために、（限定しないが処理およびメモリ消費を含む）あるオーバーヘッドの資源消費が必要とされうる。追加のオーバーヘッドは、実行するために（限定しないがメインメモリ領域を含む）領域および（例えば、プロセッサコア資源のパーセンテージ利用で測定される）時間の両方を要し、（例えば、ベクトルを基にした圧縮、辞書を基にした圧縮、または、それ以外とは異なり）短縮ベクトルを基にした圧縮の使用のための閾値の設定において不利な条件が考慮されうる。閾値は、発見的に、および、各種テーブルにおける検査によって、設定されうる。大量のデータを含むテーブルを含む実装において、処理の消費の代わりにメモリ消費を最小化するために圧縮技術の選択（例えば、異なる列について異なる技術）が使用されうる。メモリ消費を最小化することによって、ブレードサーバの数および設置される物理メモリの量のような、より少ないハードウェア資源が必要とされうる。さらに、最小のメモリ領域はメインメモリ（例えば、持続的な記憶のために使用されるハードディスクドライブのような２次メモリより迅速な応答時間を有するランダムアクセスメモリのような揮発性メモリ）内のデータの圧縮および検索を可能としうるので、データを圧縮し、クエリーに応答する全体の速度は向上され、圧縮を実現するための処理のオーバーヘッドは許容可能に小さくなりうる。
【００４６】
図５は、データを圧縮し、圧縮されたデータを検索するシステム５００を表わすブロック図である。システム５００は、検索エンジン管理ツール５０２、ホスト５０４、記憶装置５０６を含む。概して、システム５００は、検索エンジン管理ツール５０２を使用してホスト５０４の圧縮されたデータを検索するために使用され、データは、ホスト５０４によって組織化され、圧縮される。さらに、ホスト５０４においてメモリ内に保持されるデータは、記憶装置５０６において、圧縮された、または、圧縮されていない形式で存続する。探索エンジン管理ツール５０２は、（例えば、相互の監視およびバックアップを提供するような方法で）ホスト５０４の各々において冗長的に実現された、検索および圧縮を実行するサービスと統合されたサービスでありうる。
【００４７】
ホスト５０４の各々がデータの行の一部を保持するようにホスト５０４が組織化されうる。例えば、第１ホスト５０８は１番目の百万行を保持し、第２ホスト５１０は２番目の百万行を保持する。ホスト５０４にわたるデータの行の分散は均一とし、並列処理を向上させうる。例えば、これは、ホスト５０４にわたってデータの行を伸長、検索、再圧縮する並列処理を向上させるために行われる。データの分散の結果として、Ｍを正の数として１からＭまでの一連の列の各列は、Ｎを正の整数として１からＮまでの部分に分割され、１つの部分が各ホストに割り当てられ、各ホストはそのホストに割り当てられた部分に責任（インデックス付けおよび圧縮のための、または、割り当てられた部分の伸長、検索、再圧縮のための責任）を負う。
【００４８】
データのテーブルについての論理インデックスは、ホスト５０４の１つにおいて記憶され、ホスト５０４にわたってデータがどこに存在するかを判定するために、および、処理を調整するために、その論理インデックスが使用されうる。例えば、第１ホスト５０８は、ホスト５０４にわたってデータの行がどこに配置されているかを示す論理インデックス５１８を含む。処理を調整する一例として、検索エンジン管理ツール５０２は検索に応答して結果について第１ホスト５０８に問い合わせ、第１ホスト５０８は、検索エンジン管理ツール５０２に提供するため、ホスト５０４の検索および結果の結合を調整するために論理インデックス５１８を使用する。
【００４９】
ホスト５０４は記憶装置５０６を共有するブレードサーバとすることが可能である。記憶装置５０６は、ホスト５０４においてデータが圧縮されるデータベースから１つまたは複数のテーブルの各々に対応する、第１インデックス５１２のようなインデックスを含みうる。例えば、テーブルは、多次元のOLAP（OnLine Analytical Processing）キューブについての事実テーブル（fact table）および次元テーブル（dimension table）とすることが可能である。インデックスは、インデックス構造についてのメタデータを有する論理インデックス、および、圧縮された列の集合を含みうる。例えば、第１インデックス５１２は、ホスト５０４のデータについてのメタデータを含む論理インデックス５１４、および、圧縮された列の集合５１６を含む。
【００５０】
ホスト５０４の各々は、それぞれが責任を持つデータの行を圧縮する責任を持つ。例えば、第１ホスト５０８は、圧縮される列５２０内のデータの行を圧縮する責任を持つ。実行される圧縮は、本明細書において説明した任意の種類の圧縮とすることが可能である。短縮ベクトルを基にした圧縮のような圧縮方式は、ホストにおける各インデックスとともに記憶され、分割インデックスの場合において論理インデックスによって調整される。
【００５１】
また、ホスト５０４の各々は差分バッファを含む。例えば、第１ホスト５０８は第１差分バッファ５２２を含む。差分バッファは、ホストのそれぞれのインデックス部分への任意の変更を記憶する。例えば、第１差分バッファ５２２は、テーブルの第１部分についてのデータの列５２０内に記憶されたデータへの変更を記憶する。差分バッファは、各々の変更に応答してデータへの更新を要求する代わりに、ホスト５０４内のデータへの変更（例えば、データについてのクエリーの間に性能を妨げることを防止するために更新は非同期とすることが可能である）を記憶するために使用される。圧縮された列が個々の変更について更新される必要がないことは、記憶された列に同期的に変更が書き込まれるより大幅に圧縮のための全体のシステム性能を向上させることを可能とする。例えば、差分バッファ内に変更が累積され、より少ない頻度でメインインデックスを変更するために累積された変更が使用されるならば、更新を吸収することに関する処理のオーバーヘッドは減少され、そして、変更されたメインインデックスを圧縮するためのオーバーヘッドの資源はより少ない頻度で消費される。例えば、列のインデックスに1000回の小さな変更を行い、毎回、インデックスを伸長および再圧縮しなければならないことに代えて、1000回の変更は差分バッファに書き込まれ、全て一緒にメインインデックスに書き込むことができ、伸長および再圧縮のただ１回のサイクルが必要とされ、従って、オーバーヘッドの資源消費における1000倍の減少を達成する。検索結果を見つけるために、メインインデックス内の圧縮されたデータとともに差分バッファが検索され、差分バッファからの結果は、変更を含む結果を生成するためにメインインデックスからの結果と結合される。ある実施形態において、実装および構成設定の詳細に応じて、ホスト５０４の各々は、１つまたは複数の差分バッファ、例えば、各インデックスについての差分バッファも含む。
【００５２】
図６は、複数の列６０２にわたるデータの整列を表わすテーブル６００のブロック図である。行６０４の各々は、列６０２にわたって依存する値を含む。例えば、第１行６０８はビジネスオブジェクトを表わす構造化データについての値の組み合わせを含み、第１行６０８内の値の各々は、第１行６０８内の他の値に依存し、第１列６１０の整列は他の列内のデータを整列し、第１行６０８の値の組み合わせは維持される。ビジネスオブジェクトは、結合されたテーブルの集合としてモデル化することが可能である。結合されたテーブルの集合としてのモデル化は、結合されたテーブルの集合としてモデル化することができるような方法で定義されるビジネスオブジェクトの結果であり、検索エンジンは、テーブルの行にわたって検索し、ビジネスオブジェクトの指定された結合を計算することによってオブジェクトを操作することが可能である。
【００５３】
テーブル６００内のデータは、辞書を基にした圧縮の値である。テーブル６００内のデータは、ベクトルを基にした圧縮技術の準備において最頻出値をグループにするためのデータの整列の結果である。例えば、値０は列６０２の各々についての最頻出値であり、列６０２の最も上部において値のグループが生成されるように行が整列されている。
【００５４】
テーブル６００内の行６０４の整列は、列６０２にわたって最頻出値を考慮している。例えば、合計行６０６は、列６０２の各々について最頻出値の出現数を示す。第１列６１０の最頻出値が列６０２の各々の他の頻出値より頻繁に出現するように、列６０２が順序付けされ、列にわたってより頻繁に出現する値がA_2からA_9まで順序付けされるように他の列の最頻出値が順序付けされている。列の整列に基づいて、行の一端におけるグループでの多くの頻出値として生成されるように行が整列され、その整列は列にわたる依存関係を考慮する。
【００５５】
例えば、合計行６０６に表わされているように、０値をいくつ含むかによってA_1からA_9として列が水平方向に順序付けされる。第１列６１０、ラベルが付された列A_1は、その行の全てが全ての０値を上部に持って行くように整列された。そして、第２列６１２、ラベルが付された列A_2は、行１から１９がそれらの行の０値を上部に持って行くように整列された。行１から１９に制限されている第２列６１２の整列は、第１列６１０の上部の最頻出値の整列順序、および、データの行にわたるデータの依存関係を維持することに基づく。例えば、第１列６１０の行１から１９は、行１から１９内の最頻出値のグループを維持するようにその列の最頻出値を含むので、それらの行のみが第２列６１２内で整列された。整列のこの技術は、残りの列の各々について続く。例えば、第３列６１４、ラベルが付された列A_3は、行１から１５がそれらの行の０値を上部に持って行くように整列され、他の行の０値はそれらの位置に維持されている（例えば、行１７は０値を含む）。他の例として、第４列６１６、ラベルが付された列A_4は、行１から１４がそれらの行の０値を上部に持って行くように整列され、第５列６１８、ラベルが付された列A_5は、行１から１０がそれらの行の０値を上部に持って行くように整列され、第６列６２０、ラベルが付された列A_6は、行１から８がそれらの行の０値を上部に持って行くように整列され、第７列６２２、ラベルが付された列A_7は、行１から７がそれらの行の０値を上部に持って行くように整列され、第８列６２４、ラベルが付された列A_8は、行１から６がそれらの行の０値を上部に持って行くように整列され、第９列６２６、ラベルが付された列A_9は、行１から４がそれらの行の０値を上部に持って行くように整列された。
【００５６】
整列された列の各々は、図４Ｂを参照して説明した短縮ベクトルを基にした圧縮のようなベクトルを基にした圧縮を使用して圧縮される。列の整列は、列の一端に頻出値のより大きいブロックを押し上げることによって圧縮のメモリ節約を最適化し、例えば、そのような整列なしで生成されるより短いビットベクトルがその整列を用いて生成される。
【００５７】
テーブル６００は、整列の結果であるデータのある組織化を含むが、整列は異なり、データは異なりうる。例えば、同一の値０が列６０２の各々について最頻出値であるが、テーブルは異なり、列６０２の各々について異なる値が最頻出値でありうる。もう１つの例において、１つの列についての最頻出値は、列の全てを整列するために使用され、または、列の全ては整列される必要がない。
【００５８】
図７Ａ、７Ｂは、データを圧縮し、圧縮されたデータの検索を可能とする処理７００、７０２を表わすフローチャートである。処理７００、７０２は、図５のホスト５０４によって実現されうる。例えば、ホスト５０４の各々は、ホストが責任を持つ一部のデータについて処理７００を実行する。圧縮されるデータは、構造化ビジネスデータとすることが可能である。かなりのデータの圧縮はコスト効果の高いデータのメモリ内処理を可能とするので（例えば、サーバの数または物理メモリの量が削減されうる）、データはメモリ内で圧縮され検索される。
【００５９】
概して、図７Ａの処理７００において、辞書を基にしたメモリ内のデータの列の値が整列され（７０４）、列の頻出値を表わすベクトルが生成され（７０６）、頻出値を表わす数が生成され（７０８）、数および短縮ベクトルが記憶される（７１０）。
【００６０】
辞書を基にした値の整列（７０４）は、１つまたは複数の列の値について最小値から最大値まで整列することを含む。複数の列の値が整列されるならば、列の順序付け（テーブルの列内の最頻出値の数に基づく順序付け）に基づいて他の列の前の列を整列することを含む。例えば、図６のテーブル６００を参照して説明した列６０２の順序付けに基づく列６０２の整列が実行される。整列は列にわたるデータの依存関係を考慮することが可能である。例えば、辞書を基にした値は、同一の行についての列にわたる依存関係を用いて構造化されるデータを表わし、行内の値の対応付けが維持される。整列は、図５のホスト５０４の１つのようなサーバ内で実行されうる。
【００６１】
例えば、辞書を基にした値を整列することは、テーブルの各列について、列を順序付けすることを含み、任意の列の最頻出値（most-frequently occurring value（ＭＦＯＶ））を含む列は１番目に順序付けされ、他の列の整列は、前の列の最上部の範囲内のレコードに基づく（７１４）。
【００６２】
列の頻出値を表わすベクトルが生成される（７０６）。ベクトルは、ビットを用いて行内に頻出値が出現することまたは出現しないことを表わすビットベクトルである。ベクトルは、列の全てについて、または、列のほんのいくつかについて生成されうる。ベクトルは、データの一部について責任を持つ各サーバ（例えば、図５のホスト５０４のそれぞれのホスト）によって列の部分について生成されうる。頻出値は、列の範囲内の最頻出値のような最頻出値でありうるが、そうである必要はない。例えば、各列の最頻出値についてのビットベクトル表現が生成される（７１６）。
【００６３】
頻出値を表わす数が生成される（７０８）。各々の数は、列内の頻出値の出現数を表わす。例えば、図４Ｂは、頻出値0000の６つの出現を示す。出現数は、列の一端（例えば、上端または下端）における頻出値のグループ内の出現数に制限される。例えば、１つの列は上端における頻出値のグループを有し、数はそのグループ内の値の出現数を表わし、列は値の他の実例を含む。例えば、各列の最上部における最頻出値の実例を表わす数が生成される（７１８）。
【００６４】
数および短縮ベクトルが記憶される（７１０）。例えば、頻出値の出現を表わす数が短縮ベクトルとともに記憶される。例えば、テーブルの各列について数およびビットベクトルの組が記憶される。短縮ベクトルは、値の出現が短縮ベクトルを生成するためにベクトルから除去された数によって表わされた、頻出値の出現を表わすベクトルである。短縮ベクトルを記憶することに加えて、値のグループ内の頻出値の実例が、短縮または減少された列を生成するために列から除去される。例えば、最頻出値を含むビットベクトルの上端が除去され（７２０）、各列について最頻出値の出現数を表わす数および短縮ビットベクトルが記憶される（７２２）。また、最頻出値のグループを含む列の上端が除去され、または、最頻出値の全ての実例（例えば、最上部および存在すれば他の実例）が、短縮された列を生成するために除去される（および、例えば、ビットベクトルを使用して再構成される）。
【００６５】
概して、図７Ａの処理７００の部分処理の実装に加えて、図７Ｂの処理７０２は、辞書を基にした圧縮の値を生成すること（７１２、例えば、図１Ａを参照した説明した）、列の値を表わすベクトルを短縮すること（７２０、例えば、上記段落で説明した）、メモリ内の圧縮された列を整列すること（７２２）、クエリーを実行するために必要とされる列を伸長および再圧縮すること（７２４）をさらに含む。
【００６６】
圧縮された列について検索を実行することは、圧縮された列のデータをメモリ（例えば、持続的な記憶装置内の圧縮されたデータから不揮発性メモリ）内にロードすること、データを一時的な構造に伸長すること、検索によって指定されたように行を選択することを含む。
【００６７】
図７Ａおよび７Ｂの処理７００、７０２はある順序でのある部分処理を含むが、追加の、より少ない、または、異なる部分処理が存在し、それらの部分処理は異なる順序で存在しうる。例えば、全体の列を整列するのではなく、列の最頻出値のビットベクトル表現に基づいて列が生成されうる（例えば、最頻出値のみが列の一端に整列され、他の値はそれらの中での整列を有する必要がない）。
【００６８】
もう１つの例として、存在すれば、圧縮の種類が性能を最適化する（例えば、メモリ消費を減少させる）ことが期待されるか否かについての判定に基づいて、辞書を基にした圧縮、一般のベクトルを基にした圧縮、短縮ベクトルを基にした圧縮が適用されうる。例えば、辞書を基にした値および辞書が、列の辞書を基にしていない値より少ないメモリを消費することが期待されるならば、辞書を基にした圧縮が実行される。もう１つの例として、キー数値ではなく属性を有する行のみが、任意の種類の圧縮を使用して圧縮される。
【００６９】
図８は、圧縮された辞書を使用したデータの列の圧縮を表わすブロック図である。図は、圧縮されたデータの列８０２、８０６、ブロック識別子のベクトル８１０、ブロック辞書の列８１４、ブロック辞書に対応するオフセット値の列８２０を含む。
【００７０】
図８に表わされている圧縮は、データのブロックが１つまたは複数のブロック識別子のベクトルに圧縮されるので、“ブロックベクトル圧縮”と呼ぶ。行のブロックのようなデータのブロックにデータの圧縮が適用されるので、この圧縮はブロック毎であると呼ぶ。この圧縮は辞書を基にした圧縮を使用し、上述したベクトルを基にした圧縮および短縮ベクトルを基にした圧縮の技術に代わりうる。図８を参照して説明する圧縮は、１つまたは複数の列が、例えば、ただ１つの多数回繰り返される値を有するのではなく、それぞれの列内で各々が多数回繰り返されるいくつかの値を含むとき、代替として適用されうる。この圧縮は、数百万または数億の行を圧縮するために特に適用可能であり、達成されるメモリ効率は、圧縮のための処理のオーバーヘッドによって引き起こされる損失を著しくまさる。
【００７１】
概して、図８の圧縮は、整列されたデータの列をブロックに分割すること、各ブロックについてブロック辞書を参照するブロック識別子のベクトルを生成することを含む。ブロック辞書は、ブロック内に現れる値を含みうる。ブロック識別子は最小のビット数を使用して符号化される（例えば、ブロックの全てのユニークなブロック識別子を２進数符号化するために必要とされる最小のビット長で２進数符号化される）。ブロック辞書は、各ブロック識別子をデータの列内のユニークな値を表わす値識別子にマッピングする。（辞書を基にした圧縮に関して上述したように）辞書を基にした圧縮によって生成される列の辞書内で値識別子が検索される。
【００７２】
図８を参照すると、圧縮されたデータの第１列８０２は、辞書を基にした圧縮により圧縮されたデータを表わす値識別子を含む。例えば、値識別子“0007”は文字列“INTEL”を表わす。圧縮されたデータの第１列８０２は、矢印８０４によって示されているように、圧縮されたデータの第２列８０６を生成するように整列される。圧縮されたデータの第２列８０６は、同一の値識別子が一緒にグループにされるように整列される。圧縮されたデータの第２列８０６の整列は、より小さく番号付けされた値識別子からより大きく番号付けされた値識別子に整列することを含み、結果として複数の値識別子が一緒にグループにされる他の整列技術を使用することが可能である。
【００７３】
矢印８０８によって示されているように、圧縮データの第２列８０６に基づいてブロック識別子のベクトル８１０が生成される。ベクトル８１０は、圧縮されたデータの第２列８０６の各々の値識別子についてのブロック識別子を含む。各々のユニークな値識別子についてユニークなブロック識別子を割り当て、同一の値識別子について同一のブロック識別子を割り当てることによってベクトル８１０が生成され、ブロック識別子および値識別子はデータのブロックの範囲内で少なくともユニークである（データのブロックは、この例において、値識別子のブロックである）。各ブロック識別子は、ブロックについてのブロック識別子の数に基づく最小の２進数符号化を有する整数である。ベクトル８１０は各ブロックについてのベクトルの集合であり、ブロックについての一連のブロック識別子はそのブロックについてのベクトルを構成する。
【００７４】
例えば、図８において、３行のブロックサイズが存在する（実際、ブロックサイズは、データテーブルのあるカテゴリーについて数百または数千の行であり、ブロックのサイズは有効性について検査され、任意に選択されうる）。値識別子の第１ブロック８２８について、全ての値識別子は同一（すなわち、“0000”）であり、同一のブロック識別子（この場合、‘0’）がベクトル８１０内に含まれる。第２ブロック８３０について、２つのユニークな値識別子（“0001”および“0002”）が存在し、ベクトル８１０内のそれらの値を表わすためにそのブロックについて２つのユニークなブロック識別子（‘0’および‘1’）が使用され、値識別子の列0001, 0001, 0002がブロック識別子の列0, 0, 1として表わされている。第３ブロック８３２について、値識別子の各々はブロックの範囲内でユニークであるので、値識別子の列0002, 0003, 0004がブロック８１０内のブロック識別子の列00, 01, 10として表わされている。第２ブロック８３０とは異なり、第３ブロック８３２について、ブロック識別子の各ブロックについて最小のビット数を使用してブロック識別子が表わされるので、ベクトル８１０内でブロック識別子を符号化するために２ビットが使用される。
【００７５】
ベクトル８１０が同一の繰り返し値を有するブロックベクトルについてのエントリを含む場合、ベクトル８１０のブロックベクトルは、規則により、全く何も含まず、0キロビットの合計サイズを与える。ベクトルが1,024行のブロックサイズを有するならば、２つの異なる値を含む1,024行のブロックについて、ブロック識別子のベクトルは、各々が0または1である一連の1,024ビットを含み、1キロビットの合計サイズを与える。1,024の異なる値を含む1,024行のブロックについて、ブロック識別子のベクトルは一連の10ビットの整数を含み、10キロビットの合計サイズを与える。
【００７６】
ブロック辞書の列８１４は、ブロック識別子の列８１６および値識別子の列８１８を含む。列８１４において、各ブロックはブロック辞書によって表わされ、ブロック辞書はブロック識別子および対応付けされた値識別子の組み合わせからなる。
【００７７】
矢印８１２によって示されているように、ブロック識別子のベクトル８１０に基づいてブロック識別子の列８１６が生成される。ブロック識別子のベクトル８１０とは異なり、ブロック識別子の列８１６はブロックについて最小数のブロック識別子を含む。ブロックの範囲について、各々の利用されるブロック識別子は、そのブロックについて列８１６内のリスト内に１回のみ現れるという意味で、その数は最小である。さらに、列８１６内にリストされるブロックについてのブロック識別子は、数値順のような正規の順序でリストされる。例えば、列0, 0, 0としてベクトル８１０内に表わされた値識別子の第１ブロック８２８は、ブロック識別子の列８１６内に単一のブロック識別子‘0’として表わされている。もう１つの例として、ベクトル８１０内の列00, 01, 10として表わされる値識別子の第３ブロック８３２は、ブロック識別子00, 01, 10として表わされ、各ブロック識別子はそのブロック内でユニークである。
【００７８】
オフセット値の列８２０は、ブロック辞書の列８１４のブロック辞書に対応する。オフセット値の列８２０は各ブロックについてのオフセット値を含み、各オフセット値は、ブロック辞書の列８１４内で、データのブロックについての辞書がどこで開始するかを示す。例えば、第１オフセット値８３４は、圧縮されたデータの第１ブロックについてブロック識別子が０のオフセットにおいて開始することを示す。もう１つの例として、第３オフセット値８３６は、圧縮されたデータの第３ブロックについてのブロック識別子が３のオフセット（すなわち、ブロック識別子の列８１６の上端から３行）において開始することを示す。ブロック識別子の列８２２は列８１０と同一であり、オフセット値の列８２０のオフセット値と各ブロックについての列８２２のブロック識別子との間の対応関係、および、ブロックベクトルの列８２２内のブロックベクトルのブロック識別子がオフセット値の列８２０のオフセット値とどのように対応付けされるか、を表わすように繰り返される。オフセット値は、高速な値の検索をたいへん容易にし、ブロック辞書が再使用されるならば必須である。例えば、1Kまたは1,024のブロックサイズについて、オフセット値の列８２０をスクロールダウンすることは、ブロックが、1000倍高速に配置されることを可能とする。さらに、オフセット値はブロック辞書の再使用を可能とする実用的な方法である。
【００７９】
サーバの揮発性メモリ領域のような領域を節約するために、ブロック識別子の辞書の列８１４、オフセット値の列、ブロック識別子のベクトル８１０のみが、値識別子の列８０２のような値識別子の列の代わりに保存される必要がある。
【００８０】
図８を参照して説明した圧縮または類似の技術は、図５のホスト５０４のような１つまたは複数のサーバにおいて実装されうる。この技術は異なるデータの列について（例えば、ホスト５０４の各々における列を用いて）並列に実行することが可能である。
【００８１】
例えば、ブロックが1,024回繰り返される単一の値を含み、ブロックサイズが1,024であり、単一の値がそのブロックについてのブロック辞書内にリストされるならば、値が繰り返される事実を符号化するために０のビットが使用される（例えば、ブロック識別子‘0’および対応付けされた値識別子のみがブロック内の値の1,024個の実例を表わし、規則により、ブロックベクトルは存在しない）ので、圧縮は効果的である。もう１つの例として、ブロックが２つの値（例えば、ブロックの範囲内でユニークな２つの値）を含み、これらの２つの値がそのブロックについてブロック辞書内にリストされるならば、
ブロックベクトル内の各々の行についてどの値が出現するかを指定するために１ビット（例えば、ブロックベクトル内のエントリのリストについて0または1）が必要とされる。もう１つの例として、ブロックが３つまたは４つの異なる値を含み、ブロック辞書内にリストされるならば、ブロックベクトル内の各々の行についてどの値が出現するかを指定するために２ビット（例えば、00, 01, 10または11）が必要とされる。従って、概して、ブロックが、Nより大きいか等しい最小の２の整数乗が２のP乗であるようなN個の異なる値を含むならば、ブロックベクトル内の各々の行についてブロック辞書内のどの値をとるかを指定するためにPビットが必要とされる。最悪の場合のシナリオにおいて、ブロックが1,024個の異なる値を含むならば、（1,024は2の10乗に等しいので）各々の行についてどの値をとるかを指定するために10ビットが必要とされる。
【００８２】
ブロックベクトル圧縮についてのブロック辞書のもう１つの例として、列（例えば、値識別子の列８０６）がCの基数を有し、Cが全体の列内で異なる値の数であり、これらの値の多くがブロックベクトル圧縮が適用可能なように多数回繰り返していると仮定する。Cが524,288（すなわち、2^19）と1,048,576（すなわち、2^20）の間に存在するならば、列についての値識別子は20ビットを必要とする。
【００８３】
単一の繰り返し値を含む1,024行のブロックについて、ブロック辞書は20ビットによって指定される単一のエントリを含む。２つの異なる値を含む1,024行のブロックについて、ブロック辞書は２つのブロック識別子のビットおよび２つの20ビットの値識別子ビットを含み、全体で42ビット（すなわち、各々の値識別子について20ビット、各々のブロック識別子について1ビット）を与える。1,024の異なる値を含む1,024行のブロックについて、ブロック辞書は、各々が10ビットを有する1,024のブロック識別子、各々が20ビットを有する1,024の値識別子を含み、全体で30キロビット（すなわち、30ビット×1,024エントリ）を与える。
【００８４】
各々の場合において、オフセットを符号化するためにさらにいくつかのビットが必要とされ、ビット数は全体のブロック辞書の長さに依存する。上記の場合についてブロックベクトルのビット合計をブロック辞書のビット合計に加えると、検討した３つの例の場合について、それぞれ、20ビット、43ビット、40キロビットを与える。辞書を基にした圧縮およびビットベクトル圧縮を一緒に使用した最悪の場合のシナリオの合計は、列について、辞書を基にした圧縮のみを使用して必要とされる全体の領域の２倍となり、これは、ブロックの大多数が多くの繰り返し値を含む場合に列についてビットベクトル圧縮のみが効果的に適用可能であることを示す。
【００８５】
所定のブロック識別子と対応付けされたユーザが読み取り可能な値を見つけるために、２つの辞書検索が存在するが、両方の検索は巧妙に実行を要求される。例えば、所定の値を有する全てのレコードについてのクエリーに応答して、まず、（キー数値または属性のような）値と対応付けされた値識別子を検索するために列についての辞書が使用され、そして、所定のブロック内の値識別子と対応付けされたブロック識別子を検索するためにブロック辞書が使用される。もう１つの例として、ブロック識別子から値へ、ブロック識別子に対応する値識別子を検索するためにブロック辞書８１４が使用され、そして、値識別子に対応する値を検索するために列８０２についての辞書が使用される。複数のブロック内の値を検索するため、それぞれのブロックについて対応付けされたブロック識別子を見つけるために複数のブロック辞書が使用される。
【００８６】
図８は、圧縮の一部として特徴の一定の組み合わせを含むが、変形が存在しうる。例えば、ブロック識別子はデータのブロックにユニークである。もう１つの例として、ブロック識別子は、ブロック識別子のブロックを表わすために最小のビット数に圧縮される必要はない。もう１つの例として、ブロック識別子は、‘0’で開始する、または、昇順である必要はない。もう１つの例として、図８の圧縮の説明において用語“各”が使用されたが、圧縮はそのように全てに適用される必要はない。例えば、各ブロックが圧縮される必要はなく、オフセット値が各ブロックについて存在する必要はない。
【００８７】
もう１つの例として、ブロック辞書はいくつかのブロックにわたって再使用することが可能である。例えば、ブロックの値識別子は、もう１つのブロック、例えば、前のブロックと同一のものであるか、または、たいへん類似のものとすることが可能である。そのような場合において、前の辞書は可能な限り多くの回数、再使用される。
【００８８】
例えば、新たなブロック（例えば、続くブロック）内の値が前のブロック内の値と同一であるか、または、その部分集合を構成するならば、前のブロック辞書はそのまま使用することが可能であり、新たなブロックについて必要とされる符号化は、（同一のブロック辞書が再使用されるので）前のブロックと同じようにそのオフセットを設定することだけである。
【００８９】
続く３つの条件は、前のブロックと比較して追加のブロック識別子を有する続くブロックについての辞書の再使用の前に必要とされうる。続くブロックは前のブロック内に現れる値への追加の１つまたは複数の値を含み、これをN追加値と呼ぶ。前のブロックがPビットを使用して符号化することができるM個の異なる値を含む。合計M+Nは2^Pより小さいかまたは等しく、追加のブロック識別子−値識別子の組は前の辞書に付加される。
【００９０】
新たな値は前の辞書に追加され、新たなブロックについてのオフセットは前のブロックと同じように設定される。この方法において、前の辞書への新たなエントリは、（前のブロックについてのブロック識別子−値識別子の組は変化しないので）前のブロックについての辞書の適用可能性を妨げるとは限らない。列内の多くのブロックが前のブロックと類似ならば、ブロック辞書の再使用は、列を記憶するために必要とされる領域を大きな率で減少させうる。
【００９１】
図９は、複数の列９０２にわたるデータの整列を表わすテーブル９００のブロック図である。列９０２内の整列されたデータはブロックベクトル圧縮のために使用され、これは図８および図１０を参照して説明する。テーブル９００の列は、図５のホスト５０４のような複数のサーバにわたって広がる。概して、テーブル９００はデータの行９０４の列９０２を含み、１つまたは複数のデータの行は列９０２にわたってデータの依存関係を有する構造化データを表わす。例えば、ビジネスオブジェクトは結合されたテーブルの集合としてモデル化されうる。テーブル９００内のデータは列９０２にわたってデータの依存関係を有するので、列の整列はこれらの依存関係を考慮し、結果の整列に影響を与える。
【００９２】
テーブル９００内の整列されたデータは、できる限り多くの繰り返し値を一緒にグループにするようにデータが整列される、ブロックベクトル圧縮のための前提条件を表わす。列９０２の順序付けを最適化するようにテーブル９００を整列することは全体の行を整列し、他の列は結果としてより不規則になりうることが難点でありうる。テーブル９００内のデータの整列は、全ての関係するテーブルの列９０２のよい順序付けを生成するように行９０４が十分に整列される整列を表わす。様々な実用上の制約を与えられるので、技術を最適化する（例えば、順序付けされたブロックの数を最適化するように数学的な意味で最適する）必要はなく、高速に実行する堅固な発見的方法は想定するアプリケーションのために十分よい。
【００９３】
テーブル９００内のデータの整列は、ブロックベクトル圧縮に先立ってデータを整列するための多くの技術の１つである。テーブルの影のついた部分は、他の部分（例えば、同一の行の集合の他の列）の整列に起因する整列に加えて、整列が存在しない場所を示す。テーブル９００内のデータは、辞書を基にした圧縮の結果である値識別子である。
【００９４】
列９０８は、ブロックのラベルおよび行のラベルを含む、データの行９０４のためのラベルを含む。例えば、第１行９０６はブロックB1内に存在し、行１である。
【００９５】
テーブル９００内のデータは、第１列から第２列へ等、列９０２の系列の後方へ、列９０２を整列した結果である。列９０２は順序付けされていないが、ある実施形態において順序付けされうる。例えば、系列内のより後方の列についてブロックベクトル圧縮がより効果的であるように、より少ないユニークな値を有する列が値のより大きいグループを有することが期待されるので、より少ないユニークな値を有することが期待され、または、知られている列は、整列される一連の列内で、より前方に順序付けされる。また、ブロックベクトル圧縮は、全ての列について実行される必要はなく、ブロックベクトル圧縮から十分に利益を得るためにある指定された閾値基準を満たす列のような、選択された列のみに適用することが可能である。例えば、ブロックベクトル圧縮を使用して、または、使用しないで、列のための領域の要求条件の比較が行われ、ブロックベクトル圧縮の符号化および実行時のオーバーヘッドに影響を与えうる。領域の効率およびオーバーヘッドに関する計量は、特定の実装における１つまたは複数の列についてブロックベクトル圧縮を利用するか否かを判定するために比較される。
【００９６】
テーブル９００内のデータは、次のような列の整列の結果である。例において、テーブル９００は、５つの列A1からA5および35行を７つのブロックB1からB7に分割し、各々は５つの行を有し、各列のエントリは４つの可能な値を有し、値識別子０から３を使用して符号化される。続く列の整列に影響を及ぼす前の列の整列の結果を用いて、第１列A1から第５列A5まで列が整列される。特に、列A1は値識別子が上昇するように整列される。列A1内で一定の値識別子を有する任意のブロックは、第２列A2についてさらに整列するために利用可能である。テーブル９００内に、ブロックB1、B2、B4、B6、B7が存在する。例えば、ブロックB1は列A1内に全て‘0’のエントリを有する。列A2のブロックB1、B2、B4、B6、B7は、値識別子が上昇するように、各々、内部で整列される。一定のA2の値識別子を有する任意のブロックは、さらなる整列のために利用可能であり、ブロックB1およびB6が存在する。列A3のブロックB1およびB6は、値識別子が上昇するように、各々、内部で整列される。一定のA3の値識別子を有する任意のブロックは、さらなる整列のために利用可能であり、これはブロックB1を含む。列A4のブロックB1は、値識別子が上昇するように内部で整列される。ブロックB1はある一定のA4の値識別子を含まないので、さらなる整列は存在しない（すなわち、A5内での値識別子の整列はない）。
【００９７】
従って、概して、整列は、昇順または降順での整列のような、同一の値識別子を一緒にグループにするように第１列を整列することを含む。続く列について、前の列内に同一の値識別子を有するブロックのみが整列され、値識別子のグループが存在するようにそれらのブロックが整列される。前の列のブロックが同一の値識別子を有さなくなるまで整列は続く。
【００９８】
ある実装において、整列は、テーブルの更新を妨げる望ましくない影響を有しうる。これは、テーブルの行への効果的なランダムアクセスを必要とする。更新は、（上述した）別個の差分インデックスによって収集および処理され、差分インデックスは、定期的に（すなわち、非同期に）メインテーブルインデックスと結合される。結合処理は、テーブルインデックスを再構築することを含み、上述した整列順序は、テーブルの更新を妨げるとは限らない。特に、上述した差分インデックスのアプローチのような更新を処理するためのバッファリング方式とともに、列を再整列することを含む圧縮技術が実装される場合において、妨害であるとは限らない。
【００９９】
図１０は、データを圧縮する処理１０００のフローチャートである。処理１０００は図５のホスト５０４によって実現されうる。例えば、ホスト５０４の各々は、ホストが責任を持つデータの一部について処理１０００を実行する。圧縮されるデータは構造化ビジネスデータとすることが可能である。データのかなりの圧縮がコスト効果の高いデータのメモリ内の処理を可能とする（例えば、サーバ数または物理メモリ量が減少されうる）ので、データはメモリ内で圧縮および検索される。
【０１００】
概して、処理１０００はブロックベクトル圧縮と呼び、これはデータのブロック毎のベクトルへの圧縮と呼びうる。処理１０００は、値識別子の列を生成するために辞書を基にした圧縮により１つまたは複数のデータの列を圧縮すること（１００２）、値識別子を整列すること（１００４）、ブロック識別子を生成すること（１００６）、ブロック辞書を生成すること（１００８）、オフセット値を生成すること（１０１０）を含む。
【０１０１】
値識別子の列を生成するために辞書を基にした圧縮により１つまたは複数のデータの列が圧縮される（１００２）。辞書を基にした圧縮は、列内の値の基数に基づいて値識別子を表わす最小のビット数を使用する。
【０１０２】
値識別子が整列される（１００４）。値識別子の整列は、値識別子の複数の列を整列することを含み、さらに、例えば、図９を参照して説明したように、他の列の整列された値識別子に基づいて値識別子の列を整列することを含みうる。
【０１０３】
ブロック識別子が生成される（１００６）。ブロック識別子は選択された列内の値識別子の各ブロックについて生成される。例えば、ブロックベクトル圧縮を列に適用するように判定が行われ、列の各ブロックについてブロック識別子が生成され、各ブロックについてのユニークなブロック識別子がブロック内の各々のユニークな値識別子について生成され、同一の値識別子について同一のブロック識別子が使用される。
【０１０４】
ブロック辞書が生成される（１００８）。ブロック辞書は各ブロックについて生成され、各ブロック辞書についてブロック識別子が値識別子と対応付けされ、ブロック識別子はブロックの範囲内の各々のユニークなブロック識別子のために含まれるのみである。例えば、図８を参照すると、第１ブロック８２８についてのブロック辞書は、１つのユニークなブロック識別子‘0’を有する（８３８）。
【０１０５】
複数のブロック辞書はブロック辞書の列内に含まれうる。例えば、図８を参照すると、複数のブロック辞書がブロック辞書の列８１４内に含まれている。
【０１０６】
ブロック辞書は再使用されうる。例えば、１つのブロックについてのブロック辞書は、（上述したように）同一のブロック識別子を有する、または、追加のブロック識別子を有する続くブロックについて再使用されうる。
【０１０７】
オフセット値が生成される（１０１０）。オフセット値はブロック辞書の列内でブロックが開始する場所を示し、オフセット値は、ブロックベクトル内のブロック識別子と対応付けされる。オフセット値は、（例えば、ブロックベクトルの列８２２と対応付けされたオフセット値を有するオフセット値８２０の列によって表わされているように、）ブロックベクトルのベクトルと対応付けされるブロックのオフセットの列内に含まれる。
【０１０８】
図１０はある組合せおよびある種類の部分処理を含むが、処理１０００、ブロックベクトル圧縮、または、両方は、より少ない、異なる、または、追加の部分処理を含みうる。例として、全ての列が整列される必要はなく、全ての列がブロックベクトル圧縮によって圧縮される必要はなく、列の辞書を基にした圧縮は全てのまたは任意の列について実行される必要はなく、列の整列は他の列の整列の結果に依存する必要はなく、ブロック辞書は再使用することが可能であり、追加の部分処理は１つまたは複数のデータの列のクエリーを受信することを含むことが可能であり、ブロックベクトルはクエリーの基準を照合するデータを見つけるためにブロック辞書とともに使用することが可能であり、差分バッファが使用され、ブロックベクトルを使用して並列に差分バッファが検索されることが可能であり、差分バッファからの結果は他の結果とともに結合されることが可能であり、ブロックベクトル、ブロック辞書、オフセット値は記憶することが可能であり、オフセット値は生成されないことが可能である、等。
【０１０９】
各図面は特徴の一定の組み合わせを説明しているが、実装は多様でありうる。例えば、図５のシステム５００には追加の、異なる、または、より少ない構成要素が含まれうる。
【０１１０】
ここで説明された発明は、この明細書で開示された構造的手段およびその構造的な等価物を含む、デジタル電子回路で、または、コンピュータソフトウェア、ファームウェア、または、ハードウェアで、または、それらの組合せで、実現することができる。ここで説明された発明は、１つまたは複数のコンピュータプログラム製品、すなわち、データ処理装置、例えば、プログラム可能なプロセッサ、１つまたは複数のコンピュータによる実行のために、または、それらの動作を制御するために、情報運搬体の中に、例えば、機械読み取り可能な記憶装置または伝搬信号の中に、有形に実現された１つまたは複数のコンピュータプログラムとして実現することができる。コンピュータプログラム（プログラム、ソフトウェア、ソフトウェアアプリケーション、または、コードとしても知られる）は、コンパイル言語またはインタプリタ言語を含む任意の形態のプログラミング言語で書くことができ、スタンドアロンプログラム、または、モジュール、コンポーネント、サブルーチン、または、コンピュータ環境で使用するために適切な他のユニットを含む任意の形態で配備することができる。１つのコンピュータプログラムは１つのファイルに対応するとは限らない。１つのプログラムは、他のプログラムまたはデータを保持するファイルの一部に、当該プログラム専用の１つのファイルに、または、複数の統合されたファイル（１つまたは複数のモジュール、サブプログラム、または、コードの一部を記憶するファイル）に、記憶することができる。コンピュータプログラムは、１つのコンピュータ上で、または、１つのサイトまたは複数のサイトにわたって分散され通信ネットワークによって相互接続された複数のコンピュータ上で、実行されるように配備することができる。
【０１１１】
ここで説明された発明の方法のステップを含む、この明細書で説明された処理およびロジックのフローは、入力データについて動作して出力を生成することによってここで説明された発明の機能を実行する１つまたは複数のコンピュータプログラムを実行する１つまたは複数のプログラム可能なプロセッサによって実行することが可能である。また、処理およびロジックのフローは、特定目的のロジック回路、例えば、ＦＰＧＡ（field programmable gate array）またはＡＳＩＣ（application-specific integrated circuit）によって実行することができ、ここで説明された発明の装置は、特定目的のロジック回路、例えば、ＦＰＧＡまたはＡＳＩＣとして実現することができる。
【０１１２】
コンピュータプログラムの実行のために適切なプロセッサは、例として、汎用のおよび特定目的のマイクロプロセッサの両方、および、任意の種類のデジタルコンピュータの１つまたは複数のプロセッサを含む。一般に、プロセッサは、リードオンリメモリまたはランダムアクセスメモリまたは両方から命令およびデータを受け取る。コンピュータの必須の要素は、命令を実行するためのプロセッサ、および、命令およびデータを記憶するための１つまたは複数のメモリ装置である。また、一般に、コンピュータは、データを受信または送信し、または、送受信するために、データを記憶するための１つまたは複数の大容量記憶装置、例えば、磁気ディスク、光磁気ディスク、または、光ディスクを含み、または、動作可能に結合される。コンピュータプログラムの命令およびデータを実装するために適切な媒体は、全ての形態の揮発性メモリ（例えば、ランダムアクセスメモリ）、または、例として、半導体メモリ装置、例えば、ＥＰＲＯＭ（erasable programmable read only memory）、ＥＥＰＲＯＭ（electrically erasable programmable read only memory）、フラッシュメモリ装置、磁気ディスク、例えば、内蔵ハードディスクまたは取り外し可能なディスク、光磁気ディスク、ＣＤ−ＲＯＭ（compact disc read only memory）、ＤＶＤ−ＲＯＭ（digital versatile disc read only memory）ディスクを含む不揮発性メモリを含む。プロセッサおよびメモリは、特定目的のロジック回路を補い、または、特定目的のロジック回路に組み込むことができる。
【０１１３】
ユーザとの相互作用を提供するために、ここで説明された発明は、ユーザへの情報を表示するための表示装置、例えば、ＣＲＴ（cathode ray tube）またはＬＣＤ（liquid crystal display）モニタ、および、ユーザがコンピュータへの入力を与えることができるキーボード、ポインティングデバイス、例えば、マウスまたはトラックボールを有するコンピュータ上に実現することができる。ユーザとの相互作用を提供するために他の種類の装置を使用することもでき、例えば、ユーザに与えられるフィードバックは、任意の形態の知覚フィードバック、例えば、視覚フィードバック、聴覚フィードバック、または、触覚フィードバックとすることができ、ユーザからの入力は、音響、音声、または、触覚の入力を含む任意の形態で受信することができる。
【０１１４】
ここで説明された発明は、バックエンドコンポーネント（例えば、データサーバ）、ミドルウェアコンポーネント（例えば、アプリケーションサーバ）、または、フロントエンドコンポーネント（例えば、ユーザがここで説明された発明の実装と相互作用することができるグラフィカルユーザインタフェースまたはウェブブラウザを有するクライアントコンピュータ）、または、そのようなバックエンド、ミドルウェア、フロントエンドコンポーネントの任意の組み合わせを含むコンピュータシステム内に実現することができる。システムのコンポーネントは、デジタルデータ通信、例えば、通信ネットワークの任意の形態または媒体によって相互接続することができる。通信ネットワークの例は、ローカルエリアネットワーク（“ＬＡＮ”）および広域ネットワーク（“ＷＡＮ”）、例えば、インターネットを含む。
【０１１５】
コンピュータシステムはクライアントおよびサーバを含む。クライアントおよびサーバは、一般に、論理的な意味で互いから離れ、典型的に、通信ネットワークを通して相互作用する。クライアントおよびサーバの関係は、それぞれのコンピュータ上で実行し、互いにクライアント−サーバの関係を有するコンピュータプログラムによって生じる。
【０１１６】
ここで説明された発明は、特定の実施形態に関して説明されたが、他の実施形態を実現することができ、請求項の範囲内にある。例えば、動作が異なっても所望の結果を達成することができる。ある実施形態において、マルチタスクおよび並列処理が好ましい。他の実施形態は請求項の範囲内にある。
【図面の簡単な説明】
【０１１７】
【図１Ａ】構造化データのテーブル、そのテーブルの列についての辞書、属性テーブル、メインインデックスを表わすブロック図である。
【図１Ｂ】構造化データのテーブル、そのテーブルの列についての辞書、属性テーブル、差分インデックスを表わすブロック図である。
【図１Ｃ】メインおよび差分インデックスからの結果の集合の生成を表わす例である。
【図２Ａ】構造化データのテーブルを表わすブロック図である。
【図２Ｂ】構造化データのテーブルを表わすブロック図である。
【図３】属性およびキー数値の基数を表わすテーブルである。
【図４Ａ】ベクトルを基にした圧縮により圧縮される列を表わすブロック図である。
【図４Ｂ】ベクトルを基にした圧縮により圧縮される列を表わすブロック図である。
【図５】データを圧縮し、圧縮されたデータを検索するシステムを表わすブロック図である。
【図６】複数の列にわたるデータの整列を表わすテーブルのブロック図である。
【図７Ａ】データを圧縮し、圧縮されたデータの検索を可能とする処理を表わすフローチャートである。
【図７Ｂ】データを圧縮し、圧縮されたデータの検索を可能とする処理を表わすフローチャートである。
【図８】圧縮された辞書を使用したデータの列の圧縮を表わすブロック図である。
【図９】複数の列にわたるデータの整列を表わすテーブルのブロック図である。
【図１０】データを圧縮する処理のフローチャートである。
【符号の説明】
【０１１８】
１０５、１７０  テーブル
１１０、１７２  辞書
１１５、１７４  属性テーブル
１２０  メインインデックス
１２５  列
１３０、１３５、１５０  値識別子
１４０  文書識別子
１４５  文書識別子リスト
１７６  差分インデックス
５００  システム
５０２  検索エンジン管理ツール
５０４、５０８、５１０  ホスト
５０６  記憶装置
５１２  インデックス
５１４、５１８  論理インデックス
５１６  圧縮された列の集合
５２０  列
５２２  差分バッファ
８０２、８０６  列
８１０  ブロック識別子のベクトル
８１４  ブロック辞書の列
８１６、８２２  ブロック識別子の列
８１８  値識別子の列
８２０  オフセット値の列
【図１Ａ】
2008287723.tif 000003
【図１Ｂ】
2008287723.tif 000004
【図１Ｃ】
2008287723.tif 000005
【図２Ａ】
2008287723.tif 000006
【図２Ｂ】
2008287723.tif 000007
【図３】
2008287723.tif 000008
【図４Ａ】
2008287723.tif 000009
【図４Ｂ】
2008287723.tif 000010
【図５】
2008287723.tif 000011
【図６】
2008287723.tif 000012
【図７Ａ】
2008287723.tif 000013
【図７Ｂ】
2008287723.tif 000014
【図８】
2008287723.tif 000015
【図９】
2008287723.tif 000016
【図１０】
2008287723.tif 000017