(57)【要約】  サーバに接続されてデータベース処理を行うアクセラレータを有し、サーバは、クエリを受け付けてデータベースコマンドを生成し、処理対象のデータベースの範囲と、ひとつのデータベースコマンドで処理する単位サイズを決定してアクセラレータに指令し、アクセラレータは、前記指令に基づいて、単位サイズでストレージ装置からデータベースの処理対象データを読み込んで所定の処理単位に分轄して、所定の処理単位ごとにグルーピング処理とスタッキング処理と集約処理とを含むデータベース処理を実行して集約結果を出力し、前記サーバは、処理対象のデータベースの範囲についての集約結果をアクセラレータから受け付けると、当該集約結果を集計してクエリに対する処理結果として生成する。
2016185542.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、メモリと、を含むサーバと、
前記サーバに接続されてデータベース処理を行うアクセラレータと、
前記アクセラレータに接続されてデータベースを格納するストレージ装置と、を有する計算機システムであって、
前記サーバは、
クエリを受け付けてデータベースコマンドを生成し、処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを決定して、前記アクセラレータに指令するサーバコマンド処理部と、
前記アクセラレータの出力を集計して前記クエリに対する処理結果を生成する再集約部と、を有し、
前記アクセラレータは、
前記サーバコマンド処理部からの指令に基づいて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力するデータベース処理部を有し、
前記再集約部は、
前記処理対象のデータベースの範囲についての集約結果を前記アクセラレータから受け付けると、当該集約結果を集計して前記クエリに対する処理結果として生成することを特徴とする計算機システム。
【請求項２】
請求項１に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理と、前記スタッキング処理とを前記所定の処理単位で並列して実行することを特徴とする計算機システム。
【請求項３】
請求項１に記載の計算機システムであって、
前記データベース処理部は、
前記所定の処理単位のデータ列についてグルーピング処理を行うグルーピング処理部を有し、
前記グルーピング処理部は、
前記データ列のデータについてハッシュ値とグループ情報を算出し、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知することを特徴とする計算機システム。
【請求項４】
請求項３に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理部が、前記ハッシュ値の衝突を検知したときには、前記グループ情報と、前記スタッキング処理の結果である数値を出力することを特徴とする計算機システム。
【請求項５】
請求項１に記載の計算機システムであって、
前記ストレージ装置は、
前記データベースを格納する第１の記憶部と、
前記第１の記憶部よりも読み出し速度が高速な半導体記憶媒体で構成されて前記アクセラレータにデータを読み込ませる第２の記憶部と、を有し、
前記アクセラレータは、
前記処理対象のデータベースの範囲について前記第１の記憶部から前記第２の記憶部へコピーさせ、前記第２の記憶部から前記単位サイズ毎に読み込むことを特徴とする計算機システム。
【請求項６】
請求項１に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理で、前記所定の処理単位のデータ列のデータについてハッシュ値とグループ情報を算出し、
前記スタッキング処理で、前記所定の処理単位のデータ列のデータについて数値を算出し、
前記集約処理で、前記グループ情報毎に前記数値情報を集約した数値情報を算出し、前記集約結果に前記グループ情報と、数値情報を含み、
前記再集約部は、
前記グループ情報からハッシュ値を算出してグループハッシュ情報に格納し、当該ハッシュ値に基づいて前記処理対象のデータベースの範囲についての集約結果を並び替えてから前記数値情報を集計して、前記クエリに対する処理結果を生成することを特徴とする計算機システム。
【請求項７】
請求項６に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理で、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知すると、前記グループ情報と、前記スタッキング処理の結果である数値を出力し、
前記再集約部は、
前記グループハッシュ情報を参照して、前記ハッシュ値が衝突した前記グループ情報と前記スタッキング処理の数値を再度集約して、前記クエリに対する処理結果を再計算することを特徴とする計算機システム。
【請求項８】
請求項３に記載の計算機システムであって、
前記サーバコマンド処理部は、
前記再集約部が受け付けたハッシュ値の衝突の発生頻度が予め設定した閾値を超えた場合には、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを縮小することを特徴とする計算機システム。
【請求項９】
データベースを格納するストレージ装置に接続されて、データベースコマンドを受け付けてデータベース処理を行うアクセラレータであって、
処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズと、を受け付けて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力するデータベース処理部を有し、
前記データベース処理部は、
前記グルーピング処理と、前記スタッキング処理とを前記所定の処理単位で並列して実行することを特徴とするアクセラレータ。
【請求項１０】
請求項９に記載のアクセラレータであって、
前記データベース処理部は、
前記所定の処理単位のデータ列についてグルーピング処理を行うグルーピング処理部を有し、
前記グルーピング処理部は、
前記データ列のデータについてハッシュ値とグループ情報を算出し、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知することを特徴とするアクセラレータ。
【請求項１１】
請求項１０に記載のアクセラレータであって、
前記データベース処理部は、
前記グルーピング処理部が、前記ハッシュ値の衝突を検知したときには、前記グループ情報と、前記スタッキング処理の結果である数値を出力することを特徴とするアクセラレータ。
【請求項１２】
請求項９に記載のアクセラレータであって、
前記ストレージ装置は、
前記データベースを格納する第１の記憶部と、
前記第１の記憶部よりも読み出し速度が高速な半導体記憶媒体で構成されて前記アクセラレータにデータを読み込ませる第２の記憶部と、を有し、
前記データベース処理部は、
前記処理対象のデータベースの範囲について前記第１の記憶部から前記第２の記憶部へコピーさせ、前記第２の記憶部から前記単位サイズ毎に読み込むことを特徴とするアクセラレータ。
【請求項１３】
プロセッサと、メモリと、を含むサーバが、前記サーバに接続されてデータベース処理を行うアクセラレータに、前記アクセラレータに接続されたストレージ装置のデータベースを処理させるデータベースの処理方法であって、
前記サーバが、クエリを受け付けてデータベースを生成し、処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを決定して、前記アクセラレータに指令する第１のステップと、
前記アクセラレータが、前記サーバからの前記指令に基づいて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力する第２のステップと、
前記サーバが、前記アクセラレータの出力を集計して前記クエリに対する処理結果を生成する第３のステップと、を含み、
前記第３のステップは、
前記処理対象のデータベースの範囲についての集約結果を前記アクセラレータから受け付けると、当該集約結果を集計して前記クエリに対する処理結果として生成することを特徴とするデータベースの処理方法。
【請求項１４】
請求項１３に記載のデータベースの処理方法であって、
前記第２のステップは、
前記グルーピング処理で、前記所定の処理単位のデータ列のデータについてハッシュ値とグループ情報を算出し、前記スタッキング処理で、前記所定の処理単位のデータ列のデータについて数値を算出し、前記集約処理で、前記グループ情報毎に前記数値情報を集約した数値情報を算出し、前記集約結果に前記グループ情報と、数値情報を含み、
前記第３のステップは、
前記グループ情報からハッシュ値を算出してグループハッシュ情報に格納し、当該ハッシュ値に基づいて前記処理対象のデータベースの範囲についての集約結果を並び替えてから前記数値情報を集計して、前記クエリに対する処理結果を生成することを特徴とするデータベースの処理方法。
【請求項１５】
請求項１４に記載のデータベースの処理方法であって、
前記第２のステップは、
前記グルーピング処理で、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知すると、前記グループ情報と、前記スタッキング処理の結果である数値を出力し、
前記第３のステップは、
前記グループハッシュ情報を参照して、前記ハッシュ値が衝突した前記グループ情報と前記スタッキング処理の数値を再度集約して、前記クエリに対する処理結果を再計算することを特徴とするデータベースの処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ記憶部およびデータベース集約処理部を有するストレージ装置を利用したデータ処理方法、計算機システム及びストレージシステムに関する。
【背景技術】
【０００２】
データベース検索処理を代表とするデータ処理システムでは、データ処理の高速化を目的として、データ処理サーバで行っていた処理の一部分を大容量記憶媒体（ストレージ）の近傍に配置したハードウェアアクセラレータへオフロードする構成が提案されている（例えば、特許文献１）。【０００３】
従来のデータ処理サーバで行っていたフィルタリング処理や、プロジェクション処理、グルーピング処理、あるいは集約演算処理を、上記ハードウェアアクセラレータへオフロードすることで、データ処理サーバの負荷を軽減し、検索時間などの処理時間を大幅に短縮する技術が知られている（非特許文献１）。【０００４】
さらに、データ処理サーバでは、ジョイン処理や、マージソート処理もハードウェアアクセラレータにオフロードすることが検討されている（特許文献２）。データベースの処理を高速化する技術としては、機能レベルでのパイプライン化や、機能の並列化を行うことが知られている（特許文献１、２）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平５−１２８１６４号公報
【特許文献２】米国特許出願公開第２０１２/００４７１２６号明細書
【非特許文献】
【０００６】
【非特許文献１】Louis Woods, Zsolt Isvan, Gustavo Alonso:”Ibex-An Intelligent Storage Engine with  support for advanced SQL Off-loading”, Proc. VLDB Endowment (PVLDB), 2014
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記非特許文献１では、データベースの処理単位が“行”であり、処理単位が小さくデータベースの処理性能を向上させることが困難であった。さらに、非特許文献１においては、データベースを格納したＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）からハードウェアアクセラレータに直接データを入力している為、データベースの処理性能が、ＳＳＤの読み出し性能により処理の制約を受けてしまい、ハードウェアアクセラレータへのデータ供給の速度がボトルネックになるという課題があった。【０００８】
他方、上述のグルーピング処理では、ハッシュ演算を用いる例が知られている。ハッシュ演算を用いてグルーピングをした際には、異なるグループが同じハッシュ値を持ち、ハッシュ値の衝突（シノニム）が発生することがある。【０００９】
シノニムが発生した場合、ハードウェアアクセラレータでハッシュ値の再計算を行うと次の行（データ）の計算が待たされるため、ハードウェアアクセラレータの処理性能が低下する、という問題があった。【００１０】
そこで、本発明は上記問題点に鑑みてなされたもので、サーバと連携してデータベースの集約演算の性能を向上させるハードウェアを提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明は、プロセッサと、メモリと、を含むサーバと、前記サーバに接続されてデータベース処理を行うアクセラレータと、前記アクセラレータに接続されてデータベースを格納するストレージ装置と、を有する計算機システムであって、前記サーバは、クエリを受け付けてデータベースコマンドを生成し、処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを決定して、前記アクセラレータに指令するサーバコマンド処理部と、前記アクセラレータの出力を集計して前記クエリに対する処理結果を生成する再集約部と、を有し、前記アクセラレータは、前記サーバコマンド処理部からの指令に基づいて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力するデータベース処理部を有し、前記再集約部は、前記処理対象のデータベースの範囲についての集約結果を前記アクセラレータから受け付けると、当該集約結果を集計して前記クエリに対する処理結果として生成する。
【発明の効果】
【００１２】
本発明によれば、サーバとアクセラレータが協調してデータベース処理を実行することにより、サーバの負荷軽減とアクセラレータのデータベース処理性能を向上させることができる。また、アクセラレータは、データベースコマンド単位で集約処理を実行し、サーバは、複数のデータベースコマンドに対する集約結果の再集約処理を行うことで、データベース処理システムの処理性能を向上することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の第１の実施例を示し、データベース処理システムの構成の一例を示すブロック図である。
【図２】本発明の第１の実施例を示し、ＦＰＧＡの構成の一例を示すブロック図である。
【図３】本発明の第１の実施例を示し、データベースに対するクエリと処理内容の一例を示す図である。
【図４】本発明の第１の実施例を示し、データベースに対するデータベースコマンドの一例を示す図である。
【図５】本発明の第１の実施例を示し、ＤＢサーバのコマンド発行とＦＰＧＡのコマンド処理の一例を示す図である。
【図６】本発明の第１の実施例を示し、データベースのページフォーマットの一例を示す図である。
【図７】本発明の第１の実施例を示し、ＦＰＧＡのデータベース処理部の構成の一例を示すブロック図である。
【図８】本発明の第１の実施例を示し、ＦＰＧＡで行われるパイプライン処理の一例を示すタイミングチャートである。
【図９】本発明の第１の実施例を示し、ＦＰＧＡの各処理における出力データ量の一例を示す図である。
【図１０】本発明の第１の実施例を示し、ＦＰＧＡの処理とサーバの処理の一例を示す図である。
【図１１】本発明の第１の実施例を示し、グルーピング列のグルーピングの手法の一例を示す図である。
【図１２】本発明の第１の実施例を示し、グルーピング処理の一例を示すフローチャートである。
【図１３】本発明の第１の実施例を示し、スタッキング演算による固定小数点データの格納方法の一例を示す図である。
【図１４】本発明の第１の実施例を示し、スタッキング演算用レジスタの一例を示すブロック図である。
【図１５】本発明の第１の実施例を示し、スタッキング処理の一例を示すフローチャートである。
【図１６Ａ】本発明の第１の実施例を示し、スタッキング演算の一例を示す図である。
【図１６Ｂ】本発明の第１の実施例を示し、スタッキング演算で使用されるコマンドの一例を示す図である。
【図１７】本発明の第１の実施例を示し、集約結果の一例を示す図である。
【図１８】本発明の第１の実施例を示し、集約処理の一例を示すタイミングチャートである。
【図１９】本発明の第１の実施例を示し、シノニムのフォーマットの一例を示す図である。
【図２０】本発明の第１の実施例を示し、データベースサーバで行われる処理の一例を示すフローチャートである。
【図２１】本発明の第１の実施例を示し、ＤＢサーバによる再集約処理の一例を示す図である。
【図２２】本発明の第１の実施例を示し、ハッシュテーブルの一例を示す図である。
【図２３】本発明の第１の実施例を示し、グルーピング列テーブルの一例を示す図である。
【図２４】本発明の第１の実施例を示し、グループハッシュテーブルの一例を示す図である。
【図２５】本発明の第２の実施例を示し、シノニム多発時のデータサイズを縮小する例を示す図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施形態について添付図面を用いて説明する。
【実施例１】
【００１５】
図１は、本発明に係るデータベース処理機能を有するＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍａｂｌｅ  Ｇｒｉｄ  Ａｒｒａｙ）２及びデータベース（以下ＤＢ）３０を格納するストレージ装置３と、データベース管理システム（ＤａｔａＢａｓｅ  Ｍａｎａａｇｅｍｅｎｔ  Ｓｙｓｔｅｍ、以下ＤＢＭＳとする）２０が稼働するデータベースサーバ（以下、ＤＢサーバ）１と、を含むデータベースシステムの一例を示すブロック図である。【００１６】
ＤＢサーバ１は、演算を実行するホストＣＰＵ１１と、プログラムやデータを格納するホストメモリ１２と、ＰＣＩスイッチ４を介してハードウェアアクセラレータとしてのＦＰＧＡ２及びストレージ装置３に接続されるホストインターフェース１３と、を含む。また、ホストインターフェース１３は、ＰＣＩあるいはＰＣＩｅｘｐｒｅｓｓに準拠したインターフェースである。【００１７】
ＤＢサーバ１では、ホストメモリ１２にロードされたＤＢＭＳ２０がホストＣＰＵ１１によって実行され、図示しないクライアント計算機からのアクセス要求（クエリ）に応じて、ＦＰＧＡ２にデータベースコマンドを発行する。【００１８】
ストレージ装置３に搭載されたＦＰＧＡ２は、ＳＲＡＭ２００に加えてＣＰＵ１２６を含み、データベースコマンドに基づいてデータベース処理（フィルタ処理、グルーピング処理、プロジェクション処理、集約処理等）を実行するデータベース処理部２５０を有するハードウェアアクセラレータとして機能する。なお、ＦＰＧＡ２とストレージ装置３が独立して構成されて、それぞれがＰＣＩスイッチ４に接続される構成であっても良い。【００１９】
ストレージ装置３は、ＤＢ３０を格納する記憶媒体としてＳＳＤ１３７とＤＲＡＭ１３６とを有し、これらの記憶媒体を制御する制御部１２９は、ＳＳＤインターフェース１３０と、ＤＲＡＭインターフェース１３１の２つが含まれる。【００２０】
ストレージ装置３とＦＰＧＡ２は、ＳＳＤインターフェース１３０及びＤＲＡＭインターフェース１３１で接続される。【００２１】
本実施例１のストレージ装置３では、不揮発性記憶媒体のＳＳＤ１３７にＤＢ３０を格納しておき、制御部１２９は、処理対象のＤＢ３０の範囲についてＳＳＤ１３７からＤＲＡＭ１３６に読み込んでおく。【００２２】
そして、ＦＰＧＡ２は、ＳＳＤ１３７に比して読み出し速度が高速なＤＲＡＭ１３６から所定の処理サイズ（例えば、数メガバイト）ずつデータを読み込むことで、ＳＳＤ１３７の読み出し速度の制限を受けることなく、ＤＲＡＭ１３６からＤＢ３０の処理対象となるデータを高速に読み出すことができる。【００２３】
ただし、本発明では、ＤＢ３０の処理対象の部分のサイズが、ＦＰＧＡ２が演算処理を行う単位よりも大である。すなわち、ＤＢ３０の処理対象の部分を一旦ＤＲＡＭ１３６へ読み込んだ後、ＤＲＡＭ１３６から所定のサイズずつＦＰＧＡ２へデータを入力する。【００２４】
＜ＤＢＭＳ＞
次に、ＤＢＭＳ２０について説明する。ＤＢサーバ１で稼働するＤＢＭＳ２０には、結果格納領域１１５と、メッセージ格納領域１１６と、シノニム格納領域１１７と、再集約モジュール１１８と、グルーピング及び集約モジュール１２０と、コマンド生成部１０３と、コマンド格納部１２３と、要求コマンドキュー１２１と、完了コマンドキュー１２２とを含む。グルーピング及び集約モジュール１２０には、ＦＰＧＡ２の集約処理でシノニムが発生したＤＢ３０のグルーピングを再度行うための、グルーピングと集約のモジュールを有する。【００２５】
ＤＢＭＳ２０は、数ＴＢまたは数ＧＢのＤＢ３０を数ＭＢ毎に分割して、ＦＰＧＡ２にＤＢ３０の集約処理を指令する。このため、ＤＢサーバ１は、ＤＢ３０のうち集約処理の対象となるデータの範囲と、集約処理の内容からデータベースコマンドを生成する。【００２６】
ＤＢＭＳ２０は、クライアント計算機から受信したアクセス要求からコマンド生成部１０３でデータベースコマンドを生成して、コマンド格納部１２３に格納する。また、コマンド生成部１０３はコマンド格納部１２３に格納したデータベースコマンドの格納位置を示すコマンドポインタを要求コマンドキュー１２１に設定する。ＤＢＭＳ２０は、要求コマンドキュー１２１に入力されたコマンドポインタに対応するデータベースコマンドを順次ＦＰＧＡ２へ投入する。これらのコマンド生成部１０３、コマンド格納部１２３、要求コマンドキュー１２１がサーバコマンド処理モジュール１０３０を構成する。【００２７】
ＤＢＭＳ２０は、ＦＰＧＡ２から受信したデータベースコマンドの集約結果を受け付けて、結果格納領域１１５に格納する。ＤＢＭＳ２０は、ＦＰＧＡ２が実行したデータベースコマンドで集約したグループの数と、シノニムが発生した数と、演算オーバーフローの情報等をメッセージとして受け付けて、メッセージ格納領域１１６に格納する。ＤＢＭＳ２０は、ＦＰＧＡ２のデータベースコマンドの実行でシノニムが発生した情報（シノニム１１４）を受け付けた場合には、シノニム格納領域１１７に格納する。また、ＤＢＭＳ２０は、ＦＰＧＡ２から実行完了の通知を受信したデータベースコマンドを、完了コマンドキュー１２２へ格納する。【００２８】
＜ＦＰＧＡ＞
図２は、ＦＰＧＡ２の構成の一例を示すブロック図である。ＦＰＧＡ２は、データベースコマンドに基づいてデータベース処理を制御するＣＰＵ１２６と、データベース処理を行うハードウェアの機能ブロックを有する。【００２９】
ＦＰＧＡ２のデータベース処理部２５０を構成する機能ブロックは、ＤＢ３０のうち処理対象データをＤＲＡＭ１３６から読み込むデータ読み込み部（以下、ＤＡＴＡ  Ｉ／Ｆ）１０５と、処理対象データについてフィルタ処理を実施するフィルタ処理部（以下、Ｆｉｌｔｅｒ）１０６−０、１０６−１と、処理対象データについてフィルタ処理を実施するフィルタ処理部（以下、Ｆｉｌｔｅｒ）１０６−０、１０６−１と、処理対象データについて射影処理を実施するプロジェクション処理部（以下、Ｐｒｏｊｅｃｔｉｏｎ）１０７−０、１０７−１と、フィルタ処理と射影処理の結果についてデータのグルーピング（グループ化）を行うグルーピング処理部（以下、Ｇｒｏｕｐｉｎｇ）１０８−０、１０８−１と、フィルタ処理と射影処理の結果について演算を行うスタック処理部（以下、Ｓｔａｃｋｉｎｇ）１０９−０、１０９−１と、グループ化及び演算の結果を集約する集約処理部（以下、Ａｇｇｒｅｇａｔｉｏｎ）１１１、とを含む。【００３０】
ＦＰＧＡ２のＣＰＵ１２６は、コマンドキュー１２４からコマンドポインタを取得し、ＤＭＡ（図示省略）を起動してＤＢサーバ１のコマンド格納部１２３からコマンドレジスタ１０４へデータベースコマンドを転送する。【００３１】
次に、ＦＰＧＡ２のＣＰＵ１２６は、ＳＳＤ１３７からＤＲＡＭ１３６にデータベースコマンドで指定されたＤＢ３０の処理対象部分のデータを転送する。ＤＢ３０の処理単位であるページデータがＤＲＡＭ１３６に格納されると、ＣＰＵ１２６はレジスタ１０４に集約処理開始の信号を書き込む。【００３２】
次に、ＣＰＵ１２６は、ＤＲＡＭインターフェース１３１からＤＡＴＡインターフェース１０５にＤＲＡＭ１３６のデータ転送を開始する。ＤＲＡＭインターフェース１３１は、データインターフェース１０５の、４ブロックに分割されたＳＲＡＭ  Ｄ０〜Ｄ３（２０１〜２０４）に、ＤＢ３０のページデータをそれぞれ格納する。なお、ＳＲＡＭ  Ｄ０〜Ｄ３（２０１〜２０４）は、図１に示したＦＰＧＡ２のＳＲＡＭ２００の所定の領域を割り当てたものである。なお、以下で説明する他のＳＲＡＭ  Ｐ０、Ｐ１、Ｇ０についてもＳＲＡＭ２００の所定の領域を割り当てたものである。【００３３】
ＤＡＴＡインターフェース１０５に格納されたＤＢ３０のページデータは、フィルタ処理とプロジェクション処理を行うパイプライン処理へページ単位で投入される。このページ単位のパイプライン処理は、Ｆｉｌｔｅｒ＃０（１０６−０）とＰｒｏｊｅｃｔｉｏｎ＃０（１０７−０）のパイプラインと、Ｆｉｌｔｅｒ＃１（１０６−１）と、Ｐｒｏｊｅｃｔｉｏｎ＃１（１０７−１）の２段のパイプラインで構成した例を示す。なお、Ｆｉｌｔｅｒ＃０（１０６−０）と、Ｆｉｌｔｅｒ＃１（１０６−１）の総称はＦｉｌｔｅｒ１０６として示す。他の構成要素も同様である。【００３４】
ページ単位のパイプライン処理の結果は、グルーピング処理とスタッキング処理の並列処理へ投入される。この並列処理は、Ｐｒｏｊｅｃｔｉｏｎ＃０（１０７−０）が出力する行データをＧｒｏｕｐｉｎｇ＃０（１０８−０）とＳｔａｃｋｉｎｇ＃０（１０９−０）で並列処理し、Ｐｒｏｊｅｃｔｉｏｎ＃１（１０７−１）が出力する行データをＧｒｏｕｐｉｎｇ＃１（１０８−１）とＳｔａｃｋｉｎｇ＃１（１０９−１）で並列処理する。【００３５】
Ａｒｂｉｔｅｒ１１０は、Ｇｒｏｕｐｉｎｇ＃０（１０８−０）とＳｔａｃｋｉｎｇ＃０（１０９−０）の結果と、Ｇｒｏｕｐｉｎｇ＃１（１０８−１）とＳｔａｃｋｉｎｇ＃１（１０９−１）の結果と、を順次受け付けて、Ａｇｇｒｅｇａｔｉｏｎ（１１１）に入力する。【００３６】
Ａｇｇｒｅｇａｔｉｏｎ１１１は、グルーピング処理とスタッキング処理の並列処理の結果を入力としてデータベースコマンドで設定された集約処理を実行し、集約結果１１２と、メッセージ１１３と、シノニム１１４と、完了コマンド（１コマンド処理完了通知）１３８とを出力する。これら、集約結果１１２と、メッセージ１１３と、シノニム１１４及び完了コマンド１３８の出力は、ＰＣＩスイッチ４を介してＤＢサーバ１に送信される。【００３７】
ＤＢサーバ１のＤＢＭＳ２０は、後述するように、完了コマンドキュー１２２に格納された完了コマンド１３８と、結果格納領域１１５の集約結果と、シノニム格納領域１１７を用いて、再集約モジュール１１８による再集約と、シノニムが発生したデータについてグルーピング及び集約モジュール１２０によるグルーピングと集約処理を行う。ＤＢサーバ１は、この処理を複数回（データベースサイズ／一度のコマンドでＦＰＧＡ２が処理するデータサイズ＝ページ単位）まで繰り返して、全てのＤＢ３０を処理する。【００３８】
なお、グルーピング及び集約モジュール１２０は、シノニム格納領域１１７にシノニムの情報が書き込まれたときに処理を実行し、グルーピング及び集約処理を行ったデータを再集約モジュール１１８へ出力する。【００３９】
再集約モジュール１１８は、結果格納領域１１５の集約結果とグルーピング及び集約モジュール１２０の出力に基づいて、グルーピング化列毎に集約結果を集計してクエリの結果を応答する。なお、グルーピング化列は、後述するように、処理対象データの複数の列を行方向で結合し、ハッシュ値の演算対象となるデータである。【００４０】
図３は、ＤＢ３０に対するクエリと処理内容の一例を示す図である。図３の例では、ＤＢサーバ１が受信するクエリの一例としてとしてＤＢ３０のベンチマークＴＰＣ―Ｈ  Ｑｕｅｒｙ３を示している。【００４１】
図３のＱｕｅｒｙに出現するｓｅｌｅｃｔ文がＰｒｏｊｅｃｔｉｏｎ処理３０１であり、Ｑｕｅｒｙにより取り出すデータ列を記している。図２のＦＰＧＡ２において、Ｐｒｏｊｅｃｔｉｏｎ（プロジェクション処理部）＃０（１０７−０）及びＰｒｏｊｅｃｔｉｏｎ＃１（１０７−１）がＰｒｏｊｅｃｔｉｏｎ処理３０１を行う。【００４２】
図３のＱｕｅｒｙに出現するＷｈｅｒｅ文がＦｉｌｔｅｒｉｎｇ処理３０２であり、Ｗｈｅｒｅ文の条件に一致した行を抽出する。図２のＦＰＧＡ２において、Ｆｉｌｔｅｒ（フィルタ処理部）＃０（１０６−０）及びＦｉｌｔｅｒ＃１（１０６−１）がＦｉｌｔｅｒｉｎｇ処理３０２を行う。【００４３】
図３のＱｕｅｒｙに出現するＧｒｏｕｐ  ｂｙ文がＧｒｏｕｐｉｎｇ処理３０３であり、Ｇｒｏｕｐｉｎｇで指定した列によりグルーピングを行う。図２のＦＰＧＡ２において、Ｇｒｏｕｐｉｎｇ（グルーピング処理部）＃０（１０８−０）及びＧｒｏｕｐｉｎｇ＃１（１０８−１）がＧｒｏｕｐｉｎｇ処理３０３を行う。【００４４】
図３のＱｕｅｒｙに出現するＳｕｍ文がＡｇｇｒｅｇａｔｉｏｎ処理３０５であり、集約演算を行う。図２のＦＰＧＡ２において、Ａｇｇｒｅｇａｔｉｏｎ１１１が行う集約演算処理３０５には、合計、最大値、最小値、カウント等が含まれる。【００４５】
図３のＱｕｅｒｙに出現するＳｕｍの（）内がＳｔａｃｋｉｎｇ処理３０６であり、列に対する数値演算を行う。図２のＦＰＧＡ２において、Ｓｔａｃｋｉｎｇ（スタッキング処理部）＃０（１０９−０）及びＳｔａｃｋｉｎｇ＃１（１０９−１）がＳｔａｃｋｉｎｇ処理３０６を行う。Ｓｔａｃｋｉｎｇ＃０（１０９−０）、Ｓｔａｃｋｉｎｇ＃１（１０９−１）が行う数値演算には、加算、減算、乗算が含まれる。尚、行の並べ替えを行うＯｒｄｅｒ  ｂｙがｏｒｄｅｒｉｎｇ処理３０４であり、この処理はＤＢサーバ１で実行するものとする。【００４６】
図４は、ＦＰＧＡ２に対するデータベースコマンドの一例を示す図である。ＤＢ３０の格納先のＳＳＤ１３７の情報としては、読み出し開始アドレス４０１と、読み出すデータサイズ４０２、とが含まれる。また、図示はしないが、ひとつのコマンドでＦＰＧＡ２が処理するＤＢ３０のサイズ（単位サイズ：８ＭＢ）を指定しても良い。【００４７】
Ｆｉｌｔｅｒｉｎｇ１０６の設定情報としては、ＤＢ３０におけるフィルタ対象列４０３と、フィルタ条件４０４とが含まれる。Ｐｒｏｊｅｃｔｉｏｎ１０７の設定情報としては、取り出し列４０５が含まれる。Ｇｒｏｕｐｉｎｇ１０８の設定情報としては、グルーピング化列４０６が含まれる。【００４８】
Ｓｔａｃｋｉｎｇ１０９の設定情報としては、演算対象列４０７と、演算子４０８と、直値４０９とが含まれる。Ａｇｇｒｅｇａｔｉｏｎ（集約処理部）１１１の設定情報としては、演算子４１０を含むが含まれる。【００４９】
図５は、サーバコマンド処理モジュール１０３０の処理と、ＦＰＧＡ２の集約処理（ＤＡＴＡ  Ｉ／Ｆ（１０５）〜Ａｇｇｒｅｇａｔｉｏｎ１１１）の関係を示すタイムチャートである。【００５０】
サーバコマンド処理モジュール１０３０は、ＤＢサーバ１が受信したクエリから、ＦＰＧＡ２が処理する複数（または１以上）のデータベースコマンド（５０１〜５０４）を生成し、データベースコマンドをコマンド格納部１２３に格納する。サーバコマンド処理モジュール１０３０は、データベースコマンドの格納が完了すると、要求コマンドキュー１２１にコマンドを格納した領域のポインタを書込み、ＦＰＧＡ２のＣＰＵ１２６に対してドアベルレジスタ（図示省略）を介してデータベースコマンドをスタックしたことを通知（図中の時刻５０５〜５０８）する。【００５１】
ＣＰＵ１２６は、図示しないＤＭＡを起動して、要求コマンドキュー１２１のポインタが指し示すコマンド格納部１２３のデータベースコマンドを、ＤＢサーバ１からレジスタ１０４に転送する。【００５２】
ＦＰＧＡ２では、上記データベースコマンドの取得と並行して、ＣＰＵ１２６がＳＳＤ１３７からＤＲＡＭ１３６にＤＢ３０の処理対象データを転送する。ＣＰＵ１２６は、ＤＢ３０処理単位のページデータがＤＲＡＭ１３６に格納されると、レジスタ１０４に集約処理開始の信号を書き込み、ＤＲＡＭ１３６からＤＡＴＡ  Ｉ／Ｆ１０５にデータ転送を開始し、４面あるＳＲＡＭ０〜３にＤＢ３０のページ単位でデータ（ページデータ）を格納する。【００５３】
ＤＡＴＡ  Ｉ／Ｆ１０５に書き込まれた複数のページデータは、順次Ｆｉｌｔｅｒ１０６に投入され、Ｐｒｏｊｅｃｔｉｏｎ１０７、Ｇｒｏｕｐｉｎｇ１０８、Ｓｔａｃｋｉｎｇ１０９、Ａｇｇｒｅｇａｔｉｏｎ１１１の各処理部で演算が行われる。【００５４】
ＦＰＧＡ２の各演算が完了すると、ＣＰＵ１２６は、ＤＢサーバ１に対して完了コマンド１３８を発行して、１コマンド処理の完了を通知（図中５１２、５１３、５１４）する。そして、１コマンド処理の完了通知を受信したＤＢサーバ１は、当該完了通知が指し示すデータベースコマンドを完了コマンドキュー１２２に登録する。【００５５】
ＤＢサーバ１の再集約モジュールは、１コマンド単位の完了通知（５１２、５１３、５１４）を受け取り、結果格納領域１１５のグルーピング化列を用いて、グループハッシュテーブル１１９を生成し、グルーピング処理と再集約処理を後述するように行う。【００５６】
図６は、ＤＢ３０のページフォーマットの一例を示す。ＤＢ３０はページ単位で構成され、ページデータの先頭にページヘッダ６０１が格納される。ページヘッダ６０１に続いて行データ６０２が１行目〜Ｍ行目まで順に格納されており、ページデータの終端から順番に行の先頭アドレスを指し示す行ポインタ６０３が格納される。【００５７】
ＦＰＧＡ２のＦｉｌｔｅｒ１０６と、Ｐｒｏｊｅｃｔｉｏｎ１０７は、行ポインタ６０３と図４に示したデータベースコマンドの設定情報（４０３、４０５）を用いて、必要な列データを取得する。【００５８】
図７は、ＦＰＧＡ２のデータベース処理部２５０の回路構成の詳細な例を示すブロック図である。ＤＲＡＭ１３６から読み出されたＤＢ３０のページデータは、ＤＡＴＡ  Ｉ／Ｆ１０５を介して、ＳＲＡＭ２０１〜２０４（ＳＲＡＭ  Ｄ０〜Ｄ３）にページ単位で格納される。【００５９】
ＳＲＡＭ２０１は一組のＳＲＡＭで構成されて、同一のデータを２つのＳＲＡＭ（例えばＤ１＿０、Ｄ１−１）で保持し、並列処理を行うＦｉｌｔｅｒ１０６と、Ｐｒｏｊｅｃｔｉｏｎ１０７にそれぞれ同一のデータを供給する。他の、ＳＲＡＭ２０２〜２０４も同様である。【００６０】
ＳＲＡＭ２０１〜２０４からＦｉｌｔｅｒ１０６とＰｒｏｊｅｃｔｉｏｎ１０７に供給されるデータは、セレクタ７０７、７０８、７０９、７１０によって選択される。Ｆｉｌｔｅｒ１０６の処理結果は、Ｐｒｏｊｅｃｔｉｏｎ１０７へ入力される。ここで、Ｆｉｌｔｅｒ１０６は、レジスタ１０４に設定されたデータベースコマンド（図４）のうちフィルタ対象列４０３とフィルタ条件４０４のフィルタ情報に基づいて処理を実行する。同様に、Ｐｒｏｊｅｃｔｉｏｎ１０７では、レジスタ１０４に設定されたプロジェクション情報に基づいて処理を実行する。【００６１】
Ｐｒｏｊｅｃｔｉｏｎ１０７により処理された結果は、ＤＢ３０の１ページ単位で、ＳＲＡＭ  Ｐ０（２０５）と、ＳＲＡＭ  Ｐ１（２０６）に格納される。ＳＲＡＭ  Ｐ０（２０５）、ＳＲＡＭ  Ｐ１（２０６）のＰｒｏｊｅｃｔｉｏｎ結果を用いて、Ｇｒｏｕｐｉｎｇ１０８−０、１０８−１と、Ｓｔａｃｋｉｎｇ１０９−０、１０９−１がそれぞれ並列処理を実行する。【００６２】
Ｇｒｏｕｐｉｎｇ１０８−０、１０８−１では、データベースコマンドのグルーピング化列４０６と、ハッシュテーブル７２８＿０、７２８＿１と、グルーピング列テーブル７２９＿０、７２９＿１を用いて演算が行われる。ハッシュテーブル７２８には、グルーピング対象のデータのハッシュ値が格納される。グルーピング列テーブル７２９には、グループ化された列データが格納される。これらのハッシュテーブル７２８及びグルーピング列テーブル７２９は、ＦＰＧＡ２のＳＲＡＭ２００内の所定の領域に設定される。【００６３】
Ｓｔａｃｋｉｎｇ１０９−０、１０９−１では、データベースコマンドの演算対象列４０７、演算子４０８、直値４０９に基づいて演算が行われる。【００６４】
これらのＧｒｏｕｐｉｎｇ１０８とＳｔａｃｋｉｎｇ１０９の出力は、Ａｒｂｉｔｅｒ１１０により順次受け付けられ、ＳＲＡＭ  Ｇ０（２０７）に書き込まれる。ＳＲＡＭ  Ｇ０（２０７）の内容は、Ａｇｇｒｅｇａｔｉｏｎ１１１の集約演算の結果によって書き換えられる。【００６５】
Ａｇｇｒｅｇａｔｉｏｎ１１１は、１コマンドのデータ処理が完了すると、集約結果１１２と、メッセージ１１３と、シノニム１１４とをＤＢサーバ１に出力する。メッセージ１１３には、集約したグループの数と、シノニムが発生した数と、演算オーバーフローの情報が格納されている。【００６６】
図８は、ＦＰＧＡ２で行われるパイプライン処理のタイミングチャートを示している。時刻Ｔ０（８０１）においては、ＤＡＴＡ  Ｉ／Ｆ１０５がＳＲＡＭ  Ｄ０にページ１（図中Ｐ−１）のデータを書き込む。【００６７】
時刻Ｔ１（８０２）において、ＤＡＴＡ  Ｉ／Ｆ１０５がＳＲＡＭ  Ｄ１にページ２（Ｐ−２）のデータを書き込み、Ｆｉｌｔｅｒ１０６−０、１０６−１がＳＲＡＭ  Ｄ０のデータを用いてＦｉｌｔｅｒｉｎｇ処理を行う。【００６８】
時刻Ｔ２（８０３）においては、ＤＡＴＡ  Ｉ／Ｆ１０５がＳＲＡＭ  Ｄ２にページ３（Ｐ−３）のデータを書き込み、Ｆｉｌｔｅｒ１０６−０、１０６−１がＳＲＡＭ  Ｄ１のデータ（Ｐ−２）を用いてＦｉｌｔｅｒｉｎｇ処理を行い、Ｐｒｏｊｅｃｔｉｏｎ１０７−０、１０７−１がＳＲＡＭ  Ｄ０（Ｐ−１）のデータを用いてＰｒｏｊｅｃｉｔｏｎ処理を行う。Ｆｉｌｔｅｒｉｎｇ処理とＰｒｏｊｅｃｉｔｏｎ処理は、ページデータの行単位で実行される。【００６９】
また、プロジェクション処理の１行目のデータがＳＲＡＭ  Ｐ０に書き込まれる時刻Ｔ２１においては、Ｇｒｏｕｐｉｎｇ１０８−０、１０８−１と、Ｓｔａｃｋｉｎｇ１０９−０、１０９−１が開始される。これにより、Ｐｒｏｊｅｃｔｉｏｎ処理と並行して、ＳＲＡＭ  Ｐ０に書き込まれたプロジェクション処理の結果に基づいてＧｒｏｕｐｉｎｇ処理とＳｔａｃｋｉｎｇ処理が並列して実行される。なお、他のＧｒｏｕｐｉｎｇ処理とＳｔａｃｋｉｎｇ処理も、ＳＲＡＭ  Ｐ０、Ｐ１に１行のデータが書き込まれるまで待機する。【００７０】
ＳＲＡＭ  Ｐ０、Ｐ１にデータが書き込まれると、Ａｇｇｒｅｇａｔｉｏｎ１１１がＡｇｇｒｅｇａｔｉｏｎ処理を行い、ＳＲＡＭ  Ｇ０に集約処理の結果を書き込む。【００７１】
時刻Ｔ３（８０４）においては、ＤＡＴＡ  Ｉ／Ｆ１０５がＳＲＡＭ  Ｄ３にページ４（Ｐ−４）のデータを書き込み、Ｆｉｌｔｅｒ（１０６−０、１０６−１）がＳＲＡＭ  Ｄ２のデータ（Ｐ−３）を用いてＦｉｌｔｅｒｉｎｇ処理を行う。また、Ｐｒｏｊｅｃｔｉｏｎ１０７−０、１０７−１がＳＲＡＭ  Ｄ１のデータ（Ｐ−２）を用いてＰｒｏｊｅｃｉｔｏｎ処理を行う。【００７２】
Ｇｒｏｕｐｉｎｇ１０８−０、１０８−１と、Ｓｔａｃｋｉｎｇ１０９−０、１０９−１は、Ｐｒｏｊｅｃｔｉｏｎ処理と並行して、グルーピング処理とスタッキング処理を実行する。そして、グルーピング処理の結果と、スタッキング処理の結果に基づいてＡｇｇｒｅｇａｔｉｏｎ１１１が集約処理を行い、ＳＲＡＭ  Ｇ０に集約結果を書き込む。以上のようなタイミングで、ＦＰＧＡ２ではパイプライン処理が実行される。【００７３】
図９は、コマンド単位で、各処理における出力データ量の変化を示す図である。一回のデータベースコマンドで処理するＤＢ３０の処理対象データを図中符号９０１で示す。【００７４】
このＤＢ３０の処理対象データ９０１をＦｉｌｔｅｒｉｎｇ処理すると、フィルタ条件に一致した行データが抽出されて、図中２つの行データ９０２が処理結果として出力される。【００７５】
このフィルタリング処理の過程で残る行データ９０２のデータ量は、処理対象データ９０１のデータ量の約１／１０である。行データ９０２を入力としてＰｒｏｊｅｃｔｉｏｎ処理を行い、Ｇｒｏｕｐｉｎｇ処理に必要なＧｒｏｕｐｉｎｇ列９０３と、Ｓｔａｃｋｉｎｇ処理に必要なＳｔａｃｋｉｎｇ列９０４のデータを抽出する。【００７６】
このプロジェクション処理の過程で算出される列データ（９０３、９０４）のデータ量は、Ｆｉｌｔｅｒｉｎｇ処理後の行データ９０２のデータ量の約１／１０である。Ｇｒｏｕｐｉｎｇ列９０３と、Ｓｔａｃｋｉｎｇ９０４のデータを用いて、Ｇｒｏｕｐｉｎｇ処理と、Ｓｔａｃｋｉｎｇ処理を行うとデータ９０５が得られる。この処理過程で残るデータ９０５のデータ量は、Ｐｒｏｊｅｃｔｉｏｎ処理後の列データ（９０３、９０４）のデータ量の約１／１０である。Ｇｒｏｕｐｉｎｇ処理とＳｔａｃｋｉｎｇ処理で得られたデータ９０５をＡｇｇｒｅｇａｔｉｏｎ処理し、最終的な集約結果９０６が得られる。【００７７】
本実施例のＦＰＧＡ２では、入力する処理対象データ９０１に対して、出力する集約結果９０６のデータ量は約１／１０００となる。【００７８】
図１０は、ＦＰＧＡ２で行われる集約演算ローカル処理とＤＢサーバ１で行われる集約演算グローバル処理の関係を示す図である。【００７９】
ＤＢサーバ１は、サーバコマンド処理モジュール１０３により、ＳＳＤ１３７に格納されている２ＴＢサイズのＤＢ３０のデータ１０００のうち、１回のデータベースコマンドで処理する処理対象データのサイズを８ＭＢに決定する。そして、ＤＢサーバ１は、１つのデータベースコマンドでＦＰＧＡ２が８ＭＢの処理対象データ９０１を処理するようにデータベースコマンド内で指定する（１００４）。【００８０】
ＦＰＧＡ２は、１つのデータベースコマンドを受け付けて、８ＭＢに分割したＤＢ３０の処理対象データ９０１を処理する。ＦＰＧＡ２は、８ＭＢの処理対象データ９０１について８ＫＢのページ単位で処理を行う（１００５）。【００８１】
ＦＰＧＡ２は、１つのデータベースコマンドで８ＭＢ分の処理対象データ９０１について、ページ単位（８ＫＢ）でＤＲＡＭ１３６から処理対象データ９０１を読み込んでグルーピング処理とスタッキング処理を実行する。そして、ＦＰＧＡ２はルーピング処理とスタッキング処理の結果に基づいて集約処理を実施する（１００６）。【００８２】
ＦＰＧＡ２は集約処理が完了すると、後述する図２１のように、集約結果のグループの順序が不同な状態で、グルーピング化列と集約結果をＤＢサーバ１に返信する（１００８）。【００８３】
グルーピング化列と集約結果を受け取ったＤＢサーバ１は、再集約モジュール１１８がグルーピング化列に基づいてグループハッシュテーブル１１９を生成し、ハッシュ値の順にデータを並べて、全てのデータベースコマンドに対するグローバル（全ての処理対象データ）の集約処理を実行する。【００８４】
図１１は、グルーピング化列のグルーピングの手法の一例を示す図である。ＦＰＧＡ２のＧｒｏｕｐｉｎｇ１０８−０、１０８−１ではグルーピング処理が行われる。このグルーピング処理では、１行の行データに含まれるグルーピング対象の列をグルーピング化列として連結しグルーピング列テーブル７２９に格納される。【００８５】
図示の例では、１行の行データの、グルーピング化列１、２、３（１１０１）を連結してグルーピング化データ１１０２を生成し、グルーピング列テーブル７２９に格納する。なお、グルーピング化データ１１０２の各行は、ハッシュ値の演算対象であるグルーピング化列のデータである。【００８６】
そして、Ｇｒｏｕｐｉｎｇ１０８ではグルーピング化データ１１０２のグルーピング化列ごとにハッシュ値とグループＩＤを演算して、各グループを識別する。なお、Ｇｒｏｕｐｉｎｇ１０８で演算されたハッシュ値とグループＩＤは、ハッシュテーブル７２８に格納される。【００８７】
図２２は、ＦＰＧＡ２内のハッシュテーブル７２８の一例を示す図である。ハッシュテーブル７２８は、ＳＲＡＭ２００のアドレス２３０１をハッシュ値とし、１ビットのデータ２３０２をフラグビットとし、１０ビットのデータ２３０３をハッシュ値に対応するグループＩＤとする例を示す。【００８８】
ハッシュテーブル７２８には、グルーピング処理の結果が格納され、グループＩＤ（２３０３）が割り当てられたアドレス２３０１のフラグビット（２３０２）には「１」（０ｂ１）が設定される。なお、グループＩＤ（２３０３）は、新たなグループが出現する度に追加される。【００８９】
図２３は、ＦＰＧＡ２内のグルーピング列テーブル７２９の一例を示す図である。グルーピング列テーブル７２９は、ＳＲＡＭ２００のアドレス２４０１（１０ビット）をグループＩＤとし、６４ビットのデータ２４０２をグルーピング化列とする例を示す。グルーピング列テーブル７２９は、グループＩＤ（２４０１）に対応したグルーピング化列（２４０２）が保持される。【００９０】
なお、本実施例１では、２５６Ｋｂｙｔｅのグルーピング化列まで対応可能な例を示し、ＦＰＧＡ２には、例えば、８Ｂｙｔｅ幅のＳＲＡＭを３２個搭載する。ハッシュ値とグループＩＤ（２４０１）の対応関係は、上述のハッシュテーブル７２８で定義される。また、本実施例１では、グループＩＤの最大値は１０２４となり、この最大値がハッシュ値を割り当て可能な数となる。【００９１】
なお、ハッシュ値とグループＩＤの算出については、上記に限定されるものではなく、公知または周知の手法を適用すればよく、処理対象データ９０１のハッシュ値と、データが所属するグループＩＤが決定されれば良い。【００９２】
図１２は、グルーピング処理の一例を示すフローチャートである。この処理は、ＳＲＡＭ  Ｐ０、Ｐ１に行の演算結果が書き込まれたときにＦＰＧＡ２のＧｒｏｕｐｉｎｇ１０８が起動する。【００９３】
Ｇｒｏｕｐｉｎｇ１０８は、グルーピング化列（２４０２）のハッシュ値を算出（１２０１）する。Ｇｒｏｕｐｉｎｇ１０８は、算出されたハッシュ値がハッシュテーブル７２８に登録されているか否かを判定する（１２０２）。【００９４】
Ｇｒｏｕｐｉｎｇ１０８は、算出されたハッシュ値がハッシュテーブル７２８に登録されていなければ、ステップ１２０５へ進む。ステップ１２０５では、Ｇｒｏｕｐｉｎｇ１０８が、算出されたハッシュ値をハッシュテーブル７２８へ登録する。この場合、シノニムは発生していないのでステップ１２０６に進んで、Ａｒｂｉｔｅｒ１１０からＳＲＡＭ  Ｇ０（２０７）に書き込まれる。【００９５】
一方、算出されたハッシュ値が既にハッシュテーブル７２８に登録されている場合は、ステップ１２０３へ進む。ステップ１２０３では、Ｇｒｏｕｐｉｎｇ１０８が、ハッシュテーブル７２８において、同一のハッシュ値となったアドレス２３０１に対応するグルーピング列テーブル７２９のデータ２４０２（グルーピング化列）を取得する。Ｇｒｏｕｐｉｎｇ１０８は算出されたハッシュ値の元のグルーピング化列と、取得したグルーピング化列が異なれば、ステップ１２０４へ進んでシノニム（ハッシュ値の衝突）と判定する。【００９６】
シノニムの場合は、Ａｇｇｒｅｇａｔｉｏｎ１１１での集約処理は行われず、シノニムの情報が後述するようにシノニム１１４としてＤＢサーバ１へ送信される。なお、シノニムの情報としては、ハッシュ値やグルーピング化列を用いることができる。【００９７】
一方、非シノニムの場合は、ＳＲＡＭ  Ｇ０（２０７）に書き込まれたＧｒｏｕｐｉｎｇ１０８の結果と、後述のＳｔａｃｋｉｎｇ１０９の結果に基づいてＡｇｇｒｅｇａｔｉｏｎ１１１で集約処理が行われる。【００９８】
図１３は、スタッキング演算における、固定小数点のデータ格納方法の一例を示す図である。Ｓｔａｃｋｉｎｇ１０９が、固定小数点を容易に演算できるように、ＤＢ３０への格納形式を整数としている。【００９９】
図１３においては、スタッキング演算用の列は２つあり、Ｎ行目の第一列には、０．０８を１００倍して８としたデータ１０３１を格納する。Ｎ行目の第二列には、０．５を１０倍して５としたデータ１３０２を格納する。【０１００】
Ｓｔａｃｋｉｎｇ１０９は、固定小数点を意識することなく、整数として演算を行い、ＤＢサーバ１が、結果格納領域１１５に格納された集約結果の値の桁をもとに戻して最終的な集約結果とする。なお、固定小数点の位置についてはＤＢＭＳ２０で予め設定されたものである。【０１０１】
図１４は、スタッキング演算用レジスタ及びＳＲＡＭの構成を示す図である。この構成は、Ｓｔａｃｋｉｎｇ１０９−０、１０９−１のハードウェア構成を示す。【０１０２】
スタッキング処理部を構成するＳｔａｃｋｉｎｇ１０９は、後述するように、スタッキング演算は、値と演算子を積み上げて、演算子が出現すると直近の２つの値に対する演算を実行する。そこで、値を保持する回路の構成を２つのレジスタＲＥＧ０（１４０１）、ＲＥＧ１（１４０２）と１つのＳＲＡＭ（１４０３）とする。なお、ＳＲＡＭ（１４０３）は、図１に示したＳＲＡＭ２００内の所定の領域を示す。【０１０３】
図１５は、ＦＰＧＡ２のＳｔａｃｋｉｎｇ１０９で実行されるスタッキング演算の一例を示すフローチャートである。【０１０４】
Ｓｔａｃｋｉｎｇ１０９−０、１０９−１は、Ｐｒｏｊｅｃｔｉｏｎ１０７がＳＲＡＭ  Ｐ０、Ｐ１（２０５、２０６）に演算結果を書き込むと処理を開始する（１５０１）。【０１０５】
スタッキング演算を開始（１５０１）すると、Ｓｔａｃｋｉｎｇ１０９はレジスタ１０４からデータベースコマンドからスタック演算コマンドを１つ受け取り（１５０２）、コマンドの内容が数値か演算子であるかを判定する（１５０３）。【０１０６】
ステップ１５０３の判定において、コマンドの内容がＰｒｏｊｅｃｔｉｏｎ１０７の出力、もしくは、直値であれば、数値の格納先を判定するステップ１５０４に進む。ステップ１５０４において、Ｓｔａｃｋｉｎｇ１０９は、図１４のスタックレジスタ１４０１、１４０２にデータが格納済みであれば、ＳＲＡＭ１４０３にＲＥＧ０（１４０１）のデータを書込、ＲＥＧ１（１４０２）の値をＲＥＧ０（１４０１）に書き込み、ステップ１５０３の入力データをＲＥＧ１（１４０２）に書き込む。【０１０７】
ステップ１５０４の判定において、スタックレジスタ１４０１、１４０２にデータが格納済みでなければ、ステップ１５０９へ進んで、Ｓｔａｃｋｉｎｇ１０９は、ＲＥＧ１（１４０２）のデータをＲＥＧ０（１４０１）に書き込み、ステップ１５０３の入力データをＲＥＧ１（１４０２）に書き込む。【０１０８】
ステップ１５０３の判定において、スタック演算コマンドの内容が演算子であれば、Ｓｔａｃｋｉｎｇ１０９は、ＲＥＧ０（１４０１）、ＲＥＧ１（１４０２）の出力をスタック演算コマンドによって演算し、演算結果をＲＥＧ１（１４０２）に書き戻す。【０１０９】
さらに、ＳＲＡＭ（１４０３）にデータが存在すれば、Ｓｔａｃｋｉｎｇ１０９はＳＲＡＭ（１４０３）からＲＥＧ０（１４０１）にデータを書き込む。データの書き込みが完了すると、Ｓｔａｃｋｉｎｇ１０９は、レジスタ１０４を参照して、次のスタック演算コマンドが存在するか否かの判定を行う（１５０５）。【０１１０】
ステップ１５０５において、スタック演算コマンドの内容が終了コマンドでなければ、Ｓｔａｃｋｉｎｇ１０９は、ステップ１５０２に戻って上記処理を繰り返す。一方、ステップ１５０５において、次のスタック演算コマンドが終了コマンドであれば、Ｓｔａｃｋｉｎｇ１０９はスタッキング演算を終了（１５０６）する。【０１１１】
上記処理によって、プロジェクション処理の結果がＳＲＡＭ２０５、２０６へ書き込まれると、Ｓｔａｃｋｉｎｇ１０９によってスタッキング処理が実行されて、ＳＲＡＭ  Ｇ０（２０７）へ書き込まれる。【０１１２】
図１６Ａは、スタッキング演算の一例を示す図である。また、図１６Ｂは、スタッキング演算で使用されるコマンドの一例を示す図である。図１６Ａは、横軸を時刻としてスタッキング処理部１０９へ入力されるスタック演算コマンド１６０２、１６０５〜１６０８と、レジスタ１４０１、１４０２の状態を示す。スタック演算コマンド１６０５〜１６０８の内容は、図１６Ｂのコード１６１２に対応する。図１６Ｂのスタック演算コマンド１６０１は、ＮＯ１６１０と、Ｓｔａｃｋｉｎｇ１０９で実行するコマンド１６１１と、コード１６１２と、コマンドの意味１６１３から構成される。【０１１３】
図１６Ｂで示すように、各コマンド１６１１には、コード１６１２が定められており、Ｓｔａｃｋｉｎｇ１０９は、コマンド１６１１に対応するコード１６１２を受け取り、スタッキング演算を実行する。【０１１４】
図１６Ａの時刻Ｔ０において、Ｓｔａｃｋｉｎｇ１０９は、コマンドとして、０Ｘ８１（１６０５）のＰｒｏｊｅｃｔｉｏｎ列１の値１を受け取り、スタックレジスタＲＥＧ１（１４０２）にＰｒｏｊｅｃｔｉｏｎ列１の値を格納する。ここで、スタック演算コマンド１６０５のコード１６１２が「０ｘ８１」で、図１６Ｂの意味１６１３は、「スタックにプロジェクタ出力列１番を積み上げる」である。【０１１５】
すなわち、最初のスタック演算コマンドは、Ｐｒｏｊｅｃｔｉｏｎ１０７の出力列１番の値をレジスタＲＥＧ１（１４０２）に格納する。なお、（６４’ｄ１）の「６４’」はデータのビット数が６４ビットで、データがｄ１であることを示す。また、図１６Ｂのスタックは、スタックレジスタＲＥＧ０（１４０１）、スタックレジスタＲＥＧ１（１４０２）を示す。【０１１６】
図１６Ａの時刻Ｔ１において、スタック演算コマンドとして、Ｓｔａｃｋｉｎｇ１０９は、０Ｘ１０（１６０６）の直値０の値を受け取り、スタックレジスタＲＥＧ１（１４０２）の値をＲＥＧ０（１４０１）に書き込み、直値０の値をＲＥＧ１（１４０２）に書き込む。【０１１７】
なお、直値０の値は別途レジスタに設定しており、ここでは「２」とする。時刻Ｔ２において、Ｓｔａｃｋｉｎｇ１０９は、スタック演算コマンドとして、０Ｘ０１（１６０７）の和演算子を受け取り、スタックレジスタ１４０１、１４０２の値を足して、ＲＥＧ１（１４０２）に書き込む。【０１１８】
時刻Ｔ３において、Ｓｔａｃｋｉｎｇ１０９は、コマンドとして０Ｘ７Ｆ（１６０８）のスタック演算終了を受け取り、最終的なスタック演算結果を出力する。【０１１９】
以上のように、Ｓｔａｃｋｉｎｇ１０９は、スタックレジスタ１４０１、１４０２を用いてスタック演算コマンドに応じた演算を実行する。【０１２０】
図１７は、Ａｇｇｒｅｇａｔｉｏｎ１１１の出力である集約結果１１２の一例を示す図である。集約結果１１２には、グルーピング化列０（１７０１）と、集約結果０（１７０２）と、集約結果１（１７０３）のように、グルーピング化列と、集約結果の順番に格納され、グループを示すグルーピング化列の数だけ同じフォーマットでデータが格納されている。集約結果１１２において、データが存在しない箇所１７０４は所定の領域までゼロの値で埋めている。【０１２１】
図１７の例では、１つのグルーピング化列に対してＦＰＧＡ２が２つの集約結果１７０２、１７０３を出力する例を示したが、これに限定されるものではなく、集約結果の数はＦＰＧＡ２の設定に応じて変更することができる。【０１２２】
図１８は、ＦＰＧＡ２で行われる集約処理の一例を示すタイミングチャートである。ＦＰＧＡ２では、Ｆｉｌｔｅｒ１０６によるフィルタリング処理と，Ｐｒｏｊｅｃｔｉｏｎ１０７によるプロジェクション処理はページ（８ＫＢ）単位で行っている。【０１２３】
時刻Ｔ０からＦＰＧＡでは、フィルタリング処理ＦＬＴ＿０（１８０１）が実行される。フィルタリング処理が完了すると、フィルタリング処理ＦＬＴ＿０（１８０１）の結果を用いて、時刻Ｔ１ではプロジェクション処理ＰＲＪ＿０（１８０２）が開始される。【０１２４】
プロジェクション処理ＰＲＪ＿０の結果を用いて、Ｇｒｏｕｐｉｎｇ１０８とＳｔａｃｋｉｎｇ１０９では、グルーピング処理ＧＲＰ＿０（１８０３）とスタッキング処理ＳＴＫ＿０（１８０４）が並列して実行される。なお、グルーピング処理ＧＲＰ＿０（１８０３）とスタッキング処理ＳＴＫ＿０（１８０４）は、プロジェクション処理ＰＲＪ＿０（１８０２）で行データが出力された時刻Ｔ１Ａから開始される。【０１２５】
グルーピング処理ＧＲＰ＿０（１８０３）でシノニムが発生した場合には、グルーピング処理の結果と共に集約処理へシノニムの情報を通知する。【０１２６】
グルーピング処理ＧＲＰ＿０（１８０３）とスタッキング処理ＳＴＫ＿０（１８０４）が完了するとＡｇｇｒerｇａｔｉｏｎ１１１で集約処理Ａ＿０（１８０５）が実行される。なお、Ａｇｇｒｅｇａｔｉｏｎ１１１は、シノニムの情報がある場合にはシノニム処理Ｓ＿０（１８０６）が行われる。シノニム処理Ｓ＿０（１８０６）では、後述するシノニム１１４へグルーピング化列とスタック列を書き込む処理である。【０１２７】
ＦＰＧＡ２では、処理対象データ９０１の最終ページの処理である、フィルタリング処理ＦＬＴ＿Ｎ（１８０７）と、プロジェクション処理ＰＲＪ＿Ｎ（１８０８）と、グルーピング処理ＧＲＰ＿Ｎ（１８０９）と、スタッキング処理ＳＴＫ＿Ｎ（１８１０）と、集約処理Ａ＿Ｎ（１８１１）と、シノニムＳ＿Ｎ（１８１２）が終了すると、図１７に示した集約結果１１２とシノニム１１４及びメッセージ１１３をＤＢサーバ１に転送する。また、ＦＰＧＡ２は、完了したデータベースコマンドについて実行完了をＤＢサーバ１へ通知する。なお、メッセージ１１３には、ＦＰＧＡ２が実行したデータベースコマンドで集約したグループの数と、シノニムが発生した数と、演算オーバーフローの情報等が含まれる。【０１２８】
ＤＢサーバ１は、ＦＰＧＡ２から受信した集約結果１１２を、結果格納領域１１５に格納し、受信したシノニム１１４をシノニム格納領域１１７に格納し、メッセージ１１３をメッセージ格納領域１１６に格納する。【０１２９】
なお、シノニムが多発した場合などではシノニム１１４のデータが埋まった時点で、ＤＢサーバ１のシノニム格納領域１１７にシノニム１１４を転送してもよい。【０１３０】
＜ＦＰＧＡとサーバの連携処理＞
次に、ＦＰＧＡ２のグルーピング処理でシノニムが発生した場合の集約処理について説明する。図１２において、シノニムと判定（１２０４）され、同じハッシュ値が異なるグルーピング化列に割り当てられた場合には、後述する図１９のように、グルーピング化列とスタック列をＤＢサーバ１に転送し、ＤＢサーバ１がグルーピング及び集約モジュール１２０において、グルーピングと集約演算を行う。【０１３１】
図１９は、Ａｇｇｒｅｇａｔｉｏｎ１１１の出力である、シノニム１１４のフォーマットの一例を示す図である。【０１３２】
グルーピング処理でシノニム結果を格納するシノニム１１４は、グルーピング化列０（２２０１）、スタック列０（２２０２）、スタック列１（２２０３）のように、グルーピング化列、スタック列の順番に格納され、グループ（グルーピング化列）の数だけ同じフォーマットでデータが格納されている。シノニム１１４において、データが存在しない箇所２２０４は所定の領域までゼロで埋められる（２２０４）。【０１３３】
グルーピング化列２２０１には、シノニムが発生したグルーピング化データ１１０２が格納される。スタック列には、当該グループのスタッキング処理の結果が格納される。【０１３４】
図２０は、ＤＢサーバ１で行われる処理の一例を示すフローチャートである。ＤＢサーバ１のＤＢＭＳ２０は、図示しない計算機から受信したクエリに基づいてデータベースコマンドを生成してＦＰＧＡ２に処理を依頼し、ＦＰＧＡ２は所定のページ単位でデータベース処理を行った集約結果をＤＢサーバ１に応答する。ＤＢサーバ１のＤＢＭＳ２０は、ページ単位でグループ化された複数の集約結果を受信し、データベースコマンドで指定した全てのデータについて集約結果を受信すると集計してクエリの送信元の計算機（図示省略）に返信する。【０１３５】
まず、ＤＢＭＳ２０は、他の計算機（図示省略）からＤＢ３０に対するクエリを受け付ける（１９０１）。ＤＢＭＳ２０は、受け付けたクエリに基づいて、図４で示したように、ストレージ装置３のＤＢ３０に対するデータベースコマンドを生成し、ＦＰＧＡ２にデータベースコマンドを発行する（１９０２）。すなわち、ＤＢＭＳ２０は、クエリの処理対象となるＤＢ３０の処理範囲と、当該ＤＢ３０の処理範囲を分割してＦＰＧＡ２がひとつのデータベースコマンドで処理する単位サイズ（例えば、８ＭＢ）を決定して、各データベース処理の内容を決定してＦＰＧＡ２に指令する。【０１３６】
ＤＢＭＳ２０は、データベースコマンドに対する完了コマンドをＦＰＧＡ２から受信したか否かを判定する（１９０３）。受信していなければ完了コマンドの受信を待機する。一方、完了コマンドを受信した場合には、ステップ１９０４へ進んで、データベースコマンドで指定したクエリの処理対象となる範囲の全てのデータについて完了コマンドを受信したか否かを判定する。【０１３７】
ＦＰＧＡ２は、所定のページ単位でデータベース処理の結果を応答するので、ＤＢＭＳ２０は、データベースコマンドに対応する処理対象データが全て処理されるまで待機する。全てのデータについてデータベース処理が完了した場合にはステップ１９０５へ進み、そうでない場合にはステップ１９０３へ戻って完了コマンドを待つ。【０１３８】
ステップ１９０５では、ＤＢＭＳ２０が結果格納領域１１５に格納されたコマンド単位の集約結果を取得する。結果格納領域１１５には図１９で示した集約結果１１２がコマンド単位で格納されている。【０１３９】
ＤＢＭＳ２０は、ステップ１９０５で読み込んだ集約結果からグルーピング化列のハッシュ値を演算してグループハッシュテーブル１１９を生成する。ハッシュ値の生成はＦＰＧＡ２のＧｒｏｕｐｉｎｇ１０８と同様であり、図１７に示した集約結果１１２のグルーピング化列のハッシュ値を算出する。そして、ＤＢＭＳ２０は、グルーピング化列のグループＩＤとハッシュ値を対応付けてグループハッシュテーブル１１９に格納する。なお、ハッシュ値の演算とグループＩＤの決定についてはＦＰＧＡ２のＧｒｏｕｐｉｎｇ１０８と同様の処理を行えば良い。【０１４０】
図２４は、グループハッシュテーブル１１９の一例を示す図である。グループハッシュテーブル１１９は、図２２に示したＦＰＧＡ２のハッシュテーブル７２８と同様の構成である。【０１４１】
グループハッシュテーブル１１９は、ハッシュ値１１９１と、当該ハッシュ値が使用されているか否かを示すフラグ１１９２と、ハッシュ値に対応するグループＩＤ１１９３とからひとつのエントリが構成される。【０１４２】
ハッシュ値１１９１は、ステップ１９０５で読み込んだ集約結果のグルーピング化列１７０１（図１７）から算出したハッシュ値を格納する。フラグ１１９２は、当該エントリのハッシュ値１１９１が使用されていれば“１”が設定され、使用されていなければ“０”が設定される。【０１４３】
次に、図２０のステップ１９０７では、ＤＢＭＳ２０がグループハッシュテーブル１１９のハッシュ値１１９１をソートする。ＤＢＭＳ２０は、ソート後のグループハッシュテーブル１１９のグループＩＤ１１９３に従って、集約結果１１２のグルーピング化列１７０１の順序を並び替えて、各ページの集約結果についてグルーピング化列と集約結果の関係を揃える。【０１４４】
ステップ１９０８では、ＤＢＭＳ２０が上記ステップ１９０７までの処理でグルーピング化列と集約結果の関係を揃えたデータの集約結果を集計する。この処理により、コマンド単位で集約されて、グルーピング化列の順序が不同である集約結果が、クエリで指定されたＤＢ３０の処理対象範囲で集計されてクエリに対する処理結果が生成される。なお、この時点では、クエリに対する処理結果が、シノニム１１４を含まない集計結果である。【０１４５】
次に、ＤＢＭＳ２０は、シノニム格納領域１１７のデータを読み込んで（１９０９）、ＦＰＧＡ２のデータベース処理でシノニムが発生したか否かを判定する（１９１０）。シノニム格納領域１１７にシノニム１１４が書き込まれていた場合には、ステップ１９１１へ進む。一方、シノニム格納領域１１７の情報が書き込まれていない場合には、ステップ１９１３へ進んで、ＤＢＭＳ２０が集計結果をクエリの送信元に応答して処理を終了する。【０１４６】
ステップ１９１１では、ＤＢＭＳ２０がシノニム１１４のデータを再度グルーピング処理を行う。すなわち、ＤＢＭＳ２０は、シノニム格納領域１１７に格納されているシノニム１１４のグルーピング化列（２２０１）を取得してハッシュ値を演算する。ＤＢＭＳ２０は、グループハッシュテーブル１１９のハッシュ値１１９１から演算結果のハッシュ値に一致するエントリを検索する。ＤＢＭＳ２０は、該当するエントリがなければ、当該ハッシュ値を新たなハッシュ値１１９１としてグループハッシュテーブル１１９に追加する。【０１４７】
ステップ１９１２では、ＤＢＭＳ２０がハッシュ値を演算したシノニム１１４のデータに含まれるスタック列（２２０２、２２０３）を、ハッシュ値が一致または追加したグループハッシュテーブル１１９のグループＩＤ１１９３に対応する集計結果に加えて再計算する。そして、ＤＢＭＳ２０は、ステップ１９１３で、シノニム１１４のデータで再計算された集計結果をクエリの送信元に応答して処理を終了する。【０１４８】
以上の処理により、ＦＰＧＡ２で所定の処理単位（ページ単位）で集約されたＤＢ３０の処理結果は、シノニム１１４を加味して集計されてクエリの送信元に送信される。また、上記ステップ１９０５〜１９０８の処理がＤＢＭＳ２０の再集約モジュール１１８の処理に相当し、ステップ１９０９〜１９１２の処理が、グルーピング及び集約モジュール１２０の処理に相当する。【０１４９】
図２１は、ＤＢサーバ１による集約結果１１２の再集約処理の一例を示す図である。この処理は、上記図２０のステップ１９０５〜１９０８の処理に相当する。図示の例では、ＦＰＧＡ２に指令したデータベースコマンドが、コマンド１〜コマンドＮで構成され、Ｎ個の集約結果２１０１−１〜２１０１−ＮがＤＢサーバ１に出力された例を示す。【０１５０】
ＦＰＧＡ２で処理されたコマンド１の集約結果が２１０１−１であり、コマンドＮの集約結果が２１０１−Ｎである。集約結果２１０１−１と２１０１−Ｎではグルーピング化列の出現順が異なる。このため、ＤＢサーバ１の再集約モジュール１１８では、これらの結果を用いてそのまま再集約を行うことが出来ない。【０１５１】
そこで、ＤＢサーバ１は、ＦＰＧＡ２から受信したＮ個のコマンドの集約結果に対して、グループハッシュテーブル１１９を生成し、グルーピングと並べ替えを行い、新たな集約結果２１０２−１〜２１０２−Ｎを演算する。【０１５２】
集約結果２１０２−１と２１０２−Ｎにおいては、グルーピング化列の出現順が同一であり、ＤＢサーバ１は、各コマンドの集約結果の合計や最大値を行方向で演算することが可能である。ＤＢサーバ１の再集約モジュール１１８は、集約結果２１０２−１、２１０２−Ｎを用いて再集約演算を行い、最終的に図示の集約結果２１０３を演算する。【０１５３】
以上のように、実施例１によれば、ＤＢサーバ１がＤＢ３０を分割して、数ＭＢ単位でハードウェアアクセラレータであるＦＰＧＡ２に処理を依頼すると、ＤＲＡＭ１３６のバンド幅がＳＳＤ１３７のバンド幅よりも大きいことから、ＳＳＤ１３７からのＤＢ３０の読み出しと、ＤＲＡＭ１３６からのデータ読み出しを並列して行える。制御部１２９が処理対象のＤＢ３０のデータをＳＳＤ１３７からＤＲＡＭ１３６に複製した後には、ＦＰＧＡ２は、ＳＳＤ１３７よりも読み出し速度の速いＤＲＡＭ１３６から所定の処理サイズ（例えば、ページ）のデータを入力することで、処理性能を向上させることができる。【０１５４】
そして、ＦＰＧＡ２は、データベースコマンド単位で集約処理を実行し、ＤＢサーバ１は、複数のデータベースコマンドに対する集約結果の再集約処理を行い、ＤＢサーバ１とＦＰＧＡ２が協調してデータベース処理を実行することにより、データベース処理システムの処理性能を向上することができる。【０１５５】
また、ＦＰＧＡ２では、フィルタリング処理、プロジェクション処理でのデータベース処理単位を、ＤＢ３０のページ単位とすることで、パイプライン処理を実現してハードウェアアクセラレータの性能をさらに向上させることが可能となる。
【実施例２】
【０１５６】
本実施例２においては、シノニムの発生頻度が高い場合におけるＤＢサーバ１の処理について説明する。本実施例では、シノニムの発生頻度が所定の閾値を超えた場合に、ＤＢサーバ１が、ＦＰＧＡ２がひとつのコマンドで処理するデータサイズを縮小し、グルーピング処理においてシノニムの発生を抑制するものである。その他の構成は、前記実施例１と同様である。【０１５７】
なお、シノニムの発生頻度は、例えば、シノニム１１４に含まれるグルーピング化列の数や、シノニム１１４に含まれるグルーピング化列の数と処理対象データ９０１の比率などを用いることができる。【０１５８】
図２５は、シノニム多発時にＦＰＧＡ２が処理するデータサイズを縮小する処理を示す図である。１００４〜１００８までについては、前記実施例１の図１０と同様であり、ＤＢサーバ１は、ＦＰＧＡ２がひとつのコマンドで処理するデータサイズを８ＭＢに設定している。【０１５９】
Ｇｒｏｕｐｉｎｇ１０８がグルーピングを行う際に、シノニムの発生頻度が高く、再集約モジュール１１８を実行するＤＢサーバ１の負荷が増大して、計算機システムとしてのＤＢ処理性能が低下する。【０１６０】
そこで、ＤＢサーバ１は、シノニムの発生頻度が高いと判定した場合には、ＦＰＧＡ２が処理する１コマンドあたりのＤＢ３０の処理単位のサイズを縮小させる。サイズ縮小前においては、１コマンドあたりのデータサイズは８ＭＢ（１００４）であるが、サイズ縮小後においては、１コマンドあたりのデータサイズは４ＭＢ（２００６）に低減される。【０１６１】
ＦＰＧＡ２は、４ＭＢ（２００６）のデータを1ページ単位（８ＫＢ）でＤＲＡＭ１３６から読み込み、前記実施例１と同様に、グルーピング処理や、スタッキング処理（数値演算）や、集約演算等を実行する。【０１６２】
ＦＰＧＡ２は、１コマンドあたり８ＭＢ分の集約処理が完了すると、前記実施例１と同様に、グループ順不同で、グルーピング化列と集約結果をＤＢサーバ１に返信する。グルーピング化列と集約結果を受け取ったＤＢサーバ１は、前記実施例１と同様にして、再集約モジュール１１８において、グルーピング化列を用いてグループハッシュテーブル１１９を生成し、ハッシュ値の順に集約結果を並べ替えて、全てのコマンドに対するグローバルの集約処理を実行する。【０１６３】
これにより、本実施例２では前記実施例１の効果に加えて、シノニム１１４が発生する頻度を低減して、ＤＢサーバ１の処理性能の低下を抑制することができる。【０１６４】
＜まとめ＞
前記実施例１、２では、ＦＰＧＡ２を有するストレージ装置３が１つの例を示したが、ＰＣＩスイッチ４に複数のストレージ装置３を接続することができる。また、ＦＰＧＡ２とストレージ装置３を独立させても良く、各ＦＰＧＡ２には、複数のストレージ装置３を接続することができる。【０１６５】
また、ストレージ装置３は、ＤＢ３０を格納するＳＳＤ１３７と、ＳＳＤ１３７から一旦データを読み込んでからＦＰＧＡ２にデータを読み込ませるＤＲＡＭ１３６で構成した例を示したがこれに限定されるものではない。ストレージ装置３は、例えば、不揮発性半導体記憶媒体で構成されてＤＢ３０を格納する第１の記憶部と、第１の記憶部よりも読み出し速度が高速な半導体記憶媒体で構成されてＦＰＧＡ２にデータを読み込ませる第２の記憶部とを有すれば良い。【０１６６】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、又は置換のいずれもが、単独で、又は組み合わせても適用可能である。【０１６７】
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、及び機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記録装置、または、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に置くことができる。【０１６８】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際には殆ど全ての構成が相互に接続されていると考えてもよい。
【図１】
2016185542.tif 000003
【図２】
2016185542.tif 000004
【図３】
2016185542.tif 000005
【図４】
2016185542.tif 000006
【図５】
2016185542.tif 000007
【図６】
2016185542.tif 000008
【図７】
2016185542.tif 000009
【図８】
2016185542.tif 000010
【図９】
2016185542.tif 000011
【図１０】
2016185542.tif 000012
【図１１】
2016185542.tif 000013
【図１２】
2016185542.tif 000014
【図１３】
2016185542.tif 000015
【図１４】
2016185542.tif 000016
【図１５】
2016185542.tif 000017
【図１６Ａ】
2016185542.tif 000018
【図１６Ｂ】
2016185542.tif 000019
【図１７】
2016185542.tif 000020
【図１８】
2016185542.tif 000021
【図１９】
2016185542.tif 000022
【図２０】
2016185542.tif 000023
【図２１】
2016185542.tif 000024
【図２２】
2016185542.tif 000025
【図２３】
2016185542.tif 000026
【図２４】
2016185542.tif 000027
【図２５】
2016185542.tif 000028
【手続補正書】
【提出日】平成29年2月28日(2017.2.28)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサと、メモリと、を含むサーバと、
前記サーバに接続されてデータベース処理を行うアクセラレータと、
前記アクセラレータに接続されてデータベースを格納するストレージ装置と、を有する計算機システムであって、
前記サーバは、
クエリを受け付けてデータベースコマンドを生成し、処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを決定して、前記アクセラレータに指令するサーバコマンド処理部と、
前記アクセラレータの出力を集計して前記クエリに対する処理結果を生成する再集約部と、を有し、
前記アクセラレータは、
前記サーバコマンド処理部からの指令に基づいて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力するデータベース処理部を有し、
前記再集約部は、
前記処理対象のデータベースの範囲についての集約結果を前記アクセラレータから受け付けると、当該集約結果を集計して前記クエリに対する処理結果として生成することを特徴とする計算機システム。
【請求項２】
請求項１に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理と、前記スタッキング処理とを前記所定の処理単位で並列して実行することを特徴とする計算機システム。
【請求項３】
請求項１に記載の計算機システムであって、
前記データベース処理部は、
前記所定の処理単位のデータ列についてグルーピング処理を行うグルーピング処理部を有し、
前記グルーピング処理部は、
前記データ列のデータについてハッシュ値とグループ情報を算出し、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知することを特徴とする計算機システム。
【請求項４】
請求項３に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理部が、前記ハッシュ値の衝突を検知したときには、前記グループ情報と、前記スタッキング処理の結果である数値を出力することを特徴とする計算機システム。
【請求項５】
請求項１に記載の計算機システムであって、
前記ストレージ装置は、
前記データベースを格納する第１の記憶部と、
前記第１の記憶部よりも読み出し速度が高速な半導体記憶媒体で構成されて前記アクセラレータにデータを読み込ませる第２の記憶部と、を有し、
前記アクセラレータは、
前記処理対象のデータベースの範囲について前記第１の記憶部から前記第２の記憶部へコピーさせ、前記第２の記憶部から前記単位サイズ毎に読み込むことを特徴とする計算機システム。
【請求項６】
請求項１に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理で、前記所定の処理単位のデータ列のデータについてハッシュ値とグループ情報を算出し、
前記スタッキング処理で、前記所定の処理単位のデータ列のデータについて数値を算出し、
前記集約処理で、前記グループ情報毎に前記数値を集約した数値情報を算出し、前記集約結果に前記グループ情報と、数値情報を含み、
前記再集約部は、
前記グループ情報からハッシュ値を算出してグループハッシュ情報に格納し、当該ハッシュ値に基づいて前記処理対象のデータベースの範囲についての集約結果を並び替えてから前記数値情報を集計して、前記クエリに対する処理結果を生成することを特徴とする計算機システム。
【請求項７】
請求項６に記載の計算機システムであって、
前記データベース処理部は、
前記グルーピング処理で、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知すると、前記グループ情報と、前記スタッキング処理の結果である数値を出力し、
前記再集約部は、
前記グループハッシュ情報を参照して、前記ハッシュ値が衝突した前記グループ情報と前記スタッキング処理の数値を再度集約して、前記クエリに対する処理結果を再計算することを特徴とする計算機システム。
【請求項８】
請求項３に記載の計算機システムであって、
前記サーバコマンド処理部は、
前記再集約部が受け付けたハッシュ値の衝突の発生頻度が予め設定した閾値を超えた場合には、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを縮小することを特徴とする計算機システム。
【請求項９】
データベースを格納するストレージ装置に接続されて、データベースコマンドを受け付けてデータベース処理を行うアクセラレータであって、
処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズと、を受け付けて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力するデータベース処理部を有し、
前記データベース処理部は、
前記グルーピング処理と、前記スタッキング処理とを前記所定の処理単位で並列して実行することを特徴とするアクセラレータ。
【請求項１０】
請求項９に記載のアクセラレータであって、
前記データベース処理部は、
前記所定の処理単位のデータ列についてグルーピング処理を行うグルーピング処理部を有し、
前記グルーピング処理部は、
前記データ列のデータについてハッシュ値とグループ情報を算出し、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知することを特徴とするアクセラレータ。
【請求項１１】
請求項１０に記載のアクセラレータであって、
前記データベース処理部は、
前記グルーピング処理部が、前記ハッシュ値の衝突を検知したときには、前記グループ情報と、前記スタッキング処理の結果である数値を出力することを特徴とするアクセラレータ。
【請求項１２】
請求項９に記載のアクセラレータであって、
前記ストレージ装置は、
前記データベースを格納する第１の記憶部と、
前記第１の記憶部よりも読み出し速度が高速な半導体記憶媒体で構成されて前記アクセラレータにデータを読み込ませる第２の記憶部と、を有し、
前記データベース処理部は、
前記処理対象のデータベースの範囲について前記第１の記憶部から前記第２の記憶部へコピーさせ、前記第２の記憶部から前記単位サイズ毎に読み込むことを特徴とするアクセラレータ。
【請求項１３】
プロセッサと、メモリと、を含むサーバが、前記サーバに接続されてデータベース処理を行うアクセラレータに、前記アクセラレータに接続されたストレージ装置のデータベースを処理させるデータベースの処理方法であって、
前記サーバが、クエリを受け付けてデータベースを生成し、処理対象のデータベースの範囲と、前記データベースの範囲を分割してひとつのデータベースコマンドで処理する単位サイズを決定して、前記アクセラレータに指令する第１のステップと、
前記アクセラレータが、前記サーバからの前記指令に基づいて、前記単位サイズで前記ストレージ装置からデータベースの処理対象データを読み込み、前記処理対象データを所定の処理単位に分轄して、前記所定の処理単位ごとにグルーピング処理と、スタッキング処理と、集約処理とを含むデータベース処理を実行して集約結果を出力する第２のステップと、
前記サーバが、前記アクセラレータの出力を集計して前記クエリに対する処理結果を生成する第３のステップと、を含み、
前記第３のステップは、
前記処理対象のデータベースの範囲についての集約結果を前記アクセラレータから受け付けると、当該集約結果を集計して前記クエリに対する処理結果として生成することを特徴とするデータベースの処理方法。
【請求項１４】
請求項１３に記載のデータベースの処理方法であって、
前記第２のステップは、
前記グルーピング処理で、前記所定の処理単位のデータ列のデータについてハッシュ値とグループ情報を算出し、前記スタッキング処理で、前記所定の処理単位のデータ列のデータについて数値を算出し、前記集約処理で、前記グループ情報毎に前記数値を集約した数値情報を算出し、前記集約結果に前記グループ情報と、数値情報を含み、
前記第３のステップは、
前記グループ情報からハッシュ値を算出してグループハッシュ情報に格納し、当該ハッシュ値に基づいて前記処理対象のデータベースの範囲についての集約結果を並び替えてから前記数値情報を集計して、前記クエリに対する処理結果を生成することを特徴とするデータベースの処理方法。
【請求項１５】
請求項１４に記載のデータベースの処理方法であって、
前記第２のステップは、
前記グルーピング処理で、前記ハッシュ値とグループ情報を対にしてハッシュ情報に格納し、前記ハッシュ情報に同一のハッシュ値で異なるグループ情報がある場合にはハッシュ値が衝突したことを検知すると、前記グループ情報と、前記スタッキング処理の結果である数値を出力し、
前記第３のステップは、
前記グループハッシュ情報を参照して、前記ハッシュ値が衝突した前記グループ情報と前記スタッキング処理の数値を再度集約して、前記クエリに対する処理結果を再計算することを特徴とするデータベースの処理方法。
【国際調査報告】
2016185542.tif 000029
2016185542.tif 000030
2016185542.tif 000031
2016185542.tif 000032