(57)【要約】【課題】ＣＰＵリソースの消費を抑制し、データベースの操作において効率を向上させる。【解決手段】情報処理装置は、テーブルが記憶するレコードの値を集計する情報処理装置であって、メモリ上に確保する領域を所定数の桁ごとに分割した複数の分割領域にそれぞれ集計対象の値を保持させることにより、それぞれの前記集計対象の値を組み合わせた合成値の圧縮値を生成する圧縮部と、複数の圧縮値を集計した集計圧縮値を算出する圧縮値集計部と、集計圧縮値に含まれる分割領域の各々の値を集計して集計値を生成する集計部とを有する。【選択図】図１
2015172823.tif 000002
【特許請求の範囲】
【請求項１】
テーブルが記憶するレコードの値を集計する情報処理装置であって、
メモリ上に確保する領域を所定数の桁ごとに分割した複数の分割領域にそれぞれ集計対象の値を保持させることにより、それぞれの前記集計対象の値を組み合わせた合成値の圧縮値を生成する圧縮部と、
複数の前記圧縮値を集計した集計圧縮値を算出する圧縮値集計部と、
前記集計圧縮値に含まれる前記分割領域の各々の値を集計して集計値を算出する集計部と、
を有する情報処理装置。
【請求項２】
前記圧縮部は、前記圧縮値集計部が前記圧縮値を集計する際に前記分割領域をまたいで桁上がりが発生しない前記圧縮値の集計単位であるブロックと関連付けて前記圧縮値を生成し、
前記圧縮値集計部は、前記ブロックごとに前記集計圧縮値を算出する
請求項１に記載の情報処理装置。
【請求項３】
前記集計対象の値は、前記メモリ上において前記テーブルの列ごとに保持される
請求項１又は２に記載の情報処理装置。
【請求項４】
前記圧縮部は、前記集計対象の値が所定の閾値以上である場合、又は前記集計対象の値が所定の数の倍数でない場合、当該集計対象の値を前記メモリ上の前記分割領域とは異なる特異値用領域に保持させ、
前記集計部は、前記集計圧縮値と前記特異値用領域の値とをさらに集計する
請求項１から３のいずれか一項に記載の情報処理装置。
【請求項５】
前記圧縮部は、前記集計対象の値を相対値に変換して前記分割領域に保持させるための差分を示す基準値又は倍率を含む管理情報を用いて前記集計対象の値を前記相対値に変換し、当該相対値を前記分割領域に保持させた圧縮値を生成し、
前記集計部は、生成した前記集計値を、前記管理情報を用いてさらに変換する
請求項１から４のいずれか一項に記載の情報処理装置。
【請求項６】
前記圧縮部は、前記分割領域が保持する値がＮＵＬＬ値か否かを示す情報をさらに記憶させる
請求項１から５のいずれか一項に記載の情報処理装置。
【請求項７】
前記圧縮部は、前記圧縮値を生成するとともに集計対象の値の最大値又は最小値を記憶部に記憶させ、
前記集計部は、最大値又は最小値の問合せを受けた場合、前記記憶部に記憶されている最大値又は最小値を用いて最大値又は最小値を求める
請求項１から６のいずれか一項に記載の情報処理装置。
【請求項８】
前記圧縮部は、前記レコードごとに部分的な集計値を算出し、当該部分的な集計値を集計対象の値として圧縮値を生成する
請求項１から７のいずれか一項に記載の情報処理装置。
【請求項９】
前記テーブルにおいて、実質的なレコードの識別情報と対応付けて、カラムの識別情報と当該カラムに登録される値とを異なるレコードに記憶している場合、前記集計対象の値は、前記メモリ上において前記カラムごとに保持される
請求項１から８のいずれか一項に記載の情報処理装置。
【請求項１０】
テーブルが記憶するレコードの値を集計する情報処理方法であって、
メモリ上に確保する領域を所定数の桁ごとに分割した複数の分割領域にそれぞれ集計対象の値を保持させることにより、それぞれの前記集計対象の値を組み合わせた合成値の圧縮値を生成するステップと、
複数の前記圧縮値を集計した集計圧縮値を算出するステップと、
前記集計圧縮値に含まれる前記分割領域の各々の値を集計して集計値を算出するステップと、
をコンピュータが実行する情報処理方法。
【請求項１１】
テーブルが記憶するレコードの値を集計するプログラムであって、
メモリ上に確保する領域を所定数の桁ごとに分割した複数の分割領域にそれぞれ集計対象の値を保持させることにより、それぞれの前記集計対象の値を組み合わせた合成値の圧縮値を生成するステップと、
複数の前記圧縮値を集計した集計圧縮値を算出するステップと、
前記集計圧縮値に含まれる前記分割領域の各々の値を集計して集計値を算出するステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、情報処理装置、情報処理方法及びプログラムに関する。
【背景技術】
【０００２】
従来、データの圧縮効率を向上させることができるカラムナデータベース（列指向データベース）が提案されている。このような技術によれば、入出力（Ｉ／Ｏ：Input/Output）データを削減することができる。例えば、列ベースデータに対し、辞書符号化および／または値符号化を適用して整数のシーケンスを作成し、次にランレングス符号化・ビットパッキング圧縮のアルゴリズムによってデータをさらにコンパクトにするという技術が提案されている（例えば、特許文献１）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特表２０１１−５３０２３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来の技術は、入出力処理のボトルネックを解消するという観点でメリットがある一方、圧縮及び展開にＣＰＵ（Central Processing Unit）リソースを消費する。また、近年
はレジスタやバスが６４ｂｉｔのＣＰＵが一般化しつつあり、メモリ容量も増加しているが、ＣＰＵのクロック数はそれほど大幅には向上していない。
【０００５】
そこで、本発明は、ＣＰＵリソースの消費を抑制し、データベースの操作において効率を向上させることを目的とする。
【課題を解決するための手段】
【０００６】
本発明に係る情報処理装置は、テーブルが記憶するレコードの値を集計する情報処理装置であって、メモリ上に確保する領域を所定数の桁ごとに分割した複数の分割領域にそれぞれ集計対象の値を保持させることにより、それぞれの前記集計対象の値を組み合わせた合成値の圧縮値を生成する圧縮部と、複数の圧縮値を集計した集計圧縮値を算出する圧縮値集計部と、集計圧縮値に含まれる分割領域の各々の値を集計して集計値を生成する集計部とを有する。
【０００７】
このようにすれば、圧縮値を集計することにより、各分割領域に保持された集計対象の値をまとめて処理できるため、計算回数が低減される。すなわち、ＣＰＵリソースの消費が抑制されるとともに、集計処理というデータベースの操作において効率を向上させることができる。
【０００８】
また、圧縮部は、圧縮値集計部が圧縮値を集計する際に分割領域をまたいで桁上がりが発生しない圧縮値の集計単位であるブロックと関連付けて圧縮値を生成し、圧縮値集計部は、ブロックごとに集計圧縮値を算出するようにしてもよい。圧縮値を集計する際に分割領域の所定数の桁を超えて桁上がりが発生しないよう、例えば集計対象ごとに各ブロックに保持する集計対象の値の個数（ひいては圧縮値の個数）を制限することにより、集計の誤りを抑制できるようになる。
【０００９】
また、集計対象の値は、メモリ上においてテーブルの列ごとに保持されるようにしてもよい。いわゆるカラムナ型のインメモリデータベースを処理対象とする場合、例えば特定
の列に保持された値を集計対象とするようなときに効率よく圧縮処理を行うことができるようになる。
【００１０】
また、圧縮部は、集計対象の値が所定の閾値以上である場合、又は集計対象の値が所定の数の倍数でない場合、当該集計対象の値をメモリ上の分割領域とは異なる特異値用領域に保持させ、集計部は、集計圧縮値と特異値用領域の値とをさらに集計するようにしてもよい。このようにすれば、分割領域の所定数の桁には収まらないような値を分けて処理することができる。すなわち、処理の正確性を損なわないように、処理効率を向上させることができる。
【００１１】
また、圧縮部は、集計対象の値を相対値に変換して分割領域に保持させるための差分を示す基準値又は倍率を含む管理情報を用いて集計対象の値を相対値に変換し、当該相対値を分割領域に保持させた圧縮値を生成し、集計部は、生成した集計値を、管理情報を用いてさらに変換するようにしてもよい。このようにすれば、分割領域の限られた桁数を有効に利用できるようになる。
【００１２】
また、圧縮部は、分割領域が保持する値がＮｕｌｌ値か否かを示す情報をさらに記憶させるようにしてもよい。このような情報を用いれば、例えば集計部は分割領域に保持された値がＮｕｌｌ値かそれ以外かを判断することができるようになる。なお、Ｎｕｌｌ又は０（ゼロ）であるか否かを示す情報（例えばフラグ）をさらに記憶させるようにしてもよい。
【００１３】
また、圧縮部は、圧縮値を生成するとともに集計対象の値の最大値又は最小値を記憶部に記憶させ、集計部は、最大値又は最小値の問合せを受けた場合、記憶部に記憶されている最大値又は最小値を用いて最大値又は最小値を求めるようにしてもよい。このようにすれば、最大値又は最小値を要求された場合のレスポンスを向上させることができる。なお、最大値又は最小値は、上記のブロックごとに記憶させておくようにしてもよい。
【００１４】
また、圧縮部は、レコードごとに部分的な集計値を算出し、当該部分的な集計値を集計対象の値として圧縮値を生成するようにしてもよい。後述するファンクションキャッシュとして説明する通り、レコードごとに部分的な集計値を算出して圧縮しておけば、集計の要求に対するレスポンスを向上させることができるのはもちろんのこと、一部のレコードについて集計の要求があった場合にも対応可能な構成となる。
【００１５】
また、テーブルにおいて、実質的なレコードの識別情報と対応付けて、カラムの識別情報と当該カラムに登録される値とを異なるレコードに記憶している場合、集計対象の値は、メモリ上においてカラムごとに保持されるようにしてもよい。テーブルをメモリ上に展開する際にデータ構造を変更することにより、集計処理の効率を向上させることができる。
【００１６】
上記課題を解決するための手段の内容は、本発明の課題や技術的思想を逸脱しない範囲で可能な限り組み合わせることができる。また、上記手段をコンピュータが実行する方法を実施したり、上記手段をコンピュータに実行させるプログラムを提供等したりするようにしてもよい。プログラムは、コンピュータが読み取り可能な記録媒体に記録して提供するようにしてもよい。コンピュータが読み取り可能な記録媒体とは、情報を電気的、磁気的、光学的、機械的、又は化学的作用によって蓄積し、コンピュータによって読み取ることができる記録媒体をいう。このような記録媒体のうち、コンピュータから取り外し可能なものとしては、例えば光ディスク、光磁気ディスク、フレキシブルディスク、磁気テープ、メモリカード等がある。また、コンピュータに固定された記録媒体としてＨＤＤ（Hard Disk Drive）、ＳＳＤ（Solid State Drive）、ＲＯＭ（Read Only Memory）等がある
。
【発明の効果】
【００１７】
本発明によれば、ＣＰＵリソースの消費を抑制し、データベースの操作において効率を向上させることができる。
【図面の簡単な説明】
【００１８】
【図１】情報処理装置の一例を示す機能ブロック図である。
【図２】集計対象の値と圧縮値との関係を説明するための図である。
【図３】集計対象の値と圧縮値との関係を２進数で説明するための図である。
【図４Ａ】圧縮値の集計処理を説明するための図である。
【図４Ｂ】圧縮値の集計処理を説明するための図である。
【図５】集計特化型形式でカラムデータを保持する際に記憶されるデータの一例を説明するための図である。
【図６Ａ】昇順にソートされたカラムの値の一例を示す図である。
【図６Ｂ】圧縮されたカラムの値の一例を示す図である。
【図６Ｃ】圧縮されたカラムの値の一例を示す図である。
【図７】コンピュータの一例を示す装置構成図である。
【図８Ａ】圧縮処理の一例を示す処理フロー図である。
【図８Ｂ】圧縮処理の一例を示す疑似的なソースコードの一例である。
【図９Ａ】集計処理の一例を示す処理フロー図である。
【図９Ｂ】集計処理の一例を示す疑似的なソースコードの一例である。
【図１０】メモリ上にキャッシュとして仮想的なカラムを設ける例を説明するための図である。
【図１１】分散処理を行うシステムの一例を示すシステム構成図である。
【図１２】仮想的な１つのテーブルと登録されたレコードの一例を示す図である。
【図１３】複数のノードのメモリに展開されたカラムデータの例を示す図である。
【図１４】汎用的なデータ構造を実現する目的で設計されたテーブルの一例である。
【図１５】変換後のテーブルの一例である。
【発明を実施するための形態】
【００１９】
以下、図面を参照して本発明を実施するための形態について説明する。以下の実施の形態の構成は例示であり、本発明は実施の形態の構成に限定されない。
【００２０】
＜機能構成＞
図１は、情報処理装置の一例を示す機能ブロック図である。図１の情報処理装置１は、ＤＢＭＳ（DataBase Management System：データベース管理システム）１１と、内部記憶１２と、圧縮部１３と、集計部１４と、入出力部１５を有する。
【００２１】
ＤＢＭＳ１１は、データベース（例えば、ＲＤＢ（Relational Database））の運用管
理に必要な機能を提供するシステムであり、物理テーブル１１１と、データ操作部１１２とを有する。物理テーブル１１１は、所定のデータ構造（スキーマ）で物理的なファイルとしてデータレコード（「永続データ」とも呼ぶ）を格納する不揮発性の記憶装置である。また、データ操作部１１２は、レコードの挿入（登録）、レコードの選択（検索）、レコードの更新、レコードの削除等の操作を物理テーブル１１１に対して行う。なお、ＤＢＭＳ１１は、様々なベンダーが提供する既存の製品を利用することができる。また、物理テーブル１１１は、例えばＣＳＶファイルのような、デリミタ（分離記号）によって列（カラム）が区切られ、改行によってレコードが区切られる形式（Character-Separated Values、Delimiter-Separated Values等とも呼ぶ）のファイル、又はその他の形式のファイルに置き換えてもよい。
【００２２】
内部記憶１２は、主記憶装置（「メモリ」とも呼ぶ）である。情報処理装置１は、物理テーブル１１１から読み出した情報を内部記憶１２に保持（ロード）して処理を行う。すなわち、いわゆるインメモリデータベースのような形式となっている。また、本実施形態では、テーブルのカラム（列）ごとに値をまとめてメモリ上に保持する。すなわち、いわゆるカラムナ型データベースのような形式となっている。なお、内部記憶１２のデータ（一時データ）の更新については既存の技術を利用することができる。例えば、定期的に物理テーブル１１１からレコードを読み出して内部記憶１２に保持するようにしてもよい。また、定期的に差分のみ内部記憶１２に反映させるようにしてもよい。また、物理テーブル１１１のレコードが更新された場合に同期して内部記憶１２を更新するようにしてもよい。
【００２３】
圧縮部１３は、物理テーブル１１１に登録されているレコードに含まれる値を圧縮して内部記憶１２に読み出す。本実施形態では、レコードに含まれる値を集計対象として、集計（合算）処理を行う場合を主な例として説明する。本実施形態に係る集計処理に特化した圧縮方式では、内部記憶に展開する値を所定数の桁ごとに区切った複数の分割領域に分割し、当該分割領域の各々に集計対象の値を保持させた圧縮値を生成する。
【００２４】
図２に、集計対象の値と圧縮値との関係を示す。図２には、集計対象の値「１」、「２」、「３」及び「４」と、圧縮値「０００１０００２０００３０００４」との対応付けが示されている。圧縮値は、プログラム上の変数に対応してメモリ上に確保される領域であり、例えば情報処理装置１が備えるＣＰＵのビット幅に基づきまとめて処理可能な最大の桁数を確保する。例えば、６４ビット、３２ビット等の領域が確保される。なお、圧縮値としてＣＰＵが処理可能な最大の桁数より小さい領域を確保するようにしてもよい。
【００２５】
また、圧縮値は、利用上、所定の桁数ごとの分割領域に分割され、各分割領域が集計対象の値を保持する。図２の例では、１６桁の圧縮値が４桁の分割領域４つに分割されている。ここで、集計対象の値も、テーブルのカラムにおいて記憶できる桁数（データ長）は、圧縮値を保持するためにメモリ上に確保される桁数と同程度であってもよい。ただし、本実施形態では、分割領域の桁数は集計対象の値の桁数以下となるように決定される。すなわち、圧縮値とは、集計対象の値を組み合わせた合成値を圧縮した値であるといえる。
【００２６】
本実施形態では、複数の値を圧縮して加算することにより、加算処理の回数を低減させる。ここで、テーブルの各カラムは、その用途上、格納される値の範囲がある程度限定されることも多い。本実施形態では、各分割領域の桁数（換言すれば、圧縮値の分割数）及び圧縮値を加算する回数を、各分割領域において桁あふれ（分割領域をまたぐ桁上がり。「オーバーフロー」とも呼ぶ）を起こさない範囲で予め設定するものとする。各分割領域の桁数及び圧縮値を加算する回数は、予め設定された固定値としてもよいし、適切な値を情報処理装置１が最適化するようにしてもよい。なお、桁あふれを防ぐため、所定の条件を満たしていない値（例えば基準の値から統計的に大きく外れた値や所定の数の倍数でない値等（「特異値」とも呼ぶ））については圧縮せずに加算するようにしてもよい。
【００２７】
また、集計対象の値は、図示していないインデックスと関連付けられているものとする。インデックスは、レコードとの対応付けを表す情報であり、例えばテーブルから読み出した順序に基づいて、同一のレコードに属する値を各カラムにおいて特定できるようにする。インデックスを用いることにより、メモリ上でカラムごとにデータを保持する場合であっても、カラム間においてレコードの順序を維持しつつ様々な処理を行うことができる。
【００２８】
なお、図２の例では、説明の便宜上、１０進数で表した圧縮値の桁を分割領域に区切っ
ているが、実装上は２進数における桁を分割領域に区切るものとする。圧縮値を２進数で扱えば、各分割領域に集計対象の値を格納する処理をビットシフトによって行うことができるため処理効率がよい。図３は、集計対象の値と圧縮値との関係を２進数で説明するための図である。図３の例では、集計対象の値「１」、「１０」、「１１」及び「１００」が示されている。また、圧縮値は６４ｂｉｔ、各分割領域は１６ｂｉｔであるものとする。このとき、集計対象の値「１」を４８ｂｉｔ左シフトした値と、集計対象の値「１０」を３２ｂｉｔ左シフトした値と、集計対象の値「１１」を１６ｂｉｔ左シフトした値と、集計対象の値「１００」とを加算した値が、圧縮値に格納される。
【００２９】
集計部１４は、物理テーブル１１１に含まれる値を集計する。詳細には、複数の圧縮値を集計するための集計部（圧縮値集計部とも呼ぶ）と、集計した圧縮値を上記の分割領域に分割して各分割領域の値を集計するための集計部とを含む。なお、集計部は、合計値のほか、最大値、最小値、平均値等を求める処理を行うようにしてもよい。
【００３０】
図４Ａ及び図４Ｂは、圧縮値の集計処理を説明するための図である。集計対象の値は、「１」〜「２０」の２０個であり、圧縮値の分割領域に保持されている。図４Ａの例では、圧縮値「１０００２０００３０００４」、「５０００６０００７０００８」、「９００１０００１１００１２」、「１３００１４００１５００１６」及び「１７００１８００１９００２０」を加算し、下段の二重枠で囲まれた合計値（「集計圧縮値」とも呼ぶ）「４５００５０００５５００６０」を算出する。さらに、図４Ｂに示すように、集計圧縮値を各分割領域の値「４５」、「５０」、「５５」及び「６０」に分解して集計し、右列の二重枠で囲まれた集計値「２１０」を算出する。図４Ａの加算において分割領域をまたぐ桁上がりは生じていないため、このような計算を行っても正しい結果が得られる。
【００３１】
図４Ａでは、圧縮値の加算を４回行っている。また、図４Ｂでは、各分割領域の値の加算を３回行っている。すなわち、集計対象の２０個の値について１９回の加算処理を繰り返す場合と比較し、ＣＰＵリソースの消費を抑制することができる。
【００３２】
なお、本実施形態では、オーバーフローが生じないように圧縮値を生成する圧縮処理を予め行っておくことで、集計処理の要求に対するレスポンスを向上させる。これを実現するため、各分割領域に登録される値が集計処理（特に図４Ａに示した処理）においてオーバーフローが生じない程度の個数となるように、図４Ａに示した集計処理を行う単位である「ブロック」を定義してもよい。
【００３３】
図５は、本実施形態に係る集計特化型形式でカラムデータを保持する際に記憶されるデータの一例を説明するための図である。図５の形式は本実施形態に係る集計処理の対象となるカラムに適用される。なお、物理テーブル上の他のカラムは、他の圧縮形式で保持するようにしてもよい。図５の例では、カラムデータは、複数のブロック（ブロック１、ブロック２・・・）を含んでいる。また、各ブロックには、値を分割領域に分けて保持する圧縮データ領域と、圧縮データ領域に登録していない値を保持する特異値領域と、当該ブロックに関する情報を保持するメタ情報とを含む。そして、物理テーブルのカラムに登録されている値は、例えばオーバーフローが生じると判断される場合にはブロックを切り替えつつ、順にいずれかのブロックに保持される。
【００３４】
なお、ブロック内の圧縮データ領域において、例えばまず１行目の左から右へ、次に２行目の左から右へ・・・といった順に図示していない通し番号であるインデックスが対応付けられているものとする。インデックスにより、例えば物理テーブルから読み出した順序を複数のカラムの間で維持できるようにする。また、特異値領域には、圧縮データ領域のインデックスと対応付けて値が保持され、対応するインデックスの圧縮データ領域には値として例えば０が保持される。なお、図５の例では当該ブロックにおける通し番号をイ
ンデックスとして用いているが、例えば圧縮データ領域における行及び列を用いた座標で表してもよい。例えば、図５におけるインデックス「６」を、「（２，２）」という座標で表し、図５におけるインデックス「１０」を、「（３，２）」という座標で表すようにしてもよい。
【００３５】
図５に示すようなカラムデータを用いて、例えば、物理テーブルからレコードを抽出した順に若い番号の圧縮データ領域に登録する。同時に、ブロック内の分割領域毎に値を集計し、分割領域の桁数におけるオーバーフローの発生を事前に検出する。そして、分割領域に割り当てられた桁数ではオーバーフローが生じると判断される場合には、例えばブロックを変更して値を登録するようにする。
【００３６】
また、ブロックごとに「倍率」及び「基準値」を定めておき、圧縮値の分割領域には、定められた倍率で除した値と基準値との差分を保持するようにしてもよい。例えば、図５のメタ情報の欄に示すように倍率が１００、基準値が２５の場合、物理データベース上の値「２６００」は、１／１００倍され、さらに基準値２５を減じた値「１」として圧縮データ領域に登録される。すなわち、基準値とは元の値との差であり、倍率とは元の値に戻す際に乗じる数である。このような倍率又は基準値を用いることで、圧縮データ領域の桁数よりも大きな数を扱うことができるようになる。
【００３７】
さらに、圧縮データ領域に格納できない「特異値」を、圧縮データ領域とは別の領域に登録するようにしてもよい。特異値とは、例えば、上述の倍率で割り切れない数や、上述の基準値よりも小さい数、倍率や基準値を用いても分割領域に収まらない桁数の数等をいうものとする。ただし、特異値が多いと集計処理の効率が向上しないため、特異値には出現頻度が低い値を登録することが好ましい。例えば、統計的に他の値から大きく外れた外れ値によって上述のオーバーフローの発生が事前に検出された場合、当該外れ値を特異値として特異値領域に保持する。なお、外れ値は、既存の統計的手法により算出できる優位点よりも検定統計量が大きいか否かで判断することができる。
【００３８】
以上のような分割領域の桁数、圧縮データ領域に保持する値の数、倍率、基準値等は、予め定めておくようにしてもよいし、後述する圧縮処理の中で最適化するようにしてもよい。また、ブロックごとに分割領域の桁数、圧縮データ領域に保持する値の数、倍率、基準値等は異なるようにしてもよい。特異値の数が所定の閾値を越える場合、倍率や基準値、分割領域の桁数を変更したり、ブロックを分けたりして圧縮処理を最適化してもよい。最適化は、例えば集計処理における計算回数を表す目的関数を最小にするように、様々な手法により行うことができる。最適化のため、例えば図５に示す集計特化型形式で保持するカラムで予め物理テーブルのレコードをソートしておき、ブロックごとに基準値との差が小さくなるようにしてもよい。また、所定の数の倍数ごとにブロック分けできるよう、レコードの順序を変更するようにしてもよい。
【００３９】
例えば物理テーブルのあるカラムに登録された値を昇順にソートすると、図６Ａに示す通りであったとする。図６Ａの表には、１、２、３、４、５、６、７、８、９、１０、１１、１２、７０００、７００３、１０１００及び２００３１の１６個の値が昇順に登録されている。図６Ａのような値について所定の手法によりデータの特性を判断し、例えば、値のばらつき（標準偏差）が大きい場合であって、一部の値を特異値領域に保持するよりもブロックを分けて分割領域に登録する方が好ましいと判断されたとき、図６Ｂに示すブロック１、及び図６Ｃに示すブロック２のように圧縮される。図６Ｂのブロック１は、圧縮データ領域の分割数が４、分割領域の桁数が４となっており、図４Ａに示した加算処理の回数は２となる。図６Ｃのブロック２は、圧縮データ領域の分割数が２、分割領域の桁数が８となっており、図４Ａに示した加算処理の回数は１となる。
【００４０】
入出力部１５は、ＤＢに対する操作の要求を受け付けたり、結果を応答したりする。例えば、物理テーブル１１１の所定のカラムについて集計値を求める要求を受け、集計部１４が集計した結果の値を出力する。入出力部１５は、情報処理装置１において実行される図示していないアプリケーションとの間で入出力処理を行ってもよいし、図示していないネットワークを介して他のコンピュータとの間で入出力処理を行ってもよい。
【００４１】
＜装置構成＞
図７は、コンピュータの一例を示す装置構成図である。情報処理装置１は、例えば図７に示すようなコンピュータである。図７に示すコンピュータ１０００は、ＣＰＵ（Central Processing Unit）１００１、主記憶装置１００２、補助記憶装置１００３、通信ＩＦ
（Interface）１００４、入出力ＩＦ（Interface）１００５、ドライブ装置１００６、通信バス１００７を備えている。
【００４２】
ＣＰＵ１００１は、プログラム（「ソフトウェア」又は「アプリケーション」とも呼ぶ）を実行することにより本実施の形態に係る処理を行う。ＣＰＵ１００１例えば、後述する圧縮処理、集計処理等を行う。なお、圧縮処理や集計処理は、ＣＰＵに限らず、いわゆるプロセッサを用いて行うことができる。例えば、図示していないＧＰＵ（Graphics Processing Unit）により行うようにしてもよい。
【００４３】
主記憶装置１００２は、ＣＰＵ１００１が読み出したプログラムやデータをキャッシュしたり、ＣＰＵの作業領域を展開したりする。主記憶装置１００２は、具体的には、ＲＡＭ（Random Access Memory,「メモリ」又は「内部記憶」とも呼ぶ）やＲＯＭ（Read Only
Memory）等である。また、主記憶装置１００２は、図１に示した内部記憶１２として働
く。本実施形態では、所定の低圧縮データ形式で値を保持する低圧縮データ領域１００２１と、所定の高圧縮データ形式で値を保持する高圧縮データ領域１００２２とを、例えばメモリに設ける。
【００４４】
補助記憶装置１００３は、ＣＰＵ１００１が実行するプログラムや、本実施形態に係るデータベースの物理テーブル１１１、その他の一時データを記憶する。補助記憶装置１００３は、具体的には、ＨＤＤ（Hard-disk Drive）やＳＳＤ（Solid State Drive）、フラッシュメモリ等である。図７に示すように、本実施形態では、補助記憶装置１００３に物理テーブル１００３１とスワップ領域１００３２とを設ける。
【００４５】
本実施形態では、補助記憶装置１００３に設けられた物理テーブル１００３１から、メモリ上の高圧縮データ領域１００２２にデータをロードしておく。メモリ上では、データをカラムごとに圧縮して保持する。ここで、テーブルの各カラムには文字列型や数値型等のデータ型が定義されており、カラムごとに取り得る値が決まる。したがって、カラムごとにデータを圧縮することにより、効率よくデータ量を削減できる。このようにすることで、集計処理等における入出力処理のレスポンスを向上させることができる。
【００４６】
また、データを集計等する前に、高圧縮データ形式から低圧縮データ形式に変換（展開）する（本実施形態に係る「圧縮処理」に相当する）。低圧縮データ形式に展開されたデータは所定期間キャッシュしておき、集計処理が要求された場合にはキャッシュされたデータを利用する。また、例えば容量的な制限によりメモリ上の高圧縮データ領域１００２２に保持できないデータは、ＳＳＤ上又はＨＤＤ上の補助的なデータ格納領域であるスワップ領域１００３２に保持しておき、適宜メモリ上に読み出すようにしてもよい。また、ＣＰＵ１００１が実行する図示していないバックグラウンドプロセスが、例えばデータの利用頻度に応じて低圧縮データ領域１００２１からキャッシュされたデータを削除するようにしてもよい。例えば、Ｊａｖａ（登録商標）実行環境においてはガベージコレクタがキャッシュ削除処理を行うようにしてもよい。
【００４７】
低圧縮データ方式は、カラムごとに定義されたデータ型の特性に応じて、所定のアルゴリズムを利用することができる。例えば、ディクショナリエンコーディング、ランレングスエンコーディング、ビットベクトルエンコーディング（ビットマップ）、ビットパッキング、これらの方法の組合せ、Vectorwise(登録商標)で実装されているＰＦＯＲ、ＰＦＯＲ−ＤＥＬＴＡ、ＰＤＩＣＴ等の方式、又は上述した本実施形態に係る集計処理に特化した圧縮方式によって、カラムデータを圧縮する。なお、これらの方式の選択は、例えば物理テーブルからメモリにロードする際に、圧縮率の高い方式を情報処理装置１が判断するようにしてもよいし、予めカラムのデータ型に関連付けてユーザが定義しておくようにしてもよい。また、高圧縮データ領域１００２２には、低圧縮データ形式の値を例えばデフレート（deflate）等のアルゴリズムでさらに圧縮して保持する。
【００４８】
通信ＩＦ１００４は、他のコンピュータとの間でデータを送受信する。通信ＩＦ１００４は、具体的には、有線又は無線のネットワークカード等である。情報処理装置１は、通信ＩＦ１００４を介してインターネット等のネットワークに接続されていてもよい。入出力ＩＦ１００５は、入出力装置と接続され、ユーザから操作を受け付けたり、ユーザへ情報を提示したりする。入出力装置は、具体的には、キーボード、マウス、ディスプレイ、タッチパネル等である。ドライブ装置１００６は、磁気ディスク、光磁気ディスク、光ディスク等の記憶媒体に記録されたデータを読み出したり、記憶媒体にデータを書き込んだりする。以上のような構成要素が、通信バス１００７で接続されている。
【００４９】
なお、これらの構成要素はそれぞれ複数設けられていてもよいし、一部の構成要素（例えば、ドライブ装置１００６等）を設けないようにしてもよい。また、入出力装置がコンピュータと一体に構成されていてもよい。また、ドライブ装置１００６で読み取り可能な可搬性の記憶媒体や、フラッシュメモリのような可搬性の補助記憶装置１００３、通信ＩＦ１００４などを介して、本実施の形態で実行されるプログラムが提供されるようにしてもよい。そして、ＣＰＵ１００１が所定のプログラムを実行することにより、図７に示したコンピュータ１０００を本実施形態に係る情報処理装置１として働かせる。
【００５０】
＜圧縮処理＞
図８Ａは、圧縮処理の一例を示す処理フロー図である。本実施形態では、後述する集計処理の前に圧縮処理が行われる。具体的には、定期的に圧縮処理を行うようにしてもよいし、物理テーブルが更新等されるたびに圧縮処理を行うようにしてもよい。また、図８Ａの処理フロー図では、低圧縮領域にデータを展開する処理について説明する。圧縮処理では、カラムに登録された値（集計対象の値）を所定のブロックに分割しつつ圧縮する。まず、情報処理装置１の圧縮部１３は、分割領域の桁数（換言すれば、メモリ上に確保する圧縮データ領域の分割数）や、後述する基準値、特異値と判断する基準等を最適化する（図８Ａ：Ｓ１１）。本ステップでは、図４Ａに示したような分割領域ごとの集計においてオーバーフローが発生しないように、各カラムに登録されている値をブロックに分類する。ここで、集計処理において桁あふれが生じないように、各ブロックに保持される値の個数（ひいては、圧縮値の個数）を動的に決定する。なお、最適化については上で述べたように様々な手法を用いることができる。
【００５１】
なお、分割領域の桁数を予め決定した上で、Ｓ１１において登録する分割領域毎に値を集計し、オーバーフローが生じると判断される場合は、後述するＳ１２において値を登録するブロックを変更するようにしてもよい。また、事前にＳ１１を実行せず、Ｓ１２において分割領域毎に値を集計し、オーバーフローが発生すると判断される場合はブロックを変更するようにしてもよい。また、Ｓ１１を実行せず、各ブロックに保持する値の個数を予め定めておくようにしてもよい。
【００５２】
そして、処理対象のカラムに登録されている値を１つ処理対象として取得し、例えばＳ１１で最適化された手法に基づいてブロックに分類する（Ｓ１２）。次に、圧縮部１３は、取得した値が所定の条件を満たしていない「特異値」であるか判断する（Ｓ１３）。所定の条件は、例えばＳ１１の最適化により決定されるようにしてもよいし、カラムごとに予め設定しておくようにしてもよい。例えば、所定の条件として、基準値から所定範囲内の値であることや、所定値の倍数であること等の条件が定められ、条件を満たさない場合は本ステップにおいて特異値であると判断される。例えば図５の例では、値が１０００００以下且つ１００の倍数であることという条件を満たさない場合に特異値と判断するものとする。
【００５３】
取得した値が特異値でないと判断された場合（Ｓ１３：ＮＯ）、圧縮部１３は、圧縮データ領域を分割した分割領域に、Ｓ１２で取得した値を記憶させる（Ｓ１４）。本ステップでは、取得した値は圧縮値の一部として保持される。また、上述の通り、ブロックごとに倍率及び基準値を予め定めておき、圧縮値の分割領域には、定められた倍率で除した値と基準値との差分を保持するようにしてもよい。例えば図５のメタ情報の欄に示すように倍率が１００、基準値が２５の場合であって、取得した値が２６００のとき、圧縮値の分割領域には１（０００１）が保持される。また、取得した値が３７００のとき、圧縮値の分割領域には１２（００１２）が保持される。
【００５４】
一方、取得した値が特異値であると判断された場合（Ｓ１３：ＹＥＳ）、圧縮部１３は、ブロックに関連付けて設けられた特異値領域に取得した値を記憶させる（Ｓ１５）。なお、値は、ブロックにおける格納順序を示すインデックス（index）と対応付けて特異値
領域に保持される。また、圧縮データ領域の対応する順序の箇所には０（００００）が保持されるものとする。例えば、ブロック１において６番目に取得した値が１０２５２００であった場合、特異値と判断され、特異値領域にはindex「６」に対応付けて値「１０２
５２００」が保持される。また、圧縮データ領域の６番目（２行２列目）の箇所には「０」が保持される。このような特異値を圧縮値とは別に記憶する場合、集計処理においては別途特異値を加算する処理を行うことで集計値を算出するものとする。
【００５５】
Ｓ１４又はＳ１５の後、圧縮部１３は、メタ情報を設定する（Ｓ１６）。メタ情報は、ブロックごとに保持され、当該ブロックの圧縮データ領域の分割数を定義するデータや、先述の基準値及び倍率のほか、集計処理の効率を向上させるためのデータを含む。例えば、メタ情報として、各値がｎｕｌｌ値か否かを保持されている値の順にビット列で表すｎｕｌｌフラグ、各値がｎｕｌｌ値又は０（ゼロ）か否かを保持されている値の順にビット列で表すｎｕｌｌ／０フラグ、ブロック内の最大値、最小値等を保持するものとする。例えば、Ｓ１２において取得した値がｎｕｌｌでない場合、ｎｕｌｌフラグ及びｎｕｌｌ／０フラグに１を立てる。また、Ｓ１２において取得した値がｎｕｌｌでも０でない場合、ｎｕｌｌ／０フラグに１を立てる。また、Ｓ１２において取得した値がメタ情報の最大値よりも大きい場合、最大値に当該値を上書きする。例えば、Ｓ１２において取得した値が「１０２５２００」の場合であって、Ｓ１６の時点でのメタ情報に登録されている最大値が「１２」のとき、最大値は「１０２５２００」に上書きされる。また、Ｓ１２において取得した値がメタ情報の最小値よりも小さい場合、最小値に当該値を上書きする。このようなメタ情報を用いることで、計数（ＣＯＵＮＴ）、最大値取得（ＭＡＸ）、最小値取得（ＭＩＮ）のレスポンスを向上させることができる。また、本実施形態の圧縮値においてはｎｕｌｌ値も０と同様に保持されるところ、ｎｕｌｌフラグを設定しておくことにより計数処理においてｎｕｌｌを除外して計数できるようになる。
【００５６】
その後、圧縮部１３は、カラムに未処理の値が存在するか判断する（Ｓ１７）。未処理の値が存在する場合（Ｓ１７：ＹＥＳ）、Ｓ１１に遷移して処理を繰り返す。未処理の値が存在しない場合（Ｓ１７：ＮＯ）、圧縮処理を終了する。
【００５７】
ここで、図８Ｂに圧縮処理の疑似的なソースコードの一例を示す。なお、図８Ｂのコードは圧縮処理を簡略化したものであり、値を分割領域に保持させる処理を表している。図８Ａの処理フローに示したように、オーバーフローの検出処理や、基準値、倍率等を決定する処理等を図８Ｂのコードに追加するようにしてもよい。また、図８Ｂのコードには、便宜的に行番号（１０〜８０）を付している。
【００５８】
行１０では、ｌｏｎｇ型（６４ｂｉｔ）の配列「ｄａｔａ」に集計対象の値を格納する。そして、行２０では、ｌｏｎｇ型の配列「ｐａｃｋｅｄＤａｔａ」として集計対象の値の個数の４分の１の個数の配列を定義する。また、行３０〜行８０では、集計対象の値を順に４つずつとり、４つの値を１６ｂｉｔずつビットシフトさせた値の論理和を求めることにより、４つの分割領域に集計対象の値を保持する圧縮値「ｐａｃｋｅｄＤａｔａ」を生成することができる。圧縮処理では、以上のような処理を行う。
【００５９】
＜集計処理＞
図９Ａは、集計処理の一例を示す処理フロー図である。まず、情報処理装置１の入出力部１５は、テーブルへのデータ操作要求を受け付ける（図９Ａ：Ｓ２１）。本ステップでは、例えば、他のアプリケーション又は他のコンピュータから、所定のカラムに格納されている値の集計の要求を受けるものとする。
【００６０】
また、図９Ｂに集計処理の疑似的なソースコードの一例を示す。図９Ｂのコードは、集計処理を簡略化したものである。また、図９Ｂのコードには、便宜的に行番号（９０〜２１０）を付している。以降は、図９Ｂを適宜参照して説明する。
【００６１】
その後、情報処理装置１の集計部１４は、生成された圧縮値を集計し、内部記憶１２に格納する（Ｓ２２）。本ステップでは、図４Ａに示したように、圧縮値を集計して集計圧縮値を算出する。本ステップは、図９Ｂの行１５０〜行１７０までの処理に相当する。行１５０〜行１７０では、生成した圧縮値「ｐａｃｋｅｄＤａｔａ」をすべて集計し、集計圧縮値「ｔｍｐＲｅｓｕｌｔ」を求める。
【００６２】
そして、集計部１４は、算出された集計圧縮値を各分割領域に分解し、各分割領域の値を集計して内部記憶１２に格納する（Ｓ２３）。本ステップでは、図図４Ｂに示したように、所定の桁数ごとに分解して合計する。本ステップは、図９Ｂの行９０〜行１４０及び行１８０〜行２１０の処理に相当する。まず、行９０〜行１４０では、４つの分割領域の各々を抽出するための４つのマスクを定義する。そして、行１８０〜行２１０では、マスク及びシフト演算を用いて分解した各分割領域の値を集計し、集計値「ｒｅｓｕｌｔ」を求める。また、実際は各ブロックについてさらに集計するコードを含んでいてもよい。
【００６３】
その後、入出力部１５は、内部記憶１２に格納された集計値を読み出し、要求元に応答する（Ｓ２４）。本ステップでは、要求元である他のアプリケーション又は他のコンピュータへ、結果の集計値を伝送する。以上で、情報処理装置１は集計処理を終了する。
【００６４】
本実施形態では、集計対象の値をメモリ（低圧縮データ領域）上にロードする際に、圧縮値を生成する。この処理は、シフト演算によって実行できる。この圧縮値を用いて集計処理を行う際の計算回数は、｛（集計対象の値の個数÷分割数）−１｝回の圧縮値の加算と、マスク及び集計圧縮値の分割数分の論理積（ＡＮＤ）の算出と、分割数分のシフト演算と、（分割数−１）回分の各分割領域の値の加算との合計になる。図４Ａ及び図４Ｂに示した例では、１５回（｛（２０／４）−１｝＋４＋４＋（４−１）回）である。仮に集計対象の値が２００個の場合は６０回（｛（２００／４）−１｝＋４＋４＋（４−１）回）となる。
【００６５】
このように、集計対象の値が増加するほど、計算回数の削減率も高くなる。一方で、集計対象の値が増加するほど、オーバーフロー（分割領域を超える桁上がり）が生じる可能性も高くなる。よって、オーバーフローが生じない範囲（「ブロック」とも呼ぶ）にカラムデータを分割し、ブロック単位で上述の集計処理を行うようにしている。
【００６６】
＜メタ情報を用いた集計処理＞
図９Ａの例では、集計対象の値を単に圧縮値にして加算する処理を説明した。ここで、メタ情報を用いた集計処理について補足する。図５に示したように倍率「１００」及び基準値「２５」が設定されている場合は、まず上述の工程に基づいて圧縮値をすべて加算する。そして、基準値「２５」とｎｕｌｌ若しくは０又は特異値でない値の個数「８」とを乗じた数をさらに加算し、倍率「１００」を乗じて、集計値を求める。図５に示した「圧縮データ領域」の場合、まず圧縮値を加算して、１０００２０００００００４＋１２００００００５００００＋４００００００１５００００＝１７０００２００２００００４と集計圧縮値が求められる。そして、各分割領域の値を集計し、１７＋２＋２０＋４＝４３と集計値が求められる。さらに、基準値とｎｕｌｌ若しくは０又は特異値でない値の個数とを乗じた数２５×８＝２００を加算し、さらに倍率１００を乗じることにより、（４３＋２００）×１００＝２４３００と集計値が求められる。
【００６７】
図５に示すような特異値「１０２５２００」及び「１２」が保持されている場合は、これらをさらに加算し、６８００＋１０２５２００＋１２＝１０４９５１２と最終的な集計値が求められる。また、複数のブロックが存在する場合は、各ブロックの集計値をさらに合計することにより、結果の集計値が得られる。
【００６８】
また、値の件数を計数（ＣＯＵＮＴ）する場合は、ｎｕｌｌフラグのビット列において１が立っている個数を計数する。ブロック内における値の順序と対応付けてビット列を保持しておけば、何らかの条件によってレコード（行）を絞り込んで計数する際に、条件を満たすレコードを示すビット列とｎｕｌｌフラグのビット列との論理積をとることによって計数対象をフィルタリングすることができる。例えば、１、３、７、８行目が所定の条件を満たす場合、１０１０００１１００００というビット列で条件を満たすレコードを表すことができる。さらにｎｕｌｌ以外の値を計数するときは、図５のｎｕｌｌフラグ１１１１１１１０１１１１との論理積をとり、１０１０００１０００００が得られ、３というカウント値を得ることができる。
【００６９】
また、ある条件を満たすレコードについて、所定のカラムの最大値（ＭＡＸ）又は最小値（ＭＩＮ）を求める場合は、まず条件を満たすレコードを示すビット列を生成する。上述の例と同様に、１、３、７、８行目が所定の条件を満たす場合、１０１０００１１００００というビット列で条件を満たすレコードが表される。そして、ビット列において１が立っている箇所の値を、圧縮データ領域又は特異値領域を参照して比較し、最も大きい値又は最も小さい値を求める。
【００７０】
最大値を求める場合においてメタ情報に保持されている最大値が発見された場合は、当該ブロックについて値を比較する処理を打ち切ることができる。同様に、最小値を求める処理においてメタ情報に保持されている最小値が発見された場合は、当該ブロックについて値を比較する処理を打ち切ることができる。さらに、複数のブロックが存在する場合は、順にすべてのブロックを走査する。最大値を求める場合において、すでに発見された最大値よりも新たに走査するブロックのメタ情報に保持されている最大値が小さいときは、当該ブロックの走査を打ち切ることができる。同様に、最小値を求める場合において、すでに発見された最小値よりも新たに走査するブロックのメタ情報に保持されている最小値が大きいときは、当該ブロックの走査を打ち切ることができる。なお、所定の条件でレコ
ードをフィルタリングせずに全件から最大値又は最小値を求める場合には、単純に各ブロックのメタ情報に保持されている最大値のうち最も大きい値、又は最小値のうち最も小さい値を求める。
【００７１】
また、集計対象のカラムとは異なるカラムについてある条件を満たすレコードを抽出し、集計処理を行う場合も、まず条件を満たすレコードを示すビット列を生成する。上述の例と同様に、１、３、７、８行目が所定の条件を満たす場合、１０１０００１１００００というビット列で条件を満たすレコードが表される。そして、ｎｕｌｌ／０フラグとビット列との論理積をとる。なお、論理積が０であれば、当該ブロックには集計対象の値がないと判断できる。また、論理積が１となったビットに対応する分割領域の値を抽出するためのマスクを生成し、圧縮値に含まれる分割領域の値をフィルタリングする。例えば上記のビット列と図５のｎｕｌｌ／０フラグの論理積は、１０１０００１０００００となる。圧縮データ領域の１行目に示された圧縮値をフィルタリングするため、論理積のビット列のうち左から４つのビットに基づいてマスク「１１１１００００１１１１００００」が生成される。さらに圧縮値とマスクとの論理積をとり、フィルタリング後の圧縮値「０００１００００００００００００」が求められる。なお、図５では便宜的に１０進数で説明しているが、実際には２進数で処理され、例えば圧縮値が６４ｂｉｔである場合、上記のマスクは「1111111111111111000000000000000011111111111111110000000000000000」となる。
【００７２】
同様に、２番目の圧縮値はフィルター処理されると「０００００００００００５００００」になる。また、３番目の圧縮値は、フィルター処理されると「００００００００００００００００」になる。以上のようなフィルタリング処理された圧縮値を用いて、図４Ａ及び図４Ｂを用いて説明したような集計処理を行う。
【００７３】
また、集計対象のカラムと条件判断を行うカラムとが同一である場合は、まず圧縮データ領域から各分割領域に保持されている値を抽出して条件を満たすか否か判断する。このような処理のコストを低減させるため、メタ情報を活用してもよい。例えば、最大値や最小値を用いて、条件判断をスキップできる可能性がある。具体的には、当該カラムに保持されている値が５００未満のレコードを抽出して当該カラムに保持されている値を集計するような場合において、処理対象のブロックの最小値が５００である場合当該ブロックについては条件を満たす値が存在しないと判断できるため、処理をスキップすることができる。
【００７４】
また、完全一致検索を高速化するため、メタ情報としていわゆるブルームフィルタのハッシュ値を保持しておくようにしてもよい。ブルームフィルタによって、ある要素が集合のメンバーであるかテストすることができる。そして、当該ブロックには検索対象値が含まれないことが保証された場合には、当該ブロックの走査をスキップすることができる。
【００７５】
＜ファンクションキャッシュ＞
集計処理を行う場合、キャッシュを利用してコストをさらに低減することもできる。例えば、上述の低圧縮データ領域に格納されるデータは、物理テーブルの値と対応していたが、さらに計算結果を仮想的なカラムとして低圧縮データ領域に保持する。図１０は、メモリ上にキャッシュとして仮想的なカラムを設ける例を説明するための図である。例えば、物理テーブルに何らかの注文データを構成する単価のカラムと個数のカラムとが存在するものとする。この場合において、注文データの売上を集計するときは、次のような計算を行う。
ＳＵＭ（単価×個数）
【００７６】
過去の履歴である各注文データの売上（単価×個数）は、計算し直しても結果が変わる
ような性質のデータではない。よって、図１０の破線で示すカラムのように、算出した値を例えば低圧縮データ領域に保持しておき、同様の要求に対して既に算出された値を返すようにする。このような仮想的なカラムとしてレコードごとに部分的な集計値を算出しておき、保持されるキャッシュを、便宜上「ファンクションキャッシュ」とも呼ぶものする。同様に、平均値（ＡＶＧ（単価×個数））や税込み価格（ＳＵＭ（単価×個数×１．０５））といった値をファンクションキャッシュとして保持しておくようにしてもよい。すなわち、物理テーブルのレコード（行）ごとに部分的な集計値（すなわち、単価と個数との小計や、価格に税率を乗じた税込み価格等）を算出し、部分的な集計値を集計対象の値とする圧縮値を生成して内部記憶１２等の記憶部に保持させておく。
【００７７】
ファンクションキャッシュは全ての行に対して算出しておくことができ、物理テーブルのカラムデータと同様にキャッシュされる。また、物理テーブルのカラムデータと同様に、様々なアルゴリズムで圧縮して保持することが可能である。このような点で、いわゆるマテリアライズドビューやストアドプロシージャとは異なっている。比較的処理に時間のかかる要求について自動的にファンクションキャッシュを保持しておくようにしてもよいし、ファンクションキャッシュを保持すべき数式を予め設定しておくようにしてもよい。
【００７８】
＜分散処理＞
処理の対象となるテーブルは、論理的には１つのテーブルであっても、複数の情報処理装置１の内部記憶１２に分散（「パーティショニング」とも呼ぶ）させることができる。なお、物理テーブルも複数の情報処理装置１に分散して保持する構成としてもよいし、１つの物理テーブルに基づいて複数の情報処理装置１の内部記憶１２に分散して圧縮値を展開する構成としてもよい。
【００７９】
図１１に、分散処理を行うシステムの一例を示すシステム構成図を示す。図１１のシステムは、情報処理装置１（図１１では１ａ、１ｂ・・・）と、制御装置２とを含み、これらはネットワークを介して接続されているものとする。情報処理装置１（「ノード」とも呼ぶ）は、図１に示した装置とほぼ同様である。また、制御装置２は、分散処理部２１と、記憶部２２と、集計部２３と、入出力部２４とを有する。入出力部２４は、処理の要求を受け付けたり、処理の結果を応答したりする。また、分散処理部２１は、処理を各ノードに振り分けたり、各ノードから結果を受信したりする。記憶部２２には、中間的に生成されるデータや、処理結果のデータが保持される。また、集計部２３は、各ノードから受信した結果のデータを集計し、入出力部２４が受けた要求への応答となる結果のデータを生成する。なお、図１１の例では１つの制御装置２を示しているが、各ノードに分散処理部２１を設け、分散制御を行う装置群を構成してもよい。この場合、何れのノードが処理の要求を受け付けた場合も、他のノードの集計部から各ノード内での小計値を受け取り、全体を集計する。
【００８０】
なお、複数のノードでの内部記憶１２の分割方法は、カラムごとに分割し、異なるカラムを別のノードが保持するようにしてもよいし、レコードごとに分割し、異なるレコードを別のノードが保持するようにしてもよい。図１２は、仮想的な１つのテーブルと登録されたレコードの一例を示す図である。例えば図１２に示すように、２つのノードが、異なるレコードを物理的に保持するようにする。なお、分散処理部２１によるレコードの振分けは、例えば、図示していない日付やユーザＩＤ等に基づいて、過不足なくいずれかのノードに分散させるようにする。図１３は、複数のノードのメモリに展開されたカラムデータの例を示す図である。図１２のテーブルは、例えば図１３に示すように各ノードのメモリに保持される。なお、耐障害性を高めるため、同一パーティションを複数のノードが保持するようにしてもよい。
【００８１】
例えば、図１２に示すような論理テーブルに対し次のような計算を行う例について説明
する。
ＳＵＭ（単価×数量）
【００８２】
このような要求を入出力部２４が受けると、分散処理部２１は各ノードに処理を要求する。一方、各ノードは、並列に、各自が保持するカラムデータを用いて計算を行う。処理の内容は、情報処理装置１が単独で行う処理と同様である。図１３の例では、ノード１の集計処理において中間的な集計値２３５０が算出される。同様に、ノード２の集計処理において中間的な集計値１９００が算出される。中間的な集計値は、制御装置２の分散処理部２１に伝送され、集計部２３は、テーブル全体の集計値４２５０を算出する。そして、入出力部２４は、結果の集計値を要求元に伝送する。
【００８３】
このような構成にすれば、各ノードが並行して集計処理を実行することができる。すなわち、負荷を分散させるとともに結果を得るまでの時間を短縮することができる。
【００８４】
＜メモリ展開時のデータ構造変更処理＞
物理テーブルからメモリ上へデータをロードする際、データ構造を変更するようにしてもよい。例えば、図１４に示すようなテーブルを例に説明する。図１４は、カラム数が不定の汎用的なデータ構造を実現する目的で設計されたテーブルの一例である。テーブルは、「データＩＤ」（すなわち、実質的なレコードの識別情報）、「カラム名」（すなわち、実質的なカラムの識別情報）、及び「値」（すなわち、実質的なカラムに登録された値）のカラムを有している。また、登録されているレコードはアンケートの回答結果であり、３つのレコードが１人の回答者の情報を表している。このようなデータ構造であれば、後に新たなカラム名を追加することが容易となるが、クロス集計のような多次元での集計を行うことが困難である。
【００８５】
このような場合において、予め「キー列」及び「カラム列」を設定しておく。「キー列」は、指定されたカラムの値が同一のレコードを１件のレコードとして扱うためのカラムである。また、カラム列は、指定されたカラムの値を新たな展開後のテーブルのカラム名として用いるためのカラムである。例えば、キー列として図１４の「データＩＤ」が指定され、カラム列として図１４の「カラム名」が指定されているものとする。
【００８６】
図１４のような物理テーブルのデータをメモリ上にロードする際には、圧縮部１３は「キー列」及び「カラム列」の設定を参照し、データ構造を変換する。具体的には、「キー列」として指定されたカラムである「データＩＤ」に保持している値が同一のレコードを、変換後の１レコードに結合する。このとき、「カラム列」に指定されたカラムである「カラム名」に保持している値を、変換後のテーブルのカラムの名称に設定し、他のカラムである「値」に保持している値を、変換後のレコードの各値に登録する。図１５に、変換後のテーブルの一例を示す。図１５のテーブルは、「データＩＤ」、「性別」、「年齢」及び「職業」の各列を有する。また、各レコードには、図１４に示した物理テーブルのカラム「値」に保持していた値が、カラム「データＩＤ」の値ごとに結合されている。
【００８７】
ＳＱＬのようなデータ操作言語でこのような変換処理を行うためにはクエリが複雑になってしまうところ、メモリへロードする際に変換する機能を設けておけば、簡易な設定により変換処理を実行させることができる。図１５に示すようなテーブルを、メモリ上においてカラムごとに値を保持させておけば、クロス集計のような処理も容易になる。
【００８８】
＜その他＞
本発明は、上述の例に限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更を加え得るものである。
【符号の説明】
【００８９】
１  情報処理装置
１１  ＤＢＭＳ
１１１  物理テーブル
１１２  データ操作部
１２  内部記憶
１３  圧縮部
１４  集計部
１５  入出力部
２  制御装置
２１  分散処理部
２２  記憶部
２３  集計部
２４  入出力部
【図１】
2015172823.tif 000003
【図２】
2015172823.tif 000004
【図３】
2015172823.tif 000005
【図４Ａ】
2015172823.tif 000006
【図４Ｂ】
2015172823.tif 000007
【図５】
2015172823.tif 000008
【図６Ａ】
2015172823.tif 000009
【図６Ｂ】
2015172823.tif 000010
【図６Ｃ】
2015172823.tif 000011
【図７】
2015172823.tif 000012
【図８Ａ】
2015172823.tif 000013
【図８Ｂ】
2015172823.tif 000014
【図９Ａ】
2015172823.tif 000015
【図９Ｂ】
2015172823.tif 000016
【図１０】
2015172823.tif 000017
【図１１】
2015172823.tif 000018
【図１２】
2015172823.tif 000019
【図１３】
2015172823.tif 000020
【図１４】
2015172823.tif 000021
【図１５】
2015172823.tif 000022