(58)【調査した分野】(Int.Cl.,DB名)
前記グループの一組の集約データは、グループ値と、集約値と、衝突するグループの第2の一組の集約データに対するポインタとを含む、請求項1〜5のいずれか1項に記載の方法。
前記アドレスはハッシュテーブルに格納され、前記ハッシュテーブルのサイズは、データを集約することを求める前記要求に対応付けられているグループの数の推定に基づいて選択される、請求項1〜6のいずれか1項に記載の方法。
【発明を実施するための形態】
【0019】
詳細な説明
以下の記載では、本発明が十分に理解されるよう、数多くの具体的な詳細事項が説明のために述べられている。しかしながら、これらの具体的な詳細事項がなくとも本発明を実施し得ることは明らかであろう。他の場合では、本発明を不必要に曖昧にするのを避けるために、周知の構造および装置はブロック図の形式で示される。
【0020】
全体の概要
グループ化および集約データベース動作を実行するための技術が説明される。ある実施形態において、専用ハードウェアが、グループ化および集約データベース動作を効率的かつ効果的に実行するように構成される。この専用ハードウェアは、グループ化動作を実行するとき、任意の数のグループをサポートし得る。
【0021】
さらに、グループ化および集約を、テーブルデータのグローバルソートなしで実行し得る。グローバルソートを避けることによって、大きなリストをソートする間に生じるランダムなメモリアクセスの問題は緩和される。たとえば、リストをソートする間に、メモリの1つのブロック内に位置するグループに、あるアイテムが入る一方で、メモリの別のブロック内に位置するグループに、次のアイテムが属することがある。通常、この場合のソートされたテーブルを書込むためには、新たなメモリページを閉じて開くことを繰返す必要がある。本明細書に記載の技術に従い、グループ化および集約をメモリの小さなチャンクに対して実行してもよく、そうすることで高速で消費電力の少ないキャッシュにおいてランダムなアクセスを生じさせることができる。
【0022】
ある実施形態において、システムは、第1の列によってグループ化して集約する動作を要求するクエリを受ける。グループ化動作は第1の列に対して実行されるので、第1の列内の個々の値を本明細書では「グループ値」と呼ぶ。
【0023】
クエリを受けたことに応じて、システムは第1の列のグループ値を1つ以上のアドレスにマップする。たとえば、システムは、ハッシュ関数を各グループ値に適用することにより、特定のグループ値をマップするアドレスを決定してもよい。同一のグループ値は同一のアドレスにマップされ、異なるグループ値は衝突が生じていない限り異なるアドレスにマップされている。
【0024】
ある実施形態において、グループ値がマップされた各アドレスは、テーブルまたは連想メモリ(content-addressable memory)(CAM)内のエントリを特定する。エントリは、記憶場所を特定するポインタを格納していてもよい。記憶場所とは、この記憶場所にハッシュされたグループ値に対応付けられているグループの、一組の集約データの記憶場所である。たとえば、第1の列が、記憶場所Yにハッシュされた値Xを有する場合、記憶場所Yは、第1の列内でXを有する行の集約データに対するポインタを格納しているエントリを特定する。
【0025】
ある行のグループ値がエントリにマップされたときに、システムは、このグループの一組の集約データに含まれる集約値を更新してもよい。システムは、第1の列の各行について、グループ値をマップするステップおよび集約値を更新するステップを実行してもよい。
【0026】
ある実施形態において、システムは、衝突検出を実行することにより、2つ以上の異なるグループが同一の集約値を更新しないことを保証してもよい。たとえば、一組の集約データは、集約値に加えてグループ値を含み得る。第2のグループ値が第1のグループ値と同一のアドレスにマップされている場合、第2のグループ値を、一組の集約データの中に格納されているグループ値と突合せて検査する。これらが一致していれば、衝突は発生しておらず、集約値を更新すればよい。しかしながら、これらグループ値が一致していなければ、衝突が検出される。
【0027】
衝突に対処するために、一組の集約データは、次のグループの集約データの記憶場所を示すポインタを含んでいてもよい。このポインタは最初はNULL値に設定してもよい。衝突の発生時に、ポインタを更新してポインタが次のグループの一組の集約データを示すようにしてもよい。ポインタの設定後に次の衝突が生じた場合は、次のグループの一組の集約データを取出し、衝突を検出しそれに対処するプロセスを次のグループに対して繰返せばよい。
【0028】
グループ化および集約動作を処理するためのアーキテクチャの例
図1Aおよび
図1Bは、ある実施形態に従いグループ化および集約動作を実行するためのシステムアーキテクチャの一例を示すブロック図である。概して、システム100は、ランダムアクセスメモリ(RAM)102と、RAMコントローラ104と、キャッシュ110と、要求キュー120と、グループ列アクセスユニット130と、値列アクセスユニット140と、ハッシュテーブルアクセスユニット150と、集約状態アクセスユニット160とを含む。
【0029】
RAM102は、格納しているデータへのランダムなアクセスが可能な任意の形態のデータ記憶装置を用いて実装し得る。RAM102の例は、ダイナミックRAM(DRAM)およびスタティックRAM(SRAM)を含むがこれに限定されない。ある実施形態に従うと、RAM102は、グループ化/集約データベースクエリによる問合せの対象であるデータベースの少なくとも一部を格納する。RAM102内に格納されるデータの構成は、実装毎に異なり得る。ある実施形態において、RAM102はデータベースをハイブリッド列状フォーマットで格納する。このフォーマットに従って、RAM102はNブロックのデータを格納し、Nは任意の正の整数である。各ブロック内には、1つ以上の列に対し決まった数の行が列優先方式で格納される。たとえば、データベーステーブルの1つ以上の列に対し、第1のブロックは最初の50行を格納し、第2のブロックは次の50行を格納し、第3のブロックは次の30行を格納していてもよい。各ブロック内において、各列の列値は連続的に格納される。
【0030】
RAMコントローラ104は、RAM102へのおよびRAM102からのデータの流れを管理するメモリコントローラである。したがって、RAMコントローラ104は、キャッシュ110または要求キュー120からRAM102へのデータ書込およびRAM102からのデータ読出要求を処理し得る。RAMコントローラ104は任意の適切なメモリコントローラを用いて実装すればよく、このメモリコントローラは、ダブルデータレートDDRメモリコントローラ、デュアルチャネルメモリコントローラ、または完全バッファ型メモリコントローラを含むが、これに限定されない。
【0031】
キャッシュ110は、グループ化/集約クエリの処理中にアクセスブロックによって使用されるデータを格納する。キャッシュメモリの場合、RAMと同様、格納されているデータにランダムにアクセスすることができるが、通常キャッシュメモリはRAMよりもサイズが小さくデータアクセスのレイテンシが小さい。したがって、データをキャッシュすることにより、グループ化/集約クエリに対してデータを処理しているときのRAM102に対する入出力動作の回数が少なくなるので、データのボトルネックを減じるとともにシステム100の性能を改善することができる。
【0032】
要求キュー120は、アクセスブロックへのおよびアクセスブロックからの要求をバッファする。このアクセスブロックは、グループ列アクセスユニット130、値列アクセスユニット140、ハッシュテーブルアクセスユニット150、および集約状態アクセスユニット160を含む。たとえば、グループ化/集約クエリを受けたとき、アクセスブロックは、RAM102またはキャッシュ110に特定の行または行の値を要求し得る。要求キュー120は、アクセスブロックからの複数のこれらの要求をバッファし得る。そうすることで、メモリフェッチがパイプライン化され、要求された読出しの結果、RAMアクセスのレイテンシが長い場合に、高帯域幅を維持することができる。
【0033】
システム100内の、グループ列アクセスユニット130、値列アクセスユニット140、ハッシュテーブルアクセスユニット150、および集約状態アクセスユニット160を含む、アクセスブロックは、以下でさらに詳細に説明される技術に従う、フェッチ、グループアキュムレータの更新、およびメモリへの結果のライトバックを実行する役割を果たす。
【0034】
メモリ構成
システム100のメモリシステムを個々のセクションに分割することによって、クエリ処理中のデータアクセスを最適化してもよい。
図1Bは、システム100の記憶階層の一例を示すブロック図である。示されているように、メモリシステムは2つのセクション、すなわちバッファ112とマルチレベルキャッシュ114に分割されている。
【0035】
バッファ112は、オンチップバッファとして実装されてもよく、非管理方式で動作してもよい。たとえば、バッファ112は、開始メモリアドレスを受けそれに応じてRAM102からデータを逐次的に読出してもよい。ある実施形態において、グループ列アクセスユニット130および値列アクセスユニット140は、バッファ112を通してRAM102にアクセスする。以下で説明される技術に従うと、これらブロックは、データを逐次的に読出し、このデータに対する変更は実行しない。よって、アクセスパターンがわかっており逐次的であるので、データをバッファ112に効率的にプリロードすることができる。
【0036】
マルチレベルキャッシュ114は、レベル1(L1)、レベル2(L2)、およびレベル3(L3)キャッシュを含む階層のような、中央処理装置(CPU)のキャッシュ階層と同様の方式で動作し得る、管理されているキャッシュである。したがって、マルチレベルキャッシュ114は、より大きくより低速でより高レベルのキャッシュによってバックアップされる、レベル1(L1)キャッシュのようなより小さくより高速でより低レベルのキャッシュを含み得る。
【0037】
ある実施形態において、ハッシュテーブルアクセスユニット150および集約状態アクセスユニット160は、マルチレベルキャッシュ114を通してRAM102にアクセスする。RAM102内またはディスク上にあるデータにアクセスするとき、これらユニットは、先ずマルチレベルキャッシュ114のより低レベルのキャッシュをサーチし、続いてマルチレベルキャッシュ114のより高いレベルのキャッシュをサーチしてもよい。たとえば、これらユニットは、先ずL1キャッシュにおける関連データを探し、続いてL2キャッシュを探し、次にL3キャッシュを探してもよい。どのキャッシュレベルにおいてもデータが見つからない場合は、そのデータをRAM102に要求すればよい。以下でより詳細に説明されるように、ハッシュテーブルアクセスユニット150および集約状態アクセスユニット160は、ランダムにデータを読出して変更し、これらデータアクセスにはある程度の空間的および時間的局所性があってもよい。このため、マルチレベルキャッシュはこれらユニットのサポートに十分適している。
【0038】
要求キュー120は、アクセスユニットから受けたメモリアクセス要求をバッファする。ある実施形態において、要求キュー120は、要求を、受けた順序と同じ順序で処理してもよい。たとえば、要求キュー120は、メモリに対するアクセス要求をディスパッチし、次の要求の処理の前にトランザクションが完了するまで待つようにしてもよい。これに代わるものとしては、ハッシュテーブルアクセスユニット150および集約状態アクセスユニット160をサポートする要求キューを、順不同のディスパッチをサポートするように構成してもよい。たとえば、たとえRAM102に対する要求が最初に送られていたとしても、RAM102に対するレイテンシが長いアクセスよりも前に、マルチレベルキャッシュ114に対するレイテンシが低いアクセスに応えてもよい。このように、メモリアクセスが遅い場合は利用できるハードウェアリソースをより適切に利用すればよい。
【0039】
グループ列アクセスユニット
図2は、グループ列アクセスユニット130のアーキテクチャの一例を示すブロック図である。概して、グループ列アクセスユニット130は、アドレス生成器204と、タグ割当部206と、ローカルメモリ208とを含む。グループ列アクセスユニット130は、グループ化されている列の値をフェッチする役割を果たす。説明のためにクエリ2が実行されているものとする。クエリ2では、グループ化されている列は「販売員」である。したがって、この例において、グループ列アクセスユニット130は、「販売員」列から値をフェッチする役割を果たす。
【0040】
アドレス生成器204は、グループ化されている列のメモリアドレスを生成し、このアドレスをメモリ要求キュー202に送る。ある実施形態において、アドレス生成器204は、グループ化された列の開始アドレスから始める。したがって、この例では、アドレス生成器204は「販売員」列の開始アドレスを要求キュー202に送ることになる。
【0041】
図2では、アドレス生成器204によって発行された要求は、「メモリへ」送られるものとして示されている。
図1を参照しながら説明したように、実際、要求をメモリに送ることは、マルチレベルキャッシュ114の1つ以上のレベルにおいてデータを探し、該当するデータがマルチレベルキャッシュ114になければRAM102からデータを取出すことを含み得る。しかしながら、説明のために、上記要求は単に「メモリシステムへ」送られ要求されたデータを「このメモリシステム」からグループ列アクセスユニット130が受けるものとする。
【0042】
したがって、アドレス生成器204が生成したアドレスに応じて、メモリシステムは、グループ化された列(たとえば「販売員」)の行毎に、グループ名を順次返す。要求キュー202は、これらグループ名をローカルメモリ208に格納する。加えて、タグ割当部206は、入力されたグループ名各々に固有のタグを割当て、このタグは、ローカルメモリ208内において対応する名称の隣に格納される。たとえば、この例では、アドレス生成器204は「販売員」列の開始のアドレスを提供し得る。これに応じて、「Pedro」を受け、タグ1というタグとともにローカルメモリ208に格納する。次に、アドレス生成器204は「販売員」列の次の値のアドレスを提供する。これに応じて、「Pedro」を受け、タグ2というタグとともにローカルメモリ208に格納する。このプロセスは「販売員」列の残りの行に対して繰返されるであろう。
【0043】
ある実施形態において、タグ割当部206によって割当てられるタグは、行識別子として機能する。行識別子は、対応する行を追跡し、後に集約プロセスにおいて得られる値等の他のデータとこの行を対応付けるために使用し得る。タグ割当部206は、入力された行を一意的に識別するために任意の適切なやり方でタグを生成し得る。たとえば、タグ割当部は、入力されたそれぞれのグループ名に連続番号を割当てるカウンタとして実装してもよい。よって、「行ID」列にアクセスすることをRAM102に求めるメモリ要求を発行しなくても、タグは、「行ID」属性についてのプロキシとして機能する固有の識別子を各行に与えることができる。タグはまた、データエントリの順不同の処理を可能にし、複数のアクセスブロックにわたる特定のトランザクションの識別に使用し得る。
【0044】
ある実施形態に従うと、グループ列アクセスユニット130は、入力されたグループ名を、ハッシュのために直接ハッシュテーブルアクセスユニット150に送る。加えて、タグおよび対応付けられたグループ名を含む小さなローカルメモリ208の内容は、集約状態アクセスユニット160に送られ、このユニットではグループ名が衝突の検査に使用される。
【0045】
ハッシュテーブルアクセスユニット
図3は、ある実施形態に従うハッシュテーブルアクセスユニット150のアーキテクチャの一例を示すブロック図である。概して、ハッシュテーブルアクセスユニット150は、ハッシュ生成器304とローカルメモリ306とを含む。ハッシュテーブルアクセスユニット150は、グループ名にハッシュ関数を適用し対応するポインタをフェッチする役割を果たす。
【0046】
ハッシュ生成器304は、グループ列アクセスユニット130から行毎にグループ名を受け、入力されたグループ名各々にハッシュ関数を適用する。ハッシュ関数は、グループ名をハッシュテーブルエントリのアドレスにマップする任意の適切な関数を用いて実装すればよい。ハッシュ関数の適用後、ハッシュ生成器304は、ハッシュ関数によって生成されたハッシュ値に対応するアドレスのハッシュテーブルエントリからポインタをフェッチするために、メモリ要求を要求キュー302に送る。要求キュー302は、ローカルキャッシュ(たとえばマルチレベルキャッシュ114)またはRAM102からポインタをフェッチし、このポインタをローカルメモリ306に返す。
【0047】
ハッシュ生成器304に与えられるグループ値を本明細書では「入力グループ値」と呼ぶ。ある実施形態において、この入力グループ値にかつて遭遇していない場合、ハッシュテーブルエントリはNULLポインタを格納する。たとえば、「Alex」が初めてハッシュ生成器304に与えられたとき、ハッシュテーブルエントリがNULLポインタとともに返される。
【0048】
一方、入力グループ値にかつて遭遇している場合またはハッシュ衝突が生じている場合、ハッシュ値に基づいて得られたハッシュテーブルエントリは、「アキュムレータ」データ構造に対するポインタを格納する。衝突が生じていない場合、アキュムレータデータ構造は、入力グループ値のためのものである。衝突の場合、アキュムレータデータ構造は、入力グループ値と同一のハッシュ値にハッシュするグループ名を有する別のグループのためのものであってもよい。
【0049】
アキュムレータデータ構造は、グループのさまざまなデータを格納し、以下でさらに詳しく説明される。メモリシステムがポインタを返すと、このポインタは、処理されている特定の行に対応するタグとともにローカルメモリ306に格納される。対応するタグは、グループ列アクセスユニット130から受けることができる。タグおよび対応するポインタを含む、ローカルメモリ306の出力は、集約状態アクセスユニット160に送られ、このユニットは、ポインタによって示されるアドレスのペイロードデータをフェッチする。
【0050】
集約状態アクセスユニット
図4は、ある実施形態に従う集約状態アクセスユニット160のアーキテクチャの一例を示すブロック図である。概して、集約状態アクセスユニット160は、マルチプレクサ(MUX)404と、衝突検査ブロック406と、メモリアロケータ408と、ローカルメモリ410とを含む。集約状態アクセスユニット160は、ハッシュテーブルポインタによって示されるアドレスのペイロードデータをフェッチしこのペイロードデータに対して衝突検査を実施する役割を果たす。
【0051】
MUX404は、ハッシュテーブルアクセスユニット150からハッシュテーブルポインタを受ける。ハッシュテーブルアクセスユニット150からの入力ポインタは先ず、NULLポインタか否かを判断するために検査される。NULLポインタは、対応するグループにそれまで遭遇していないことを示すとともに、このグループについてのアキュムレータを格納するためにメモリ(memory)を割当てるべきであることを示す。ポインタがNULLの場合、メモリアロケータ408は、このグループに対してメモリを割当て、対応するグループアキュムレータにおけるフィールドを初期状態に初期化し、データをローカルメモリ410に書込む。新たに遭遇したグループの、ローカルメモリ410における初期集約値は、空のままであってもよく、またはゼロに設定してもよい。
【0052】
ポインタがNULLでない場合、MUX404は、このポインタによって特定されるメモリアドレスを、ペイロードデータをフェッチするために要求キュー402に送る。要求キュー402は、このペイロードデータを、ローカルキャッシュ(たとえばマルチレベルキャッシュ114)を通してフェッチし、衝突検査406に返す。ローカルキャッシュがこのペイロードを送ると、衝突検査406は、ペイロードデータ内の返されたグループ名を、グループ列アクセスユニット130によって送られたグループ名と比較する。これらグループ名が一致していれば衝突はなく、このグループの集約値を含むペイロードデータが、衝突検査トランザクションが生じた対応する行を特定するタグとともに、ローカルメモリ410に書込まれる。
【0053】
これらグループ名が一致していなければ衝突が検出され、次のペイロードに対するポインタが、ペイロードデータから抽出され、MUX404のNULL検査に返される。MUXでは、以前と同じプロセスが新たなポインタを用いて行なわれる。このプロセスは、次のペイロードに対するポインタがNULLになるまで、または、返されたグループ値がグループ列アクセスユニット130から送られたグループ名と一致するまで、繰返される。
【0054】
ローカルメモリキャッシュ410の出力は値列アクセスユニット140に送られ、アクセスユニット140はこのアキュムレータデータ構造を更新する。
【0055】
値列アクセスユニット
図5は、ある実施形態に従う値列アクセスユニット140のアーキテクチャの一例を示すブロック図である。概して、値列アクセスユニット140は、アドレス生成器504と、タグ割当部506と、集約動作ユニット508と、ローカルメモリ510とを含む。値列アクセスユニット140は、集約されている列(たとえばクエリ2の場合は「売上高」列)の値をフェッチする役割を果たす。
【0056】
グループ列アクセスユニット130と同様、アドレス生成器504は、列の開始アドレスから始め、所望のアドレスを要求キュー502に送る。メモリシステムは、これらの値を行毎に返す。タグ割当部506は、行識別子に対応する各行にタグを割当て、結果はローカルメモリ510に書込まれる。ある実施形態では、タグ割当部506によって所与の行に割当てられたタグは、この行から読出されたグループ名に割当てられたタグと一致するので、以下で説明されるように値列アクセスユニット140がグループデータを集約するときに、これら2つのデータを相互に対応付ければよい。
【0057】
ローカルメモリ510からの値、現在のアキュムレータデータ状態、および集約状態アクセスユニット160からの対応するタグは、集約動作ユニット508に送られる。集約動作ユニット508は、このタグを用いて、ローカルメモリ510から、一致するタグを有する値を取出す。集約動作ユニット508は次に、クエリにおいて指定された集約関数およびローカルメモリ510から与えられた値に基づいて、このグループの集約値を更新する。集約動作ユニット508は、限定されないがテーブル1に示される関数のうちいずれかを実行し得る。たとえばクエリ2の場合、Pedroグループのアキュムレータデータ構造は、第1行の処理後、値400を有するであろう。第2行を処理するとき、ローカルメモリ510は値200を集約動作ユニット508に与え、ユニット508はこの値と400を合計して値600を生成する。次に、Pedroグループのアキュムレータデータ構造は、この値を用いて更新される。動作の完了後、更新されたアキュムレータは、集約状態アクセスユニット160におけるローカルメモリ410にまたはローカルキャッシュに書戻される。
【0058】
アキュムレータデータ構造
ある実施形態において、システム100は、処理する各グループに対してアキュムレータデータ構造を生成し維持する。各グループに対するアキュムレータデータ構造は、そのグループの一組の集約データを格納する。アキュムレータデータ構造に格納される一組のデータは、実装および実行されている集約動作の種類に応じて異なり得る。
【0059】
図8は、ある実施形態に従うアキュムレータデータ構造のブロック図である。アキュムレータデータ構造800は、値フィールド802と、集約結果フィールド804と、ポインタフィールド806とを含む。代替の実施形態において、アキュムレータデータ構造800は、より多くのフィールドを含んでいてもよい、または、示されているフィールドのうちの1つ以上を省いてもよい。
【0060】
値フィールド802は、グループ名または任意のその他の英数字の値等の、任意の適切なグループ識別子を格納し得る。この値は、メモリアロケータ408が、入力された行のグループ値を用いてこのフィールドをその初期状態に初期化するときに、格納すればよい。
【0061】
集約結果フィールド804は、グループの集約値を格納する。メモリアロケータ408は、このフィールドを、ゼロ値の空状態に初期化することができる。次に、このフィールドを、上記技術に従い集約動作ユニット508によって更新することができる。ある実施形態において、このフィールドに複数の集約をまとめて格納することができる。たとえば、以下のクエリがあるとする。
SELECT 合計(売上高)、カウント(*)
FROM 売上
GROUP BY 販売員
上記クエリに対し、1つのデータ構造に、合計(売上高)集約結果とカウント(*)集約結果双方を格納することができる。
【0062】
ポインタフィールド806は、NULLポインタ、または、現在のグループのグループ値と衝突するグループ値を有する別のグループのアキュムレータデータ構造に対するポインタを格納する。メモリアロケータ408は、このフィールドをNULL値に初期化し得る。データ構造800に対応付けられたグループと、新たに遭遇したグループの間に、ハッシュ衝突が発生した場合、新たに遭遇したグループに対してアキュムレータデータ構造が作成され、ポインタフィールドは、この新たなアキュムレータデータ構造に対するポインタを用いて更新される。たとえば、このポインタは、新たに遭遇したグループの値フィールドのメモリアドレスに対応していてもよい。
【0063】
順不同処理
タグを用いることにより、グループ化および集約中に、行の順不同処理を行なうことができる。このことは、ハッシュテーブルアクセスユニット150および集約状態アクセスユニット160をサポートする要求キューが順不同ディスパッチをサポートするように構成されているときに、有用であろう。
【0064】
たとえば、「販売員」列の第4行を処理するとき、集約状態アクセスユニット160は、Michaelグループのペイロードデータをフェッチすることを求める要求を与えることができる。集約状態アクセスユニット160は、タグ4等の対応するタグを有する要求キューに、この要求を与えることができる。この要求キューは先ず、このデータをマルチレベルキャッシュ114からフェッチすることを試みればよく、マルチレベルキャッシュ114になければ、RAM102からフェッチすることを試みればよい。説明のために、Michaelのペイロードデータをフェッチした結果、レイテンシが長いRAMアクセスになったと想定する。
【0065】
返されるべきMichaelグループのペイロードデータを待っている間に、集約状態アクセスユニット160は、「販売員」列の第5行を処理してもよい。よって、集約状態アクセスユニット160は、要求キューに対し、対応するタグとしてタグ5を有するAlexグループのペイロードデータをフェッチすることを求める要求を与える。次に、要求キューは、このグループのペイロードデータをマルチレベルキャッシュ114からフェッチしてもよく、Michaelのペイロードデータが返される前に、集約状態アクセスユニット160にペイロードデータおよび関連するタグを返してもよい。このペイロードデータおよび対応するタグ(タグ5)は次に値アクセス列ユニット140に送られる。
【0066】
このデータを集約状態アクセスユニット160から受けたことに応じ、値列アクセスユニット140は、集約状態アクセスユニット160から受けたタグ5を、ローカルメモリ510に格納されたタグ5と一致させることによって、集約動作で使用すべき値データを特定する。対応付けられた値データは、集約動作ユニット508に送られて、Alexグループのペイロードデータの中の集約値を更新する。このようにして、第4行の処理の前に第5行の処理を完了してもよい。
【0067】
処理および実装例
図6は、ある実施形態に従うグループ化および集約動作を実行するためのプロセスの一例を示す。このプロセスは、限定されないが、システム100を含む任意の適切なシステム上で実装し得る。
【0068】
グループ化/集約クエリを受けると、ステップ602で、このクエリによって特定されるテーブルから行が読出される。ステップ604で、グループ名および値データが、この行の関連する列から取出される。ステップ606で、グループ名がハッシュされることにより、ハッシュテーブル内の、または、他の形態の連想メモリ内の場所が特定される。ステップ608で、上記ハッシュによって示される場所からポインタが読出される。ステップ610で、このポインタがNULLか否かが判断される。そうであれば、このグループにそれまで遭遇していないことになり、ステップ612で、新たなグループに対しメモリが割当てられ、この割当てられたメモリの場所を特定するポインタを用いてハッシュテーブルが更新される。そのハッシュによって同一のメモリアドレスが生成された後続の行すべてに対し、上記ハッシュポインタが返されることになる。したがって、ステップ610でポインタがNULLでないと判断された場合、このプロセスはステップ614に進む。
【0069】
ステップ614で、入力された行のグループ名が、現在のポインタによって特定される場所に格納されているペイロードデータのグループ名と比較される。ステップ616で、衝突があるか否かが判断される。入力された行のグループ名がポインタによって特定されるペイロードデータに格納されたグループ名と一致する場合、衝突はなく、このプロセスはステップ626に進む。これらグループ名が一致していなければ、このプロセスはステップ618に進む。ステップ618で、同一のハッシュ値を有する次のグループに対するポインタがペイロードデータから取出される。ステップ620で、このポインタがNULLか否かが判断される。NULLであれば、現在のグループ名に対応付けられているグループにかつて遭遇していないことになり、このプロセスはステップ624に進む。ステップ624で、新たなグループに対しメモリが割当てられ、ステップ614で取出されたペイロードデータが、新たに割当てられたメモリの場所を特定するポインタを含むように更新される。ステップ620でポインタがNULLでないと判断された場合、ポインタによって特定される場所に格納されているペイロードデータが取出され、このプロセスはステップ614に戻り、この後続のペイロードデータに対して衝突検査が繰返される。
【0070】
新たなグループに遭遇すれば、または、衝突が検出されなければ、ステップ626で、集約動作およびステップ604で取出した値データに従い、対応するグループのペイロードデータにおける集約値が更新される。
【0071】
図7、
図9、および
図10は、
図6に示されるプロセスの実装例を示す。特に、これら図面は、テーブル2に示されるクエリ2の処理中のシステム100のさまざまな状態を示す。
【0072】
図7は、ある実装例に従うメモリ内の売上テーブル702のレイアウトを示すブロック図である。
図7を参照して、「販売_ID」列704、「販売員」列706、「顧客」列708、および「売上高」列710が、特定の列の行すべてが連続的にメモリに格納されるように、列優先方式で格納される。クエリ2の場合、ステップ602および604は、グループ列アクセスユニット130が、「販売員」列706の最初のエントリを読出してグループ名「Pedro」を取出すこと、および、値列アクセスユニット140が、「売上高」列710の最初の要素を読出して値データ「400」を取出すことを含み得る。
【0073】
次に、グループ名「Pedro」がハッシュされることにより、このグループのアキュムレータデータ構造に対するポインタが格納されることになるメモリアドレスが生成される。場合によっては、2つ以上の固有の入力値が同一の値にハッシュされる可能性があるので、グループ名「Pedro」および対応するポインタは、衝突の検査のためにハッシュテーブルアクセスユニット150に送られる。「Pedro」は処理される最初のグループなので、集約状態アクセスユニット160は、このポインタはNULLであると判断し、Pedroグループに対しメモリを割当てる。ある実施形態において、集約状態アクセスユニット160は、
図8に示されるようなアキュムレータデータ構造を生成し、フィールド各々を開始状態に初期化する。
【0074】
図9Aは、ある実施形態に従う初期化後のPedroのアキュムレータデータ構造の状態のブロック図である。値フィールドはグループ名に対応するPedroに初期化され、集約結果フィールドの値は「0」に初期化されている。このアドレスにはまだ衝突がないので、次の値に対するポインタはNULLに設定される。
【0075】
Pedroのアキュムレータデータ構造が初期化されると、集約結果フィールドの値が集約状態アクセスユニット160によって読出されて格納される。集約状態アクセスユニット160は、値「400」を集約動作ユニット508に与え、集約動作ユニット508は、行から抽出された値データを、集約状態アクセスユニット160によって与えられた集約結果値に加算する。これの更新後、集約結果値はメモリに書戻される。
図9Bは、第1行の処理後の、Pedroのアキュムレータデータ構造の状態のブロック図である。
図9Bを参照して、集約結果フィールドは、第1行の処理後の集約動作結果に対応する値「400」を格納している。
【0076】
アキュムレータデータ構造の更新後、このプロセスは、テーブルの残りの行各々に対して繰返される。第2行も、グループ名は、第1行と同一アドレスにハッシュする「Pedro」である。したがって、集約状態アクセスユニット160は、Pedroグループはすでにこの場所にあると判断する。次に、衝突検査ブロック406は、第2の要素のグループ名「Pedro」を、これも「Pedro」である、
図9Bに示されるアキュムレータデータ構造に格納されているグループ名と比較する。これらグループ名は同一であるので、集約状態アクセスユニット160は衝突がないと判断する。次に、Pedroのアキュムレータデータ構造の集約結果フィールドの値が、値列アクセスユニット140に読込まれ、値列アクセスユニット140は、このフィールドを新たな値(400+200=600)で更新し、更新されたフィールドをメモリに書戻す。
【0077】
説明のために、この例では、「Pedro」のハッシュと「Michael」のハッシュが衝突を生じさせると想定する。このため、ハッシュテーブルアクセスユニット150によって適用されるハッシュ関数によって、これらグループ名各々に同一のメモリアドレスが生成される。このような場合、衝突検査406は、この場所(「Pedro」)に格納された値は入力された行の値(「Michael」)と等しくないことを発見する。衝突検査406は次に、この場所に格納されている次の値を示すポインタを追跡することにより、次の要素に対して衝突検査を実施しようとする。この場合、次の値を示すポインタはNULLであり、これは、このハッシュ場所に他の値はなくこれがこの場所における最初の衝突であることを意味する。そこで、メモリアロケータは、新たなデータ構造をこのMichaelグループに対して作成し、Pedroグループにおける次の値を更新してMichaelを指すようにする。
【0078】
図9Cは、メモリアロケータがMichaelの値を初期化した後のアキュムレータデータ構造の状態を示す。示されているように、Pedroのアキュムレータデータ構造に格納されているポインタは、Michaelを指している。グループ名Alexは衝突を生じさせないので独立して格納される。
【0079】
Michaelのアキュムレータデータ構造の生成後、その集約値フィールドが上記プロセスに従って更新される。このプロセスは、テーブルの残りの行に対して繰返されて、グループ各々についての最終集約結果が得られる。
【0080】
図10は、集約プロセスの終了時のメモリの状態を示すブロック図である。ハッシュテーブル1002は4エントリのハッシュテーブルである。しかしながら、エントリの数は、実装毎に異なり得る。ハッシュテーブル1002は、2つのポインタ、すなわち、Pedroアキュムレータ1004に対するポインタと、Alexアキュムレータ1006に対するもう1つのポインタとを格納している。Pedroアキュムレータ1004は、Pedroについての集約結果と、Michaelアキュムレータ1008に対するポインタとを格納している。Alexアキュムレータ1006はAlexについての集約結果を格納しており、Michaelアキュムレータ1008はMichaelについての集約結果を格納している。これらアキュムレータいずれのポインタも、NULLであり、これらグループには衝突が生じていないことを示す。アキュムレータ各々についてのグループ名および対応する集約結果は、クエリ2の結果として返すことができる。
【0081】
ハッシュテーブルのサイズの選択
ハッシュテーブルのサイズは、実装毎に異なり得る。ハッシュテーブルが小さいほど衝突の可能性が高く、そうなるとシステムの性能が低下し得る。逆に、大きなハッシュテーブルはシステム内の記憶容量を浪費する可能性が高い。
【0082】
たとえば、
図11は、ある実施形態に従うハッシュテーブル構造の一例を示すブロック図である。ハッシュ関数1102は、入力されたNビット値に適用されて、メモリ1104に格納されているハッシュテーブル1106に対して3ビットアドレスを生成する。したがって、ハッシュテーブル1106内には、利用できるものとして8つの異なるハッシュテーブルエントリがある。示されているように、ハッシュテーブルは、3つの異なる値に対して3つのポインタを格納している。この場合、より小さい、2ビットアドレス可能ハッシュテーブルは、3つのポインタに対して十分な記憶領域を提供するであろう。しかしながら、より小さなハッシュテーブルの場合、特に受ける値が多くなると衝突の可能性が高くなる。4ビットアドレス可能ハッシュテーブルのようにより大きなテーブルは、特に新たな値を受けない場合は記憶リソースを浪費することになる。
【0083】
ある実施形態において、特定のクエリに対するハッシュテーブルのサイズは、グループ化動作の濃度(cardinality)の推定に基づいて判断され設定される。グループ化動作に関わる可能性があるグループの数が多いほど、より大きなメモリがハッシュテーブルに割当てられる。たとえば、Nビットアドレス可能ハッシュテーブルの値Nは、グループ化動作の濃度に比例していてもよい。したがって、ハッシュテーブルのサイズを選択することにより、記憶領域の消費と衝突の可能性とのバランスを十分にとることができる。
【0084】
ハッシュテーブルの衝突への対処
ハッシュテーブルの衝突に対応するための技術は、実装毎に異なり得る。上記衝突対処技術に代わるものとして、システム100は、ハッシュテーブル内の同一場所にマップされるであろうグループ名をすべて事前に計算してもよい。この事前計算は、データベースがシステム100にロードされたときに実行すればよい。次に、衝突しているグループを、これら衝突専用の第2のテーブルに置けばよい。その後、元のハッシュテーブルにおけるエントリを、そのアドレスにおける衝突の発生を示しかつ集約データが第2のテーブルにあることを示す特別キーと置換えればよい。
【0085】
衝突の検出時に第2のテーブルをサーチする方法として複数の方法がある。第2のテーブル内のエントリの数が少なければ、線形サーチが効果的であろう。衝突対処アルゴリズムを、第2のテーブル内の各エントリを通して反復し、所望のグループ名を第2のテーブルのグループ名と比較すればよい。一致することがわかると、この要素に対する集約値フィールドが返され更新される。
【0086】
別の実施形態において、異なるハッシュ関数を用いる第2のハッシュテーブルを用いてサーチを実装してもよい。この第2のハッシュテーブルに対するペイロードデータは、衝突がまだ生じるかもしれないので、全アキュムレータデータ構造を使用してもよい。
【0087】
さらに別の実施形態において、衝突テーブルを二進木構造で構成することができる。二進木の各ノードは、グループ名および集約値を格納し得る。正しいノードが発見されたときに、集約値を返して更新する。この木がバランスの取れたものである場合、テーブルをO(log(N))回サーチすればよい。
【0088】
事前計算手法の1つの利点は、フィールド802およびフィールド806が衝突の処理には不要であるので、アキュムレータデータ構造800のサイズが減じられることである。したがって、この手法は、衝突がわずかであるときには実時間の手法よりも記憶空間を節約できる。しかしながら、グループの事前計算には、特に新たなグループを生成するデータベース更新が頻繁である場合、上記他の手法よりも多くの処理オーバヘッドを伴い得る。この場合、新たなグループがロードされると、多くの事前計算を行なう必要があるかもしれない。
【0089】
ハードウェアの概要
1つの実施形態によれば、本明細書に記載の技術は、1つ以上の専用計算装置によって実装される。専用計算装置は、ハードウェアによって技術を実装し得る、または、技術を実装するように永続的にプログラミングされた1つ以上の特定用途向け集積回路(ASIC)もしくはフィールドプログラマブルゲートアレイ(FPGA)などのデジタル電子装置を含み得る、または、ファームウェア、メモリ、他の記憶装置、もしくは組合せにおけるプログラムコマンドに従って技術を実装するようにプログラムされた1つ以上の汎用ハードウェアプロセッサを含み得る。このような専用計算装置は、技術を達成するために、カスタムプログラミングにカスタムハードワイヤードロジック、ASIC、またはFPGAを組合わせてもよい。専用計算装置は、デスクトップコンピュータシステム、ポータブルコンピュータシステム、携帯用デバイス、ネットワーキングデバイス、または、技術を実装するためにハードワイヤードロジックおよび/もしくはプログラムロジックを組込んだ任意の他の装置であってもよい。
【0090】
たとえば、
図12は、本発明の実施形態が実装され得るコンピュータシステム1200を示すブロック図である。コンピュータシステム1200は、バス1202または情報を通信するための他の通信機構と、情報を処理するためにバス1202に結合されたハードウェアプロセッサ1204とを含む。ハードウェアプロセッサ1204は、たとえば、汎用マイクロプロセッサであってもよい。
【0091】
コンピュータシステム1200は、情報およびプロセッサ1204によって実行されるコマンドを格納するためにバス1202に結合された、ランダムアクセスメモリ(RAM)または他の動的記憶装置などのメインメモリ1206も含む。たとえば、RAM102はメインメモリ1206の中において実装されてもよい。メインメモリ1206は、プロセッサ1204によって実行されるコマンドの実行中に一時変数または他の中間情報を格納するためにも使用され得る。このようなコマンドは、プロセッサ1204にアクセス可能な非一時的な記録媒体に格納されると、コマンドにおいて指定された動作を行なうようにカスタマイズされた専用マシンにコンピュータシステム1200を変える。
【0092】
コンピュータシステム1200は、プロセッサ1204のための静的情報およびコマンドを格納するためにバス1202に結合された読出し専用メモリ(ROM)1208または他の静的記憶装置をさらに含む。磁気ディスクまたは光ディスクなどの記憶装置1210が設けられ、情報およびコマンドを格納するためにバス1202に結合される。
【0093】
コンピュータシステム1200は、コンピュータのユーザに対して情報を表示するための陰極線管(CRT)などのディスプレイ1212にバス1202を介して結合され得る。英数字および他のキーを含む入力装置1214は、プロセッサ1204に対して情報およびコマンド選択を伝えるためにバス1202に結合される。別のタイプのユーザ入力装置は、方向情報およびコマンド選択をプロセッサ1204に伝えるための、およびディスプレイ1212上でのカーソル移動を制御するための、マウス、トラックボール、またはカーソル方向キーなどのカーソル制御1216である。この入力装置は、通常、第1の軸(たとえばx)および第2の軸(たとえばy)という2つの軸において2つの自由度を有し、これによって面における位置をこの装置が指定できる。
【0094】
コンピュータシステム1200は、フィルタリング、射影、グループ化、および/または集約動作を実行するためのクエリ処理ロジック1232も含み得る。クエリ処理ロジック1232は、
図6に示されるプロセスを実行するように構成されてもよく、システム100のアクセスユニットなどの任意の適切なハードウェアを用いて実装されてもよい。クエリ処理ロジック1232は、クエリ処理動作中に使用され生成されるデータをキャッシュするメモリ1234に結合される。たとえば、キャッシュ110はメモリ1234の中で実装されてもよい。
【0095】
コンピュータシステム1200は、本明細書に記載される技術を、コンピュータシステムと組合わされてコンピュータシステム1200を専用マシンとするかまたは専用マシンとなるようにプログラミングする、カスタマイズされたハードワイヤードロジック、1つ以上のASICもしくはFPGA、ファームウェアおよび/またはプログラムロジックを用いて実装してもよい。ある実施形態によると、ここでの技術は、メインメモリ1206に含まれる1つ以上のコマンドの1つ以上のシーケンスをプロセッサ1204が実行することに応答して、コンピュータシステム1200によって行なわれる。このようなコマンドは、記憶装置1210などの他の記録媒体からメインメモリ1206に読込まれ得る。メインメモリ1206に含まれるコマンドのシーケンスを実行することにより、本明細書に記載の処理ステップがプロセッサ1204によって実行される。代替の実施形態において、ハードワイヤード回路を、ソフトウェアコマンドの代わりにまたはソフトウェアコマンドと組合わせて使用してもよい。
【0096】
本明細書において使用される用語「記録媒体」は、特定の方法でマシンを動作させるデータおよび/またはコマンドを格納する任意の非一時的な媒体をいう。このような記録媒体は、不揮発性の媒体および/または揮発性の媒体を含み得る。不揮発性の媒体は、たとえば、記憶装置1210などの光ディスクまたは磁気ディスクを含む。揮発性の媒体は、メインメモリ1206などの動的メモリを含む。記録媒体の一般的な形式は、たとえば、フロッピー(登録商標)ディスク、フレキシブルディスク、ハードディスク、ソリッドステートドライブ、磁気テープもしくは任意の他の磁気データ記録媒体、CD−ROM、任意の他の光データ記録媒体、穴のパターンを伴う任意の物理媒体、RAM、PROM、およびEPROM、FLASH−EPROM、NVRAM、任意の他のメモリチップもしくはカートリッジを含む。
【0097】
記録媒体は、伝送媒体とは異なるが、伝送媒体と併せて使用され得る。伝送媒体は、記録媒体間の情報の転送に関わる。たとえば、伝送媒体は、バス1202を包含するワイヤを含む、同軸ケーブル、銅線、および光ファイバを含む。伝送媒体は、電波および赤外線データ通信時に生成されるような音波または光波の形式を取り得る。
【0098】
さまざまな形式の媒体は、実行のためにプロセッサ1204に1つ以上のコマンドの1つ以上のシーケンスを搬送することに関わり得る。たとえば、コマンドは、リモートコンピュータの磁気ディスクまたはソリッドステートドライブ上に最初は担持され得る。リモートコンピュータは、そのダイナミックメモリにコマンドをロードし、モデムを用いて電話回線を介してコマンドを送ることができる。コンピュータシステム1200内のモデムは、電話回線上のデータを受け、赤外線送信器を使用してデータを赤外線信号に変換することができる。赤外線検知器は、赤外線信号で運ばれたデータを受けることができ、適切な回路によってこのデータをバス1202上に置くことができる。バス1202はデータをメインメモリ1206に送り、このメインメモリからプロセッサ1204はコマンドを取出して実行する。メインメモリ1206が受けたコマンドは、プロセッサ1204による実行の前または後に記憶装置1210上に任意に格納され得る。
【0099】
コンピュータシステム1200は、バス1202に結合された通信インターフェイス1218も含む。通信インターフェイス1218は、ローカルネットワーク1222に接続されたネットワークリンク1220に結合する双方向データ通信を提供する。たとえば、通信インターフェイス1218は、統合サービスデジタル網(ISDN)カード、ケーブルモデム、衛星モデム、またはモデムであり対応するタイプの電話回線へのデータ通信接続を提供してもよい。別の例として、通信インターフェイス1218は、ローカルエリアネットワーク(LAN)カードであり対応のLANへのデータ通信接続を提供してもよい。無線リンクも実装され得る。このような実装例において、通信インターフェイス1218は、さまざまなタイプの情報を表わすデジタルデータストリームを搬送する電気信号、電磁信号、または光信号を送信および受信する。
【0100】
ネットワークリンク1220は通常、1つ以上のネットワークを介して他のデータ装置へのデータ通信を提供する。たとえば、ネットワークリンク1220は、ローカルネットワーク1222を介し、ホストコンピュータ1224へ、または、インターネットサービスプロバイダ(ISP)1226によって運営されるデータ機器へ、接続を提供し得る。そうすると、ISP1226は、現在一般的に「インターネット」1228と呼ばれている全世界パケットデータ通信網を介してデータ通信サービスを提供する。ローカルネットワーク1222およびインターネット1228はいずれも、デジタルデータストリームを搬送する電気信号、電磁信号、または光信号を使用する。コンピュータシステム1200へおよびコンピュータシステム1200からデジタルデータを搬送する、さまざまなネットワークを介する信号、および、ネットワークリンク1220上の、通信インターフェイス1218を介する信号は、伝送媒体の形態の例である。
【0101】
コンピュータシステム1200は、ネットワーク、ネットワークリンク1220、および通信インターフェイス1218を介して、メッセージの送信、およびプログラムコードを含むデータの受信を行ない得る。インターネットの例において、サーバ1230は、インターネット1228、ISP1226、ローカルネットワーク1222、および通信インターフェイス1218を介してアプリケーションプログラムのための要求されたコードを送信し得る。
【0102】
受信されたコードは、受信され次第プロセッサ1204によって実行され得る、および/または記憶装置1210に格納され得る、または、後で実行するために他の不揮発性記憶装置に格納され得る。
【0103】
拡張および代替案
上記明細書では、実装毎に異なり得る多数の具体的な詳細を参照しながら本発明の実施形態を説明している。このため、明細書および図面は、限定的ではなく例示的な意味で考慮されねばならない。発明の範囲の唯一かつ排他的な指標および出願人が意図する発明の範囲は、本願に由来する一組の請求項の、このような請求項の元になる特定の形式の、後の任意の修正が含まれる、文言上のかつ均等物の範囲である。