(57)【特許請求の範囲】
【請求項１】
要求キューによって、第１の列によってグループ化されたデータを集約することを求める要求を受けることと、
前記要求を受けたことに応じて、複数の行のうちの各行に対し、
第１のハードウェアユニットによって、前記行の前記第１の列から値を取出すステップを含み、前記行の前記第１の列からの値は当該行についてのグループ値であり、
前記第１のハードウェアユニットによって、前記取出されたグループ値に固有のタグを割当てて格納するステップと、
第２のハードウェアユニットによって、前記行についての前記グループ値を揮発性メモリにおけるアドレスにマップするステップと、
第３のハードウェアユニットによって、前記アドレスに対応付けられている揮発性メモリから、前記グループ値に対応付けられているグループの一組の集約データを取出すステップと、
第４のハードウェアユニットによって、前記行の第２の列における値に基づいて、前記一組の集約データに含まれる集約値を更新するステップとを実行することとを含み、
前記第３のハードウェアユニットは、前記第１のハードウェアユニットによって格納されている固有のタグが割当てられたグループ値を参照して、衝突を検出する、方法。
【請求項２】
前記第４のハードウェアユニットによって、前記複数の行のうちの特定の行について、前記特定の行に対応付けられているグループ値についての集約データはまだ生成されていないと判断することと、
前記第４のハードウェアユニットによって、前記特定の行に対応付けられているグループ値についての集約データはまだ生成されていないという判断に応じて、前記特定の行に対応付けられているグループ値についての集約データを格納するためのメモリを割当てることとをさらに含む、請求項１に記載の方法。
【請求項３】
前記複数の行のうちの少なくとも２行において、異なるグループ値が同一アドレスにマップしており、前記方法は、
前記同一アドレスにマップする、前記複数の行のうちの特定の行における特定のグループ値について、前記第４のハードウェアユニットによって、
前記同一アドレスを用いて、格納されているグループ値を含む特定の一組の集約データの場所を求めることと、
前記格納されているグループ値を前記特定のグループ値と比較することと、
前記格納されているグループ値と前記特定のグループ値が一致しているという判断に応じて、前記一組の集約データに含まれる集約値を、前記第２の列の前記特定の行における第２の値に基づいて更新することとをさらに含む、請求項１または２に記載の方法。
【請求項４】
前記格納されているグループ値と前記特定のグループ値が一致していないという判断に応じて、前記第４のハードウェアユニットによって、
新たなグループの集約データを格納するためのメモリを割当てることと、
前記割当てられたメモリのアドレスを特定するポインタを生成することと、
前記特定の一組の集約データに前記ポインタを格納することとをさらに含む、請求項３に記載の方法。
【請求項５】
前記グループ値をアドレスにマップするステップは、ハッシュ関数を前記グループ値に適用することを含む、請求項１〜４のいずれか１項に記載の方法。
【請求項６】
前記グループの一組の集約データは、グループ値と、集約値と、衝突するグループの第２の一組の集約データに対するポインタとを含む、請求項１〜５のいずれか１項に記載の方法。
【請求項７】
前記アドレスはハッシュテーブルに格納され、前記ハッシュテーブルのサイズは、データを集約することを求める前記要求に対応付けられているグループの数の推定に基づいて選択される、請求項１〜６のいずれか１項に記載の方法。
【請求項８】
前記第１のハードウェアユニット、前記第２のハードウェアユニット、前記第３のハードウェアユニット、および前記第４のハードウェアユニットは、別々の、異なるハードウェアユニットである、請求項１〜７のいずれか１項に記載の方法。
【請求項９】
グループ化および集約動作を実行するためのシステムであって、
各行の第１の列から第１のグループのグループ値を取出すとともに、前記取出されたグループ値に固有のタグを割当てて格納するように構成されたグループ列アクセスユニットと、
前記グループ値をアドレスにマップするように構成されたハッシュテーブルアクセスユニットと、
前記第１のグループについての前記アドレスに格納されているポインタによって特定される集約データを取出すように構成された集約状態アクセスユニットと、
第２の列の前記行における値に基づいて、前記集約データに含まれる集約値を更新するように構成された値列アクセスユニットとを備え、
前記集約状態アクセスユニットは、前記グループ列アクセスユニットによって格納されている固有のタグが割当てられたグループ値を参照して、衝突を検出する、システム。
【請求項１０】
前記集約状態アクセスユニットはさらに、
前記第１のグループについてのポインタはまだ生成されていないと判断するように、
かつ
前記第１のグループについてのポインタはまだ生成されていないという判断に応じて、前記第１のグループの集約データを格納するためのメモリを割当てるように、かつ
前記第１のグループについてのポインタを生成するように構成され、
前記第１のグループについてのポインタは、前記割当てられたメモリのアドレスを特定する、請求項９に記載のシステム。
【請求項１１】
前記ハッシュテーブルアクセスユニットはさらに、第２の行に格納されている第２のグループ値を第２のアドレスにマップするように構成され、
前記集約状態アクセスユニットはさらに、第２のグループについての前記第２のアドレスに格納されている第２のポインタによって特定される集約データを取出すように構成され、
前記値列アクセスユニットはさらに、前記第２の列の第２の行における値に基づいて、前記第２のポインタによって特定される集約データにおける集約値を更新するように構成される、請求項９または１０に記載のシステム。
【請求項１２】
前記ハッシュテーブルアクセスユニットはさらに、前記第１の列の第２の行における第２のグループ値をアドレスにマップするように構成され、
前記集約状態アクセスユニットはさらに、前記グループ値と前記第２のグループ値を比較し、前記グループ値と前記第２のグループ値が一致するという判断に応じて、前記第２の列の第２の行における第２の値に基づいて前記集約データにおける集約値を更新するように構成される、請求項９〜１１のいずれか１項に記載のシステム。
【請求項１３】
前記集約状態アクセスユニットはさらに、前記グループ値と前記第２のグループ値が一致しないという判断に応じて、
第２のグループの集約データを格納するためのメモリを割当てるように、かつ
前記割当てられたメモリのアドレスを特定する第２のポインタを生成するように、かつ
前記第１のグループの集約データに前記第２のポインタを格納するように構成される、請求項１２に記載のシステム。
【請求項１４】
前記ハッシュテーブルアクセスユニットは、ハッシュ関数を前記グループ値に適用して前記グループ値を前記アドレスにマップするように構成され、
前記グループ列アクセスユニット、前記ハッシュテーブルアクセスユニット、前記集約状態アクセスユニット、および前記値列アクセスユニットは、別々の、異なるハードウェアユニットである、請求項９〜１３のいずれか１項に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
発明の分野
本開示は、概してデータベース動作を実行するための技術に関し、より具体的にはグループ化および集約動作を実行するための技術に関する。
【背景技術】
【０００２】
背景
このセクションで説明される手法は、遂行可能な手法であるが、必ずしも過去に考案または遂行された手法ではない。したがって、特に明示されない限り、このセクションで説明される手法のうちのいずれも、このセクションに含まれているというだけで先行技術とみなされるべきではない。
【発明の概要】
【課題を解決するための手段】
【０００３】
データベースは、一組のハードディスク等の１つ以上の記憶装置に格納されたデータとメタデータとを含む。データベース内のデータは、実装に応じてさまざまなデータモデルに従い論理的に構成し得る。たとえば、リレーショナルデータベースシステムは通常、データを一組のテーブルに格納し、各テーブルは１組の行と列で構成されている。ほとんどの場合、各行は特異なオブジェクトを表わし、各列は特異な属性を表わす。しかしながら、他のデータモデルを用いてデータを構成してもよい。
【０００４】
データベース内のデータにアクセスしこのデータを操作するために、データベース管理システム（ＤＢＭＳ）は一般的に、さまざまな、クエリと呼ばれることが多いデータベースコマンドを受けて処理するように構成される。多くの実装において、ＤＢＭＳは、構造化照会言語（ＳＱＬ）等のデータ操作言語（ＤＭＬ）に準拠したクエリをサポートする。ＤＢＭＳは、クエリを受けると、このクエリによって指定された１つ以上のデータベース動作を実行し、クエリ結果を出力し得る。データベース動作の例は、以下で説明される集約（aggregation）およびグループ化（grouping）動作を含む。
【０００５】
集約およびグループ化動作
集約およびグループ化動作は、特定の列のデータに関する簡易統計を提供するデータベース動作である。ＳＱＬにおいて、グループ化動作は、ＧＲＯＵＰ  ＢＹ構文を用いて、１つ以上の列により、集約関数の結果をグループ化する。以下のテーブル１は、データベースクエリにおいて使用し得る集約関数の例を示す。
【０００６】
【表１】
0006356675.tif 000002
【０００７】
集約およびグループ化クエリの例は以下のテーブル２に示される。
【０００８】
【表２】
0006356675.tif 000003
【０００９】
上記クエリは各々、ＤＢＭＳによって実行されるときに、売上テーブルの「売上高」列内の値のデータを集約する。たとえば、以下のテーブル３は売上テーブルの一例を示す。
【００１０】
【表３】
0006356675.tif 000004
【００１１】
クエリ１は、企業のドルでの売上総額を要求する。クエリ１が実行されるとき、ＤＢＭＳは集約を実行するがグループ化は行なわない。ＤＢＭＳは、売上テーブルにおけるすべての売上高を無条件で合計して最終結果を返す。テーブル３の売上テーブルの例の場合にクエリ１を実行したときの予想される出力を以下のテーブル４に示す。
【００１２】
【表４】
0006356675.tif 000005
【００１３】
クエリ２は、販売した販売員毎にグループ化されたドルでの売上総額を要求する。クエリ２が実行されるとき、ＤＢＭＳはグループ化および集約双方を実行する。具体的には、ＤＢＭＳは、売上テーブルにおける各販売員についての集約結果を１つ生成する。この結果は、特定の販売員による総売上である。テーブル３の売上テーブルの例の場合にクエリ２を実行したときの予想される出力を以下のテーブル５に示す。
【００１４】
【表５】
0006356675.tif 000006
【００１５】
クエリ３は、売上に対応付けられた販売員および顧客毎にグループ化されたドルでの売上総額を要求する。クエリ３が実行されるとき、ＤＢＭＳは、複数列に基づくグループ化および集約を実行する。この場合、販売員−顧客ペア各々について１つの集約結果があるであろう。この集約結果は、特定の販売員−顧客ペアについての総売上である。テーブル３の売上テーブルの例の場合にクエリ３を実行したときの予想される出力を以下のテーブル６に示す。
【００１６】
【表６】
0006356675.tif 000007
【００１７】
本開示は、限定ではなく例示を目的として添付の図面に示され、これらの図面において同様の参照番号は同様の要素を示している。
【図面の簡単な説明】
【００１８】
【図１Ａ】ある実施形態に従いグループ化および集約動作を実行するためのシステムアーキテクチャの一例を示すブロック図である。
【図１Ｂ】ある実施形態に従いグループ化および集約動作を実行するためのシステムアーキテクチャの一例を示すブロック図である。
【図２】ある実施形態に従うグループ列アクセスブロックのアーキテクチャの一例を示すブロック図である。
【図３】ある実施形態に従うハッシュテーブルアクセスブロックのアーキテクチャの一例を示すブロック図である。
【図４】ある実施形態に従う集約状態アクセスブロックのアーキテクチャの一例を示すブロック図である。
【図５】ある実施形態に従う値列アクセスブロックのアーキテクチャの一例を示すブロック図である。
【図６】ある実施形態に従いグループ化および集約動作を実行するためのプロセスの一例を示すフローチャートである。
【図７】ある実施形態に従うメモリ内の売上テーブルのレイアウトを示すブロック図である。
【図８】ある実施形態に従うアキュムレータデータ構造のブロック図である。
【図９Ａ】ある実施形態に従うグループ化および集約動作中のアキュムレータデータ構造の状態のブロック図である。
【図９Ｂ】ある実施形態に従うグループ化および集約動作中のアキュムレータデータ構造の状態のブロック図である。
【図９Ｃ】ある実施形態に従うグループ化および集約動作中のアキュムレータデータ構造の状態のブロック図である。
【図１０】ある実施形態に従うグループ化および集約動作の実行後のメモリの状態を示すブロック図である。
【図１１】ある実施形態に従うハッシュテーブル構造の一例を示すブロック図である。
【図１２】実施形態が実装され得るコンピュータシステムのブロック図である。
【発明を実施するための形態】
【００１９】
詳細な説明
以下の記載では、本発明が十分に理解されるよう、数多くの具体的な詳細事項が説明のために述べられている。しかしながら、これらの具体的な詳細事項がなくとも本発明を実施し得ることは明らかであろう。他の場合では、本発明を不必要に曖昧にするのを避けるために、周知の構造および装置はブロック図の形式で示される。
【００２０】
全体の概要
グループ化および集約データベース動作を実行するための技術が説明される。ある実施形態において、専用ハードウェアが、グループ化および集約データベース動作を効率的かつ効果的に実行するように構成される。この専用ハードウェアは、グループ化動作を実行するとき、任意の数のグループをサポートし得る。
【００２１】
さらに、グループ化および集約を、テーブルデータのグローバルソートなしで実行し得る。グローバルソートを避けることによって、大きなリストをソートする間に生じるランダムなメモリアクセスの問題は緩和される。たとえば、リストをソートする間に、メモリの１つのブロック内に位置するグループに、あるアイテムが入る一方で、メモリの別のブロック内に位置するグループに、次のアイテムが属することがある。通常、この場合のソートされたテーブルを書込むためには、新たなメモリページを閉じて開くことを繰返す必要がある。本明細書に記載の技術に従い、グループ化および集約をメモリの小さなチャンクに対して実行してもよく、そうすることで高速で消費電力の少ないキャッシュにおいてランダムなアクセスを生じさせることができる。
【００２２】
ある実施形態において、システムは、第１の列によってグループ化して集約する動作を要求するクエリを受ける。グループ化動作は第１の列に対して実行されるので、第１の列内の個々の値を本明細書では「グループ値」と呼ぶ。
【００２３】
クエリを受けたことに応じて、システムは第１の列のグループ値を１つ以上のアドレスにマップする。たとえば、システムは、ハッシュ関数を各グループ値に適用することにより、特定のグループ値をマップするアドレスを決定してもよい。同一のグループ値は同一のアドレスにマップされ、異なるグループ値は衝突が生じていない限り異なるアドレスにマップされている。
【００２４】
ある実施形態において、グループ値がマップされた各アドレスは、テーブルまたは連想メモリ（content-addressable memory）（ＣＡＭ）内のエントリを特定する。エントリは、記憶場所を特定するポインタを格納していてもよい。記憶場所とは、この記憶場所にハッシュされたグループ値に対応付けられているグループの、一組の集約データの記憶場所である。たとえば、第１の列が、記憶場所Ｙにハッシュされた値Ｘを有する場合、記憶場所Ｙは、第１の列内でＸを有する行の集約データに対するポインタを格納しているエントリを特定する。
【００２５】
ある行のグループ値がエントリにマップされたときに、システムは、このグループの一組の集約データに含まれる集約値を更新してもよい。システムは、第１の列の各行について、グループ値をマップするステップおよび集約値を更新するステップを実行してもよい。
【００２６】
ある実施形態において、システムは、衝突検出を実行することにより、２つ以上の異なるグループが同一の集約値を更新しないことを保証してもよい。たとえば、一組の集約データは、集約値に加えてグループ値を含み得る。第２のグループ値が第１のグループ値と同一のアドレスにマップされている場合、第２のグループ値を、一組の集約データの中に格納されているグループ値と突合せて検査する。これらが一致していれば、衝突は発生しておらず、集約値を更新すればよい。しかしながら、これらグループ値が一致していなければ、衝突が検出される。
【００２７】
衝突に対処するために、一組の集約データは、次のグループの集約データの記憶場所を示すポインタを含んでいてもよい。このポインタは最初はＮＵＬＬ値に設定してもよい。衝突の発生時に、ポインタを更新してポインタが次のグループの一組の集約データを示すようにしてもよい。ポインタの設定後に次の衝突が生じた場合は、次のグループの一組の集約データを取出し、衝突を検出しそれに対処するプロセスを次のグループに対して繰返せばよい。
【００２８】
グループ化および集約動作を処理するためのアーキテクチャの例
図１Ａおよび図１Ｂは、ある実施形態に従いグループ化および集約動作を実行するためのシステムアーキテクチャの一例を示すブロック図である。概して、システム１００は、ランダムアクセスメモリ（ＲＡＭ）１０２と、ＲＡＭコントローラ１０４と、キャッシュ１１０と、要求キュー１２０と、グループ列アクセスユニット１３０と、値列アクセスユニット１４０と、ハッシュテーブルアクセスユニット１５０と、集約状態アクセスユニット１６０とを含む。
【００２９】
ＲＡＭ１０２は、格納しているデータへのランダムなアクセスが可能な任意の形態のデータ記憶装置を用いて実装し得る。ＲＡＭ１０２の例は、ダイナミックＲＡＭ（ＤＲＡＭ）およびスタティックＲＡＭ（ＳＲＡＭ）を含むがこれに限定されない。ある実施形態に従うと、ＲＡＭ１０２は、グループ化／集約データベースクエリによる問合せの対象であるデータベースの少なくとも一部を格納する。ＲＡＭ１０２内に格納されるデータの構成は、実装毎に異なり得る。ある実施形態において、ＲＡＭ１０２はデータベースをハイブリッド列状フォーマットで格納する。このフォーマットに従って、ＲＡＭ１０２はＮブロックのデータを格納し、Ｎは任意の正の整数である。各ブロック内には、１つ以上の列に対し決まった数の行が列優先方式で格納される。たとえば、データベーステーブルの１つ以上の列に対し、第１のブロックは最初の５０行を格納し、第２のブロックは次の５０行を格納し、第３のブロックは次の３０行を格納していてもよい。各ブロック内において、各列の列値は連続的に格納される。
【００３０】
ＲＡＭコントローラ１０４は、ＲＡＭ１０２へのおよびＲＡＭ１０２からのデータの流れを管理するメモリコントローラである。したがって、ＲＡＭコントローラ１０４は、キャッシュ１１０または要求キュー１２０からＲＡＭ１０２へのデータ書込およびＲＡＭ１０２からのデータ読出要求を処理し得る。ＲＡＭコントローラ１０４は任意の適切なメモリコントローラを用いて実装すればよく、このメモリコントローラは、ダブルデータレートＤＤＲメモリコントローラ、デュアルチャネルメモリコントローラ、または完全バッファ型メモリコントローラを含むが、これに限定されない。
【００３１】
キャッシュ１１０は、グループ化／集約クエリの処理中にアクセスブロックによって使用されるデータを格納する。キャッシュメモリの場合、ＲＡＭと同様、格納されているデータにランダムにアクセスすることができるが、通常キャッシュメモリはＲＡＭよりもサイズが小さくデータアクセスのレイテンシが小さい。したがって、データをキャッシュすることにより、グループ化／集約クエリに対してデータを処理しているときのＲＡＭ１０２に対する入出力動作の回数が少なくなるので、データのボトルネックを減じるとともにシステム１００の性能を改善することができる。
【００３２】
要求キュー１２０は、アクセスブロックへのおよびアクセスブロックからの要求をバッファする。このアクセスブロックは、グループ列アクセスユニット１３０、値列アクセスユニット１４０、ハッシュテーブルアクセスユニット１５０、および集約状態アクセスユニット１６０を含む。たとえば、グループ化／集約クエリを受けたとき、アクセスブロックは、ＲＡＭ１０２またはキャッシュ１１０に特定の行または行の値を要求し得る。要求キュー１２０は、アクセスブロックからの複数のこれらの要求をバッファし得る。そうすることで、メモリフェッチがパイプライン化され、要求された読出しの結果、ＲＡＭアクセスのレイテンシが長い場合に、高帯域幅を維持することができる。
【００３３】
システム１００内の、グループ列アクセスユニット１３０、値列アクセスユニット１４０、ハッシュテーブルアクセスユニット１５０、および集約状態アクセスユニット１６０を含む、アクセスブロックは、以下でさらに詳細に説明される技術に従う、フェッチ、グループアキュムレータの更新、およびメモリへの結果のライトバックを実行する役割を果たす。
【００３４】
メモリ構成
システム１００のメモリシステムを個々のセクションに分割することによって、クエリ処理中のデータアクセスを最適化してもよい。図１Ｂは、システム１００の記憶階層の一例を示すブロック図である。示されているように、メモリシステムは２つのセクション、すなわちバッファ１１２とマルチレベルキャッシュ１１４に分割されている。
【００３５】
バッファ１１２は、オンチップバッファとして実装されてもよく、非管理方式で動作してもよい。たとえば、バッファ１１２は、開始メモリアドレスを受けそれに応じてＲＡＭ１０２からデータを逐次的に読出してもよい。ある実施形態において、グループ列アクセスユニット１３０および値列アクセスユニット１４０は、バッファ１１２を通してＲＡＭ１０２にアクセスする。以下で説明される技術に従うと、これらブロックは、データを逐次的に読出し、このデータに対する変更は実行しない。よって、アクセスパターンがわかっており逐次的であるので、データをバッファ１１２に効率的にプリロードすることができる。
【００３６】
マルチレベルキャッシュ１１４は、レベル１（Ｌ１）、レベル２（Ｌ２）、およびレベル３（Ｌ３）キャッシュを含む階層のような、中央処理装置（ＣＰＵ）のキャッシュ階層と同様の方式で動作し得る、管理されているキャッシュである。したがって、マルチレベルキャッシュ１１４は、より大きくより低速でより高レベルのキャッシュによってバックアップされる、レベル１（Ｌ１）キャッシュのようなより小さくより高速でより低レベルのキャッシュを含み得る。
【００３７】
ある実施形態において、ハッシュテーブルアクセスユニット１５０および集約状態アクセスユニット１６０は、マルチレベルキャッシュ１１４を通してＲＡＭ１０２にアクセスする。ＲＡＭ１０２内またはディスク上にあるデータにアクセスするとき、これらユニットは、先ずマルチレベルキャッシュ１１４のより低レベルのキャッシュをサーチし、続いてマルチレベルキャッシュ１１４のより高いレベルのキャッシュをサーチしてもよい。たとえば、これらユニットは、先ずＬ１キャッシュにおける関連データを探し、続いてＬ２キャッシュを探し、次にＬ３キャッシュを探してもよい。どのキャッシュレベルにおいてもデータが見つからない場合は、そのデータをＲＡＭ１０２に要求すればよい。以下でより詳細に説明されるように、ハッシュテーブルアクセスユニット１５０および集約状態アクセスユニット１６０は、ランダムにデータを読出して変更し、これらデータアクセスにはある程度の空間的および時間的局所性があってもよい。このため、マルチレベルキャッシュはこれらユニットのサポートに十分適している。
【００３８】
要求キュー１２０は、アクセスユニットから受けたメモリアクセス要求をバッファする。ある実施形態において、要求キュー１２０は、要求を、受けた順序と同じ順序で処理してもよい。たとえば、要求キュー１２０は、メモリに対するアクセス要求をディスパッチし、次の要求の処理の前にトランザクションが完了するまで待つようにしてもよい。これに代わるものとしては、ハッシュテーブルアクセスユニット１５０および集約状態アクセスユニット１６０をサポートする要求キューを、順不同のディスパッチをサポートするように構成してもよい。たとえば、たとえＲＡＭ１０２に対する要求が最初に送られていたとしても、ＲＡＭ１０２に対するレイテンシが長いアクセスよりも前に、マルチレベルキャッシュ１１４に対するレイテンシが低いアクセスに応えてもよい。このように、メモリアクセスが遅い場合は利用できるハードウェアリソースをより適切に利用すればよい。
【００３９】
グループ列アクセスユニット
図２は、グループ列アクセスユニット１３０のアーキテクチャの一例を示すブロック図である。概して、グループ列アクセスユニット１３０は、アドレス生成器２０４と、タグ割当部２０６と、ローカルメモリ２０８とを含む。グループ列アクセスユニット１３０は、グループ化されている列の値をフェッチする役割を果たす。説明のためにクエリ２が実行されているものとする。クエリ２では、グループ化されている列は「販売員」である。したがって、この例において、グループ列アクセスユニット１３０は、「販売員」列から値をフェッチする役割を果たす。
【００４０】
アドレス生成器２０４は、グループ化されている列のメモリアドレスを生成し、このアドレスをメモリ要求キュー２０２に送る。ある実施形態において、アドレス生成器２０４は、グループ化された列の開始アドレスから始める。したがって、この例では、アドレス生成器２０４は「販売員」列の開始アドレスを要求キュー２０２に送ることになる。
【００４１】
図２では、アドレス生成器２０４によって発行された要求は、「メモリへ」送られるものとして示されている。図１を参照しながら説明したように、実際、要求をメモリに送ることは、マルチレベルキャッシュ１１４の１つ以上のレベルにおいてデータを探し、該当するデータがマルチレベルキャッシュ１１４になければＲＡＭ１０２からデータを取出すことを含み得る。しかしながら、説明のために、上記要求は単に「メモリシステムへ」送られ要求されたデータを「このメモリシステム」からグループ列アクセスユニット１３０が受けるものとする。
【００４２】
したがって、アドレス生成器２０４が生成したアドレスに応じて、メモリシステムは、グループ化された列（たとえば「販売員」）の行毎に、グループ名を順次返す。要求キュー２０２は、これらグループ名をローカルメモリ２０８に格納する。加えて、タグ割当部２０６は、入力されたグループ名各々に固有のタグを割当て、このタグは、ローカルメモリ２０８内において対応する名称の隣に格納される。たとえば、この例では、アドレス生成器２０４は「販売員」列の開始のアドレスを提供し得る。これに応じて、「Pedro」を受け、タグ１というタグとともにローカルメモリ２０８に格納する。次に、アドレス生成器２０４は「販売員」列の次の値のアドレスを提供する。これに応じて、「Pedro」を受け、タグ２というタグとともにローカルメモリ２０８に格納する。このプロセスは「販売員」列の残りの行に対して繰返されるであろう。
【００４３】
ある実施形態において、タグ割当部２０６によって割当てられるタグは、行識別子として機能する。行識別子は、対応する行を追跡し、後に集約プロセスにおいて得られる値等の他のデータとこの行を対応付けるために使用し得る。タグ割当部２０６は、入力された行を一意的に識別するために任意の適切なやり方でタグを生成し得る。たとえば、タグ割当部は、入力されたそれぞれのグループ名に連続番号を割当てるカウンタとして実装してもよい。よって、「行ＩＤ」列にアクセスすることをＲＡＭ１０２に求めるメモリ要求を発行しなくても、タグは、「行ＩＤ」属性についてのプロキシとして機能する固有の識別子を各行に与えることができる。タグはまた、データエントリの順不同の処理を可能にし、複数のアクセスブロックにわたる特定のトランザクションの識別に使用し得る。
【００４４】
ある実施形態に従うと、グループ列アクセスユニット１３０は、入力されたグループ名を、ハッシュのために直接ハッシュテーブルアクセスユニット１５０に送る。加えて、タグおよび対応付けられたグループ名を含む小さなローカルメモリ２０８の内容は、集約状態アクセスユニット１６０に送られ、このユニットではグループ名が衝突の検査に使用される。
【００４５】
ハッシュテーブルアクセスユニット
図３は、ある実施形態に従うハッシュテーブルアクセスユニット１５０のアーキテクチャの一例を示すブロック図である。概して、ハッシュテーブルアクセスユニット１５０は、ハッシュ生成器３０４とローカルメモリ３０６とを含む。ハッシュテーブルアクセスユニット１５０は、グループ名にハッシュ関数を適用し対応するポインタをフェッチする役割を果たす。
【００４６】
ハッシュ生成器３０４は、グループ列アクセスユニット１３０から行毎にグループ名を受け、入力されたグループ名各々にハッシュ関数を適用する。ハッシュ関数は、グループ名をハッシュテーブルエントリのアドレスにマップする任意の適切な関数を用いて実装すればよい。ハッシュ関数の適用後、ハッシュ生成器３０４は、ハッシュ関数によって生成されたハッシュ値に対応するアドレスのハッシュテーブルエントリからポインタをフェッチするために、メモリ要求を要求キュー３０２に送る。要求キュー３０２は、ローカルキャッシュ（たとえばマルチレベルキャッシュ１１４）またはＲＡＭ１０２からポインタをフェッチし、このポインタをローカルメモリ３０６に返す。
【００４７】
ハッシュ生成器３０４に与えられるグループ値を本明細書では「入力グループ値」と呼ぶ。ある実施形態において、この入力グループ値にかつて遭遇していない場合、ハッシュテーブルエントリはＮＵＬＬポインタを格納する。たとえば、「Alex」が初めてハッシュ生成器３０４に与えられたとき、ハッシュテーブルエントリがＮＵＬＬポインタとともに返される。
【００４８】
一方、入力グループ値にかつて遭遇している場合またはハッシュ衝突が生じている場合、ハッシュ値に基づいて得られたハッシュテーブルエントリは、「アキュムレータ」データ構造に対するポインタを格納する。衝突が生じていない場合、アキュムレータデータ構造は、入力グループ値のためのものである。衝突の場合、アキュムレータデータ構造は、入力グループ値と同一のハッシュ値にハッシュするグループ名を有する別のグループのためのものであってもよい。
【００４９】
アキュムレータデータ構造は、グループのさまざまなデータを格納し、以下でさらに詳しく説明される。メモリシステムがポインタを返すと、このポインタは、処理されている特定の行に対応するタグとともにローカルメモリ３０６に格納される。対応するタグは、グループ列アクセスユニット１３０から受けることができる。タグおよび対応するポインタを含む、ローカルメモリ３０６の出力は、集約状態アクセスユニット１６０に送られ、このユニットは、ポインタによって示されるアドレスのペイロードデータをフェッチする。
【００５０】
集約状態アクセスユニット
図４は、ある実施形態に従う集約状態アクセスユニット１６０のアーキテクチャの一例を示すブロック図である。概して、集約状態アクセスユニット１６０は、マルチプレクサ（ＭＵＸ）４０４と、衝突検査ブロック４０６と、メモリアロケータ４０８と、ローカルメモリ４１０とを含む。集約状態アクセスユニット１６０は、ハッシュテーブルポインタによって示されるアドレスのペイロードデータをフェッチしこのペイロードデータに対して衝突検査を実施する役割を果たす。
【００５１】
ＭＵＸ４０４は、ハッシュテーブルアクセスユニット１５０からハッシュテーブルポインタを受ける。ハッシュテーブルアクセスユニット１５０からの入力ポインタは先ず、ＮＵＬＬポインタか否かを判断するために検査される。ＮＵＬＬポインタは、対応するグループにそれまで遭遇していないことを示すとともに、このグループについてのアキュムレータを格納するためにメモリ（memory）を割当てるべきであることを示す。ポインタがＮＵＬＬの場合、メモリアロケータ４０８は、このグループに対してメモリを割当て、対応するグループアキュムレータにおけるフィールドを初期状態に初期化し、データをローカルメモリ４１０に書込む。新たに遭遇したグループの、ローカルメモリ４１０における初期集約値は、空のままであってもよく、またはゼロに設定してもよい。
【００５２】
ポインタがＮＵＬＬでない場合、ＭＵＸ４０４は、このポインタによって特定されるメモリアドレスを、ペイロードデータをフェッチするために要求キュー４０２に送る。要求キュー４０２は、このペイロードデータを、ローカルキャッシュ（たとえばマルチレベルキャッシュ１１４）を通してフェッチし、衝突検査４０６に返す。ローカルキャッシュがこのペイロードを送ると、衝突検査４０６は、ペイロードデータ内の返されたグループ名を、グループ列アクセスユニット１３０によって送られたグループ名と比較する。これらグループ名が一致していれば衝突はなく、このグループの集約値を含むペイロードデータが、衝突検査トランザクションが生じた対応する行を特定するタグとともに、ローカルメモリ４１０に書込まれる。
【００５３】
これらグループ名が一致していなければ衝突が検出され、次のペイロードに対するポインタが、ペイロードデータから抽出され、ＭＵＸ４０４のＮＵＬＬ検査に返される。ＭＵＸでは、以前と同じプロセスが新たなポインタを用いて行なわれる。このプロセスは、次のペイロードに対するポインタがＮＵＬＬになるまで、または、返されたグループ値がグループ列アクセスユニット１３０から送られたグループ名と一致するまで、繰返される。
【００５４】
ローカルメモリキャッシュ４１０の出力は値列アクセスユニット１４０に送られ、アクセスユニット１４０はこのアキュムレータデータ構造を更新する。
【００５５】
値列アクセスユニット
図５は、ある実施形態に従う値列アクセスユニット１４０のアーキテクチャの一例を示すブロック図である。概して、値列アクセスユニット１４０は、アドレス生成器５０４と、タグ割当部５０６と、集約動作ユニット５０８と、ローカルメモリ５１０とを含む。値列アクセスユニット１４０は、集約されている列（たとえばクエリ２の場合は「売上高」列）の値をフェッチする役割を果たす。
【００５６】
グループ列アクセスユニット１３０と同様、アドレス生成器５０４は、列の開始アドレスから始め、所望のアドレスを要求キュー５０２に送る。メモリシステムは、これらの値を行毎に返す。タグ割当部５０６は、行識別子に対応する各行にタグを割当て、結果はローカルメモリ５１０に書込まれる。ある実施形態では、タグ割当部５０６によって所与の行に割当てられたタグは、この行から読出されたグループ名に割当てられたタグと一致するので、以下で説明されるように値列アクセスユニット１４０がグループデータを集約するときに、これら２つのデータを相互に対応付ければよい。
【００５７】
ローカルメモリ５１０からの値、現在のアキュムレータデータ状態、および集約状態アクセスユニット１６０からの対応するタグは、集約動作ユニット５０８に送られる。集約動作ユニット５０８は、このタグを用いて、ローカルメモリ５１０から、一致するタグを有する値を取出す。集約動作ユニット５０８は次に、クエリにおいて指定された集約関数およびローカルメモリ５１０から与えられた値に基づいて、このグループの集約値を更新する。集約動作ユニット５０８は、限定されないがテーブル１に示される関数のうちいずれかを実行し得る。たとえばクエリ２の場合、Pedroグループのアキュムレータデータ構造は、第１行の処理後、値４００を有するであろう。第２行を処理するとき、ローカルメモリ５１０は値２００を集約動作ユニット５０８に与え、ユニット５０８はこの値と４００を合計して値６００を生成する。次に、Pedroグループのアキュムレータデータ構造は、この値を用いて更新される。動作の完了後、更新されたアキュムレータは、集約状態アクセスユニット１６０におけるローカルメモリ４１０にまたはローカルキャッシュに書戻される。
【００５８】
アキュムレータデータ構造
ある実施形態において、システム１００は、処理する各グループに対してアキュムレータデータ構造を生成し維持する。各グループに対するアキュムレータデータ構造は、そのグループの一組の集約データを格納する。アキュムレータデータ構造に格納される一組のデータは、実装および実行されている集約動作の種類に応じて異なり得る。
【００５９】
図８は、ある実施形態に従うアキュムレータデータ構造のブロック図である。アキュムレータデータ構造８００は、値フィールド８０２と、集約結果フィールド８０４と、ポインタフィールド８０６とを含む。代替の実施形態において、アキュムレータデータ構造８００は、より多くのフィールドを含んでいてもよい、または、示されているフィールドのうちの１つ以上を省いてもよい。
【００６０】
値フィールド８０２は、グループ名または任意のその他の英数字の値等の、任意の適切なグループ識別子を格納し得る。この値は、メモリアロケータ４０８が、入力された行のグループ値を用いてこのフィールドをその初期状態に初期化するときに、格納すればよい。
【００６１】
集約結果フィールド８０４は、グループの集約値を格納する。メモリアロケータ４０８は、このフィールドを、ゼロ値の空状態に初期化することができる。次に、このフィールドを、上記技術に従い集約動作ユニット５０８によって更新することができる。ある実施形態において、このフィールドに複数の集約をまとめて格納することができる。たとえば、以下のクエリがあるとする。
ＳＥＬＥＣＴ  合計（売上高）、カウント（*）
ＦＲＯＭ  売上
ＧＲＯＵＰ  ＢＹ  販売員
上記クエリに対し、１つのデータ構造に、合計（売上高）集約結果とカウント（*）集約結果双方を格納することができる。
【００６２】
ポインタフィールド８０６は、ＮＵＬＬポインタ、または、現在のグループのグループ値と衝突するグループ値を有する別のグループのアキュムレータデータ構造に対するポインタを格納する。メモリアロケータ４０８は、このフィールドをＮＵＬＬ値に初期化し得る。データ構造８００に対応付けられたグループと、新たに遭遇したグループの間に、ハッシュ衝突が発生した場合、新たに遭遇したグループに対してアキュムレータデータ構造が作成され、ポインタフィールドは、この新たなアキュムレータデータ構造に対するポインタを用いて更新される。たとえば、このポインタは、新たに遭遇したグループの値フィールドのメモリアドレスに対応していてもよい。
【００６３】
順不同処理
タグを用いることにより、グループ化および集約中に、行の順不同処理を行なうことができる。このことは、ハッシュテーブルアクセスユニット１５０および集約状態アクセスユニット１６０をサポートする要求キューが順不同ディスパッチをサポートするように構成されているときに、有用であろう。
【００６４】
たとえば、「販売員」列の第４行を処理するとき、集約状態アクセスユニット１６０は、Michaelグループのペイロードデータをフェッチすることを求める要求を与えることができる。集約状態アクセスユニット１６０は、タグ４等の対応するタグを有する要求キューに、この要求を与えることができる。この要求キューは先ず、このデータをマルチレベルキャッシュ１１４からフェッチすることを試みればよく、マルチレベルキャッシュ１１４になければ、ＲＡＭ１０２からフェッチすることを試みればよい。説明のために、Michaelのペイロードデータをフェッチした結果、レイテンシが長いＲＡＭアクセスになったと想定する。
【００６５】
返されるべきMichaelグループのペイロードデータを待っている間に、集約状態アクセスユニット１６０は、「販売員」列の第５行を処理してもよい。よって、集約状態アクセスユニット１６０は、要求キューに対し、対応するタグとしてタグ５を有するAlexグループのペイロードデータをフェッチすることを求める要求を与える。次に、要求キューは、このグループのペイロードデータをマルチレベルキャッシュ１１４からフェッチしてもよく、Michaelのペイロードデータが返される前に、集約状態アクセスユニット１６０にペイロードデータおよび関連するタグを返してもよい。このペイロードデータおよび対応するタグ（タグ５）は次に値アクセス列ユニット１４０に送られる。
【００６６】
このデータを集約状態アクセスユニット１６０から受けたことに応じ、値列アクセスユニット１４０は、集約状態アクセスユニット１６０から受けたタグ５を、ローカルメモリ５１０に格納されたタグ５と一致させることによって、集約動作で使用すべき値データを特定する。対応付けられた値データは、集約動作ユニット５０８に送られて、Alexグループのペイロードデータの中の集約値を更新する。このようにして、第４行の処理の前に第５行の処理を完了してもよい。
【００６７】
処理および実装例
図６は、ある実施形態に従うグループ化および集約動作を実行するためのプロセスの一例を示す。このプロセスは、限定されないが、システム１００を含む任意の適切なシステム上で実装し得る。
【００６８】
グループ化／集約クエリを受けると、ステップ６０２で、このクエリによって特定されるテーブルから行が読出される。ステップ６０４で、グループ名および値データが、この行の関連する列から取出される。ステップ６０６で、グループ名がハッシュされることにより、ハッシュテーブル内の、または、他の形態の連想メモリ内の場所が特定される。ステップ６０８で、上記ハッシュによって示される場所からポインタが読出される。ステップ６１０で、このポインタがＮＵＬＬか否かが判断される。そうであれば、このグループにそれまで遭遇していないことになり、ステップ６１２で、新たなグループに対しメモリが割当てられ、この割当てられたメモリの場所を特定するポインタを用いてハッシュテーブルが更新される。そのハッシュによって同一のメモリアドレスが生成された後続の行すべてに対し、上記ハッシュポインタが返されることになる。したがって、ステップ６１０でポインタがＮＵＬＬでないと判断された場合、このプロセスはステップ６１４に進む。
【００６９】
ステップ６１４で、入力された行のグループ名が、現在のポインタによって特定される場所に格納されているペイロードデータのグループ名と比較される。ステップ６１６で、衝突があるか否かが判断される。入力された行のグループ名がポインタによって特定されるペイロードデータに格納されたグループ名と一致する場合、衝突はなく、このプロセスはステップ６２６に進む。これらグループ名が一致していなければ、このプロセスはステップ６１８に進む。ステップ６１８で、同一のハッシュ値を有する次のグループに対するポインタがペイロードデータから取出される。ステップ６２０で、このポインタがＮＵＬＬか否かが判断される。ＮＵＬＬであれば、現在のグループ名に対応付けられているグループにかつて遭遇していないことになり、このプロセスはステップ６２４に進む。ステップ６２４で、新たなグループに対しメモリが割当てられ、ステップ６１４で取出されたペイロードデータが、新たに割当てられたメモリの場所を特定するポインタを含むように更新される。ステップ６２０でポインタがＮＵＬＬでないと判断された場合、ポインタによって特定される場所に格納されているペイロードデータが取出され、このプロセスはステップ６１４に戻り、この後続のペイロードデータに対して衝突検査が繰返される。
【００７０】
新たなグループに遭遇すれば、または、衝突が検出されなければ、ステップ６２６で、集約動作およびステップ６０４で取出した値データに従い、対応するグループのペイロードデータにおける集約値が更新される。
【００７１】
図７、図９、および図１０は、図６に示されるプロセスの実装例を示す。特に、これら図面は、テーブル２に示されるクエリ２の処理中のシステム１００のさまざまな状態を示す。
【００７２】
図７は、ある実装例に従うメモリ内の売上テーブル７０２のレイアウトを示すブロック図である。図７を参照して、「販売＿ＩＤ」列７０４、「販売員」列７０６、「顧客」列７０８、および「売上高」列７１０が、特定の列の行すべてが連続的にメモリに格納されるように、列優先方式で格納される。クエリ２の場合、ステップ６０２および６０４は、グループ列アクセスユニット１３０が、「販売員」列７０６の最初のエントリを読出してグループ名「Pedro」を取出すこと、および、値列アクセスユニット１４０が、「売上高」列７１０の最初の要素を読出して値データ「４００」を取出すことを含み得る。
【００７３】
次に、グループ名「Pedro」がハッシュされることにより、このグループのアキュムレータデータ構造に対するポインタが格納されることになるメモリアドレスが生成される。場合によっては、２つ以上の固有の入力値が同一の値にハッシュされる可能性があるので、グループ名「Pedro」および対応するポインタは、衝突の検査のためにハッシュテーブルアクセスユニット１５０に送られる。「Pedro」は処理される最初のグループなので、集約状態アクセスユニット１６０は、このポインタはＮＵＬＬであると判断し、Pedroグループに対しメモリを割当てる。ある実施形態において、集約状態アクセスユニット１６０は、図８に示されるようなアキュムレータデータ構造を生成し、フィールド各々を開始状態に初期化する。
【００７４】
図９Ａは、ある実施形態に従う初期化後のPedroのアキュムレータデータ構造の状態のブロック図である。値フィールドはグループ名に対応するPedroに初期化され、集約結果フィールドの値は「０」に初期化されている。このアドレスにはまだ衝突がないので、次の値に対するポインタはＮＵＬＬに設定される。
【００７５】
Pedroのアキュムレータデータ構造が初期化されると、集約結果フィールドの値が集約状態アクセスユニット１６０によって読出されて格納される。集約状態アクセスユニット１６０は、値「４００」を集約動作ユニット５０８に与え、集約動作ユニット５０８は、行から抽出された値データを、集約状態アクセスユニット１６０によって与えられた集約結果値に加算する。これの更新後、集約結果値はメモリに書戻される。図９Ｂは、第１行の処理後の、Pedroのアキュムレータデータ構造の状態のブロック図である。図９Ｂを参照して、集約結果フィールドは、第１行の処理後の集約動作結果に対応する値「４００」を格納している。
【００７６】
アキュムレータデータ構造の更新後、このプロセスは、テーブルの残りの行各々に対して繰返される。第２行も、グループ名は、第１行と同一アドレスにハッシュする「Pedro」である。したがって、集約状態アクセスユニット１６０は、Pedroグループはすでにこの場所にあると判断する。次に、衝突検査ブロック４０６は、第２の要素のグループ名「Pedro」を、これも「Pedro」である、図９Ｂに示されるアキュムレータデータ構造に格納されているグループ名と比較する。これらグループ名は同一であるので、集約状態アクセスユニット１６０は衝突がないと判断する。次に、Pedroのアキュムレータデータ構造の集約結果フィールドの値が、値列アクセスユニット１４０に読込まれ、値列アクセスユニット１４０は、このフィールドを新たな値（４００＋２００＝６００）で更新し、更新されたフィールドをメモリに書戻す。
【００７７】
説明のために、この例では、「Pedro」のハッシュと「Michael」のハッシュが衝突を生じさせると想定する。このため、ハッシュテーブルアクセスユニット１５０によって適用されるハッシュ関数によって、これらグループ名各々に同一のメモリアドレスが生成される。このような場合、衝突検査４０６は、この場所（「Pedro」）に格納された値は入力された行の値（「Michael」）と等しくないことを発見する。衝突検査４０６は次に、この場所に格納されている次の値を示すポインタを追跡することにより、次の要素に対して衝突検査を実施しようとする。この場合、次の値を示すポインタはＮＵＬＬであり、これは、このハッシュ場所に他の値はなくこれがこの場所における最初の衝突であることを意味する。そこで、メモリアロケータは、新たなデータ構造をこのMichaelグループに対して作成し、Pedroグループにおける次の値を更新してMichaelを指すようにする。
【００７８】
図９Ｃは、メモリアロケータがMichaelの値を初期化した後のアキュムレータデータ構造の状態を示す。示されているように、Pedroのアキュムレータデータ構造に格納されているポインタは、Michaelを指している。グループ名Alexは衝突を生じさせないので独立して格納される。
【００７９】
Michaelのアキュムレータデータ構造の生成後、その集約値フィールドが上記プロセスに従って更新される。このプロセスは、テーブルの残りの行に対して繰返されて、グループ各々についての最終集約結果が得られる。
【００８０】
図１０は、集約プロセスの終了時のメモリの状態を示すブロック図である。ハッシュテーブル１００２は４エントリのハッシュテーブルである。しかしながら、エントリの数は、実装毎に異なり得る。ハッシュテーブル１００２は、２つのポインタ、すなわち、Pedroアキュムレータ１００４に対するポインタと、Alexアキュムレータ１００６に対するもう１つのポインタとを格納している。Pedroアキュムレータ１００４は、Pedroについての集約結果と、Michaelアキュムレータ１００８に対するポインタとを格納している。Alexアキュムレータ１００６はAlexについての集約結果を格納しており、Michaelアキュムレータ１００８はMichaelについての集約結果を格納している。これらアキュムレータいずれのポインタも、ＮＵＬＬであり、これらグループには衝突が生じていないことを示す。アキュムレータ各々についてのグループ名および対応する集約結果は、クエリ２の結果として返すことができる。
【００８１】
ハッシュテーブルのサイズの選択
ハッシュテーブルのサイズは、実装毎に異なり得る。ハッシュテーブルが小さいほど衝突の可能性が高く、そうなるとシステムの性能が低下し得る。逆に、大きなハッシュテーブルはシステム内の記憶容量を浪費する可能性が高い。
【００８２】
たとえば、図１１は、ある実施形態に従うハッシュテーブル構造の一例を示すブロック図である。ハッシュ関数１１０２は、入力されたＮビット値に適用されて、メモリ１１０４に格納されているハッシュテーブル１１０６に対して３ビットアドレスを生成する。したがって、ハッシュテーブル１１０６内には、利用できるものとして８つの異なるハッシュテーブルエントリがある。示されているように、ハッシュテーブルは、３つの異なる値に対して３つのポインタを格納している。この場合、より小さい、２ビットアドレス可能ハッシュテーブルは、３つのポインタに対して十分な記憶領域を提供するであろう。しかしながら、より小さなハッシュテーブルの場合、特に受ける値が多くなると衝突の可能性が高くなる。４ビットアドレス可能ハッシュテーブルのようにより大きなテーブルは、特に新たな値を受けない場合は記憶リソースを浪費することになる。
【００８３】
ある実施形態において、特定のクエリに対するハッシュテーブルのサイズは、グループ化動作の濃度（cardinality）の推定に基づいて判断され設定される。グループ化動作に関わる可能性があるグループの数が多いほど、より大きなメモリがハッシュテーブルに割当てられる。たとえば、Ｎビットアドレス可能ハッシュテーブルの値Ｎは、グループ化動作の濃度に比例していてもよい。したがって、ハッシュテーブルのサイズを選択することにより、記憶領域の消費と衝突の可能性とのバランスを十分にとることができる。
【００８４】
ハッシュテーブルの衝突への対処
ハッシュテーブルの衝突に対応するための技術は、実装毎に異なり得る。上記衝突対処技術に代わるものとして、システム１００は、ハッシュテーブル内の同一場所にマップされるであろうグループ名をすべて事前に計算してもよい。この事前計算は、データベースがシステム１００にロードされたときに実行すればよい。次に、衝突しているグループを、これら衝突専用の第２のテーブルに置けばよい。その後、元のハッシュテーブルにおけるエントリを、そのアドレスにおける衝突の発生を示しかつ集約データが第２のテーブルにあることを示す特別キーと置換えればよい。
【００８５】
衝突の検出時に第２のテーブルをサーチする方法として複数の方法がある。第２のテーブル内のエントリの数が少なければ、線形サーチが効果的であろう。衝突対処アルゴリズムを、第２のテーブル内の各エントリを通して反復し、所望のグループ名を第２のテーブルのグループ名と比較すればよい。一致することがわかると、この要素に対する集約値フィールドが返され更新される。
【００８６】
別の実施形態において、異なるハッシュ関数を用いる第２のハッシュテーブルを用いてサーチを実装してもよい。この第２のハッシュテーブルに対するペイロードデータは、衝突がまだ生じるかもしれないので、全アキュムレータデータ構造を使用してもよい。
【００８７】
さらに別の実施形態において、衝突テーブルを二進木構造で構成することができる。二進木の各ノードは、グループ名および集約値を格納し得る。正しいノードが発見されたときに、集約値を返して更新する。この木がバランスの取れたものである場合、テーブルをＯ（ｌｏｇ（Ｎ））回サーチすればよい。
【００８８】
事前計算手法の１つの利点は、フィールド８０２およびフィールド８０６が衝突の処理には不要であるので、アキュムレータデータ構造８００のサイズが減じられることである。したがって、この手法は、衝突がわずかであるときには実時間の手法よりも記憶空間を節約できる。しかしながら、グループの事前計算には、特に新たなグループを生成するデータベース更新が頻繁である場合、上記他の手法よりも多くの処理オーバヘッドを伴い得る。この場合、新たなグループがロードされると、多くの事前計算を行なう必要があるかもしれない。
【００８９】
ハードウェアの概要
１つの実施形態によれば、本明細書に記載の技術は、１つ以上の専用計算装置によって実装される。専用計算装置は、ハードウェアによって技術を実装し得る、または、技術を実装するように永続的にプログラミングされた１つ以上の特定用途向け集積回路（ＡＳＩＣ）もしくはフィールドプログラマブルゲートアレイ（ＦＰＧＡ）などのデジタル電子装置を含み得る、または、ファームウェア、メモリ、他の記憶装置、もしくは組合せにおけるプログラムコマンドに従って技術を実装するようにプログラムされた１つ以上の汎用ハードウェアプロセッサを含み得る。このような専用計算装置は、技術を達成するために、カスタムプログラミングにカスタムハードワイヤードロジック、ＡＳＩＣ、またはＦＰＧＡを組合わせてもよい。専用計算装置は、デスクトップコンピュータシステム、ポータブルコンピュータシステム、携帯用デバイス、ネットワーキングデバイス、または、技術を実装するためにハードワイヤードロジックおよび／もしくはプログラムロジックを組込んだ任意の他の装置であってもよい。
【００９０】
たとえば、図１２は、本発明の実施形態が実装され得るコンピュータシステム１２００を示すブロック図である。コンピュータシステム１２００は、バス１２０２または情報を通信するための他の通信機構と、情報を処理するためにバス１２０２に結合されたハードウェアプロセッサ１２０４とを含む。ハードウェアプロセッサ１２０４は、たとえば、汎用マイクロプロセッサであってもよい。
【００９１】
コンピュータシステム１２００は、情報およびプロセッサ１２０４によって実行されるコマンドを格納するためにバス１２０２に結合された、ランダムアクセスメモリ（ＲＡＭ）または他の動的記憶装置などのメインメモリ１２０６も含む。たとえば、ＲＡＭ１０２はメインメモリ１２０６の中において実装されてもよい。メインメモリ１２０６は、プロセッサ１２０４によって実行されるコマンドの実行中に一時変数または他の中間情報を格納するためにも使用され得る。このようなコマンドは、プロセッサ１２０４にアクセス可能な非一時的な記録媒体に格納されると、コマンドにおいて指定された動作を行なうようにカスタマイズされた専用マシンにコンピュータシステム１２００を変える。
【００９２】
コンピュータシステム１２００は、プロセッサ１２０４のための静的情報およびコマンドを格納するためにバス１２０２に結合された読出し専用メモリ（ＲＯＭ）１２０８または他の静的記憶装置をさらに含む。磁気ディスクまたは光ディスクなどの記憶装置１２１０が設けられ、情報およびコマンドを格納するためにバス１２０２に結合される。
【００９３】
コンピュータシステム１２００は、コンピュータのユーザに対して情報を表示するための陰極線管（ＣＲＴ）などのディスプレイ１２１２にバス１２０２を介して結合され得る。英数字および他のキーを含む入力装置１２１４は、プロセッサ１２０４に対して情報およびコマンド選択を伝えるためにバス１２０２に結合される。別のタイプのユーザ入力装置は、方向情報およびコマンド選択をプロセッサ１２０４に伝えるための、およびディスプレイ１２１２上でのカーソル移動を制御するための、マウス、トラックボール、またはカーソル方向キーなどのカーソル制御１２１６である。この入力装置は、通常、第１の軸（たとえばｘ）および第２の軸（たとえばｙ）という２つの軸において２つの自由度を有し、これによって面における位置をこの装置が指定できる。
【００９４】
コンピュータシステム１２００は、フィルタリング、射影、グループ化、および／または集約動作を実行するためのクエリ処理ロジック１２３２も含み得る。クエリ処理ロジック１２３２は、図６に示されるプロセスを実行するように構成されてもよく、システム１００のアクセスユニットなどの任意の適切なハードウェアを用いて実装されてもよい。クエリ処理ロジック１２３２は、クエリ処理動作中に使用され生成されるデータをキャッシュするメモリ１２３４に結合される。たとえば、キャッシュ１１０はメモリ１２３４の中で実装されてもよい。
【００９５】
コンピュータシステム１２００は、本明細書に記載される技術を、コンピュータシステムと組合わされてコンピュータシステム１２００を専用マシンとするかまたは専用マシンとなるようにプログラミングする、カスタマイズされたハードワイヤードロジック、１つ以上のＡＳＩＣもしくはＦＰＧＡ、ファームウェアおよび／またはプログラムロジックを用いて実装してもよい。ある実施形態によると、ここでの技術は、メインメモリ１２０６に含まれる１つ以上のコマンドの１つ以上のシーケンスをプロセッサ１２０４が実行することに応答して、コンピュータシステム１２００によって行なわれる。このようなコマンドは、記憶装置１２１０などの他の記録媒体からメインメモリ１２０６に読込まれ得る。メインメモリ１２０６に含まれるコマンドのシーケンスを実行することにより、本明細書に記載の処理ステップがプロセッサ１２０４によって実行される。代替の実施形態において、ハードワイヤード回路を、ソフトウェアコマンドの代わりにまたはソフトウェアコマンドと組合わせて使用してもよい。
【００９６】
本明細書において使用される用語「記録媒体」は、特定の方法でマシンを動作させるデータおよび／またはコマンドを格納する任意の非一時的な媒体をいう。このような記録媒体は、不揮発性の媒体および／または揮発性の媒体を含み得る。不揮発性の媒体は、たとえば、記憶装置１２１０などの光ディスクまたは磁気ディスクを含む。揮発性の媒体は、メインメモリ１２０６などの動的メモリを含む。記録媒体の一般的な形式は、たとえば、フロッピー(登録商標）ディスク、フレキシブルディスク、ハードディスク、ソリッドステートドライブ、磁気テープもしくは任意の他の磁気データ記録媒体、ＣＤ−ＲＯＭ、任意の他の光データ記録媒体、穴のパターンを伴う任意の物理媒体、ＲＡＭ、ＰＲＯＭ、およびＥＰＲＯＭ、ＦＬＡＳＨ−ＥＰＲＯＭ、ＮＶＲＡＭ、任意の他のメモリチップもしくはカートリッジを含む。
【００９７】
記録媒体は、伝送媒体とは異なるが、伝送媒体と併せて使用され得る。伝送媒体は、記録媒体間の情報の転送に関わる。たとえば、伝送媒体は、バス１２０２を包含するワイヤを含む、同軸ケーブル、銅線、および光ファイバを含む。伝送媒体は、電波および赤外線データ通信時に生成されるような音波または光波の形式を取り得る。
【００９８】
さまざまな形式の媒体は、実行のためにプロセッサ１２０４に１つ以上のコマンドの１つ以上のシーケンスを搬送することに関わり得る。たとえば、コマンドは、リモートコンピュータの磁気ディスクまたはソリッドステートドライブ上に最初は担持され得る。リモートコンピュータは、そのダイナミックメモリにコマンドをロードし、モデムを用いて電話回線を介してコマンドを送ることができる。コンピュータシステム１２００内のモデムは、電話回線上のデータを受け、赤外線送信器を使用してデータを赤外線信号に変換することができる。赤外線検知器は、赤外線信号で運ばれたデータを受けることができ、適切な回路によってこのデータをバス１２０２上に置くことができる。バス１２０２はデータをメインメモリ１２０６に送り、このメインメモリからプロセッサ１２０４はコマンドを取出して実行する。メインメモリ１２０６が受けたコマンドは、プロセッサ１２０４による実行の前または後に記憶装置１２１０上に任意に格納され得る。
【００９９】
コンピュータシステム１２００は、バス１２０２に結合された通信インターフェイス１２１８も含む。通信インターフェイス１２１８は、ローカルネットワーク１２２２に接続されたネットワークリンク１２２０に結合する双方向データ通信を提供する。たとえば、通信インターフェイス１２１８は、統合サービスデジタル網（ＩＳＤＮ）カード、ケーブルモデム、衛星モデム、またはモデムであり対応するタイプの電話回線へのデータ通信接続を提供してもよい。別の例として、通信インターフェイス１２１８は、ローカルエリアネットワーク（ＬＡＮ）カードであり対応のＬＡＮへのデータ通信接続を提供してもよい。無線リンクも実装され得る。このような実装例において、通信インターフェイス１２１８は、さまざまなタイプの情報を表わすデジタルデータストリームを搬送する電気信号、電磁信号、または光信号を送信および受信する。
【０１００】
ネットワークリンク１２２０は通常、１つ以上のネットワークを介して他のデータ装置へのデータ通信を提供する。たとえば、ネットワークリンク１２２０は、ローカルネットワーク１２２２を介し、ホストコンピュータ１２２４へ、または、インターネットサービスプロバイダ（ＩＳＰ）１２２６によって運営されるデータ機器へ、接続を提供し得る。そうすると、ＩＳＰ１２２６は、現在一般的に「インターネット」１２２８と呼ばれている全世界パケットデータ通信網を介してデータ通信サービスを提供する。ローカルネットワーク１２２２およびインターネット１２２８はいずれも、デジタルデータストリームを搬送する電気信号、電磁信号、または光信号を使用する。コンピュータシステム１２００へおよびコンピュータシステム１２００からデジタルデータを搬送する、さまざまなネットワークを介する信号、および、ネットワークリンク１２２０上の、通信インターフェイス１２１８を介する信号は、伝送媒体の形態の例である。
【０１０１】
コンピュータシステム１２００は、ネットワーク、ネットワークリンク１２２０、および通信インターフェイス１２１８を介して、メッセージの送信、およびプログラムコードを含むデータの受信を行ない得る。インターネットの例において、サーバ１２３０は、インターネット１２２８、ＩＳＰ１２２６、ローカルネットワーク１２２２、および通信インターフェイス１２１８を介してアプリケーションプログラムのための要求されたコードを送信し得る。
【０１０２】
受信されたコードは、受信され次第プロセッサ１２０４によって実行され得る、および／または記憶装置１２１０に格納され得る、または、後で実行するために他の不揮発性記憶装置に格納され得る。
【０１０３】
拡張および代替案
上記明細書では、実装毎に異なり得る多数の具体的な詳細を参照しながら本発明の実施形態を説明している。このため、明細書および図面は、限定的ではなく例示的な意味で考慮されねばならない。発明の範囲の唯一かつ排他的な指標および出願人が意図する発明の範囲は、本願に由来する一組の請求項の、このような請求項の元になる特定の形式の、後の任意の修正が含まれる、文言上のかつ均等物の範囲である。
【図１Ａ】
0006356675.tif 000008
【図１Ｂ】
0006356675.tif 000009
【図２】
0006356675.tif 000010
【図３】
0006356675.tif 000011
【図４】
0006356675.tif 000012
【図５】
0006356675.tif 000013
【図６】
0006356675.tif 000014
【図７】
0006356675.tif 000015
【図８】
0006356675.tif 000016
【図９Ａ】
0006356675.tif 000017
【図９Ｂ】
0006356675.tif 000018
【図９Ｃ】
0006356675.tif 000019
【図１０】
0006356675.tif 000020
【図１１】
0006356675.tif 000021
【図１２】
0006356675.tif 000022