(57)【要約】  プロセッサ部が、クエリに応答して、シーケンシャルに実行される第１処理及び第２処理を含むジョイン処理のうち第１処理を実行する。プロセッサ部が、ジョイン処理のうち第２処理の一部の処理を実行するための１以上のコマンドを、複数のＤＢ表（データベース表）を含んだデータベースを格納した１以上の記憶媒体からデータを読み出す１以上のアクセラレータに送信し、その１以上のアクセラレータの各々からローカル処理の実行結果を受ける。１以上のアクセラレータの各々について、ローカル処理は、上記一部の処理のうちの、受信したコマンドに従う処理である。プロセッサ部は、１以上のアクセラレータの各々からの実行結果を基に第２処理の残りの処理を実行し、その残りの処理の実行結果を基に、クエリの結果を返す。
2018003004.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータベース表（ＤＢ表）を含んだデータベースを格納した１以上の記憶媒体からデータを読み出す１以上のアクセラレータに接続された１以上のインターフェースであるインターフェース部と、
前記インターフェース部に接続された１以上のプロセッサであるプロセッサ部と
を有し、
前記プロセッサ部は、
クエリに応答して、シーケンシャルに実行される第１処理及び第２処理を含み前記複数のＤＢ表のうち前記クエリで指定された第１ＤＢ表と第２ＤＢ表とのジョイン処理のうち前記第１処理を実行し、
前記ジョイン処理のうち前記第２処理の一部の処理を実行するための１以上のコマンドを前記１以上のアクセラレータに送信し、
前記１以上のコマンドに応答して前記１以上のアクセラレータから受信した実行結果を基に前記第２処理の残りの処理を実行し、
前記残りの処理の実行結果を基に、前記クエリの結果を返し、
前記１以上のアクセラレータの各々は、
前記プロセッサ部からコマンドを受信し、
前記一部の処理のうちの、前記受信したコマンドに従う処理であるローカル処理を実行し、
前記ローカル処理の実行結果を返す、
計算機システム。
【請求項２】
前記ジョイン処理は、ハッシュジョイン処理であり、
前記第１処理は、前記指定された第１ＤＢ表のハッシュ表の作成を含んだ処理であるビルド処理を含んだ処理であり、
前記第２処理は、前記指定された第２ＤＢ表における値のハッシュ値と前記ハッシュ表におけるハッシュ値との一致判定とを含んだ処理であるプローブ処理を含んだ処理である、
請求項１記載の計算機システム。
【請求項３】
前記クエリには、
集約方法と、
第１グループ化カラム名
とが指定されており、
前記１以上のコマンドの各々には、
前記クエリに指定されている前記第１グループ化カラム名に対応したカラム名であって、前記第２ＤＢ表におけるカラム名である第２グループ化カラム名と、
前記クエリにおいて指定されている集約方法に従う集約方法と
が指定されており、
前記１以上のアクセラレータの各々について、前記ローカル処理は、
（ａ）前記１以上の記憶媒体のうちの読出し元から前記第２ＤＢ表におけるデータを読み出すことと、
（ｂ）読み出されたデータを、その受信したコマンドで指定されている第２グループ化カラム名でグループ化することと、
（ｃ）グループ化されたデータを、その受信したコマンドで指定されている集約方法に従い集約することと、
（ｄ）集約結果を前記ローカル処理の実行結果の少なくとも一部として返すことと
を含み、
前記残りの処理は、前記１以上のアクセラレータからの集約結果を前記ハッシュ表を用いて集約する処理であるグローバル集約処理を含んだ処理である、
請求項２記載の計算機システム。
【請求項４】
前記ローカル処理では、前記第２ＤＢ表のセグメント毎に、（ａ）乃至（ｄ）が実行される、
請求項３記載の計算機システム。
【請求項５】
前記１以上のアクセラレータのうちの少なくとも１つが、ハードウェア回路であり、
前記ハードウェア回路が、
第１メモリと、
前記第１メモリより低速の第２メモリと
を有し、
前記ハードウェア回路が、前記セグメント毎に、（ａ）乃至（ｄ）を、前記第１メモリを使用して実行するようになっており、
前記ハードウェア回路が、前記第１メモリの空き容量が不足した場合、前記第２メモリを使用するようになっており、
セグメントサイズが、（ａ）乃至（ｄ）のために使用されるメモリ領域のサイズが前記第１メモリのサイズ未満となるサイズである、
請求項４記載の計算機システム。
【請求項６】
前記ハードウェア回路は、内部メモリを含んだＦＰＧＡ（Field-Programmable Gate Array）と、外部メモリとを含んだ回路であり、
前記内部メモリが、前記第１メモリであり、
前記外部メモリが、前記第２メモリである、
請求項５記載の計算機システム。
【請求項７】
前記第２ＤＢ表は、Fact表であり、
前記第１ＤＢ表は、前記Fact表に関連付けられたDimension表である、
請求項２記載の計算機システム。
【請求項８】
前記プロセッサ部は、
前記１以上のアクセラレータの使用可否を判断し、
前記判断の結果が肯定の場合、前記一部の処理を実行するための１以上のコマンドを前記１以上のアクセラレータに送信し、
前記判断の結果が否定の場合、前記１以上のアクセラレータ無しに前記ジョイン処理を実行する、
請求項１記載の計算機システム。
【請求項９】
前記１以上のアクセラレータの使用の許否がユーザインターフェースを介して設定されており、
前記１以上のアクセラレータの使用が許可されている場合、前記判断の結果が肯定であり、
前記１以上のアクセラレータの使用が許可されていない場合、前記判断の結果が否定である、
請求項８記載の計算機システム。
【請求項１０】
前記ジョイン処理は、ハッシュジョイン処理であり、
前記第１処理は、前記指定された第１ＤＢ表のハッシュ表の作成を含んだ処理であるビルド処理を含んだ処理であり、
前記第２処理は、前記指定された第２ＤＢ表における値のハッシュ値と前記ハッシュ表におけるハッシュ値との一致判定とを含んだ処理であるプローブ処理を含んだ処理であり、
前記クエリには、集約方法と、第１グループ化カラム名が指定されており、
前記１以上のコマンドの各々には、に基づき、
前記クエリに指定されている第１グループ化カラム名に対応したカラム名であって、前記第２ＤＢ表におけるカラム名である第２グループ化カラム名と、
前記クエリにおいて指定されている集約方法に従う集約方法と
が指定されており、
前記第１ＤＢ表の第１グループ化カラムにおける同一の値に対応する値として、前記第１グループ化カラム以外のいずれかのカラムに複数の異なる値が有り得ない場合、前記判断の結果が肯定であり、
前記第１ＤＢ表の第１グループ化カラムにおける同一の値に対応する値として、前記第１グループ化カラム以外のいずれかのカラムに複数の異なる値が有り得る場合、前記判断の結果が否定である、
請求項８記載の計算機システム。
【請求項１１】
前記インターフェース部及び前記プロセッサ部を含んだ計算機と、
前記計算機に接続された前記１以上のアクセラレータと
を有する請求項１記載の計算機システム。
【請求項１２】
１以上のストレージパッケージを更に有し、
前記１以上のストレージパッケージの各々が、
少なくとも１つの記憶媒体と、
前記少なくとも１つの記憶媒体からデータを読み出す少なくとも１つのアクセラレータと
を有する、
請求項１１記載の計算機システム。
【請求項１３】
前記インターフェース部、前記プロセッサ部、及び、前記１以上のアクセラレータのうちの少なくとも１つのアクセラレータを含んだ計算機、
を有する請求項１記載の計算機システム。
【請求項１４】
クエリに応答して、シーケンシャルに実行される第１処理及び第２処理を含むジョイン処理のうち前記第１処理を実行し、
前記ジョイン処理のうち前記第２処理の一部の処理を実行するための１以上のコマンドを、複数のデータベース表（ＤＢ表）を含んだデータベースを格納した１以上の記憶媒体からデータを読み出す１以上のアクセラレータに送信し、
前記１以上のアクセラレータの各々からローカル処理の実行結果を受け、
前記１以上のアクセラレータの各々について、前記ローカル処理は、前記一部の処理のうちの、受信したコマンドに従う処理であり、
前記１以上のアクセラレータの各々からの実行結果を基に前記第２処理の残りの処理を実行し、
前記残りの処理の実行結果を基に、前記クエリの結果を返す、
データベース管理方法。
【請求項１５】
クエリに応答して、シーケンシャルに実行される第１処理及び第２処理を含むジョイン処理のうち前記第１処理を実行し、
前記ジョイン処理のうち前記第２処理の一部の処理を実行するための１以上のコマンドを、複数のデータベース表（ＤＢ表）を含んだデータベースを格納した１以上の記憶媒体からデータを読み出す１以上のアクセラレータに送信し、
前記１以上のアクセラレータの各々からローカル処理の実行結果を受け、
前記１以上のアクセラレータの各々について、前記ローカル処理は、前記一部の処理のうちの、受信したコマンドに従う処理であり、
前記１以上のアクセラレータの各々からの実行結果を基に前記第２処理の残りの処理を実行し、
前記残りの処理の実行結果を基に、前記クエリの結果を返す、
ことを計算機に実行させるコンピュータプログラムを記録した計算機読取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、データ管理技術に関する。
【背景技術】
【０００２】
データベース処理として、複数のテーブルのデータを結合して新たなテーブルを作成するジョイン処理が知られている。ジョイン処理の一例として、一般に、ハッシュジョイン処理が知られている。ハッシュジョイン処理を複数の計算機（processing modules）で負荷分散（並列実行）する技術が知られている（特許文献１）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許公開第８，１９５，６４４明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
近年、コンピュータシステムの性能を向上するため、ＣＰＵ（Central Processing Unit）に加えてＦＰＧＡ（Field-Programmable Gate Array）やＧＰＵ（Graphic Processor Unit）等をアクセラレータとして活用する技術が開発されている。【０００５】
このようなアクセラレータにデータベース処理の一部をオフロードすることで、データベース処理を高速化することが考えられる。【０００６】
また、データベース処理として、上述したようにハッシュジョイン処理が知られている。【０００７】
しかし、特許文献１に開示の複数の計算機のうちの少なくとも１つをアクラレータに置き換えることでハッシュジョイン処理の高速化を図ることはできない。なぜなら、一般に、ハッシュジョイン処理は、ビルド処理とプローブ処理とで構成されるが、特許文献１では、複数の計算機のいずれも、ビルド処理とプローブ処理を実行する必要があるからである、言い換えれば、各計算機に、ビルド処理とプローブ処理を実行することができるだけの十分なリソース量が求められるためである。具体的には、例えば、ビルド処理を行うためには、ハッシュ表（ビルド表）を保持する必要があるが、そのハッシュ表を格納したりそのハッシュ表を用いた集約処理を実行したりするための比較的多くのリソース量が必要になる。【０００８】
一方、アクセラレータのリソース量は、一般に、ビルド処理とプローブ処理の両方を実行できる計算機に必要とされるリソース量よりも少ない。
【課題を解決するための手段】
【０００９】
プロセッサ部が、クエリに応答して、シーケンシャルに実行される第１処理及び第２処理を含むジョイン処理のうち第１処理を実行する。プロセッサ部が、ジョイン処理のうち第２処理の一部の処理を実行するための１以上のコマンドを、複数のＤＢ表（データベース表）を含んだデータベースを格納した１以上の記憶媒体からデータを読み出す１以上のアクセラレータに送信し、その１以上のアクセラレータの各々からローカル処理の実行結果を受ける。１以上のアクセラレータの各々について、ローカル処理は、上記一部の処理のうちの、受信したコマンドに従う処理である。プロセッサ部は、１以上のアクセラレータの各々からの実行結果を基に第２処理の残りの処理を実行し、その残りの処理の実行結果を基に、クエリの結果を返す。
【発明の効果】
【００１０】
アクセラレータを用いたジョイン処理の実現が可能になり、且つ、ジョイン処理の高速化が可能になる。
【図面の簡単な説明】
【００１１】
【図１】実施例１に係る計算機システムの構成を示す。
【図２】ＤＢ管理テーブルの構成を示す。
【図３】セグメント管理テーブルの構成を示す。
【図４】クエリの一例を示す。
【図５】実施例１に係るジョイン処理の概要の模式図である。
【図６】クエリ実行部の処理フローを示す。
【図７】ローカルコマンドの一例を示す。
【図８】制御部の処理フローを示す。
【図９】集約結果の一例を示す。
【図１０】実施例２に係る計算機システムの構成を示す。
【図１１】実施例３に係る計算機システムの構成を示す。
【発明を実施するための形態】
【００１２】
以下、図面を参照して、本発明の幾つかの実施例を説明する。但し、これらの実施例は本発明を実現するための一例に過ぎず、本発明の技術的範囲を限定するものではない。
【００１３】
以下の説明では、「インターフェース部」は、１以上のインターフェースを含む。１以上のインターフェースは、１以上の同種のインターフェースデバイス（例えば１以上のＮＩＣ（Network Interface Card））であってもよいし２以上の異種のインターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１４】
また、以下の説明では、「記憶資源」は、１以上のメモリを含む。少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。記憶資源は、１以上のメモリに加えて、１以上のＰＤＥＶを含んでもよい。「ＰＤＥＶ」は、物理的な記憶デバイスを意味し、典型的には、不揮発性の記憶デバイス（例えば補助記憶デバイス）でよい。ＰＤＥＶは、例えば、ＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive）でよい。
【００１５】
また、以下の説明では、「プロセッサ部」は、１以上のプロセッサを含む。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Central Processing Unit）である。プロセッサは、処理の一部又は全部を行うハードウェア回路を含んでもよい。
【００１６】
また、以下の説明では、「ｋｋｋ部」の表現にて処理部（機能）を説明することがあるが、処理部は、コンピュータプログラムがプロセッサ部によって実行されることで実現されてもよいし、ハードウェア回路（例えばＦＰＧＡ又はＡＳＩＣ（Application Specific Integrated Circuit））によって実現されてもよい。プログラムがプロセッサ部によって処理部が実現される場合、定められた処理が、適宜に記憶資源（例えばメモリ）及び／又は通信インターフェイスデバイス（例えば通信ポート）等を用いながら行われるため、処理部はプロセッサ部の少なくとも一部とされてもよい。処理部を主語として説明された処理は、プロセッサ部あるいはそのプロセッサ部を有する装置が行う処理としてもよい。また、プロセッサ部は、処理の一部又は全部を行うハードウェア回路を含んでもよい。プログラムは、プログラムソースからプロセッサにインストールされてもよい。プログラムソースは、例えば、プログラム配布計算機又は計算機が読み取り可能な記録媒体（例えば非一時的な記録媒体）であってもよい。各処理部の説明は一例であり、複数の処理部が１つの処理部にまとめられたり、１つの処理部が複数の処理部に分割されたりしてもよい。
【００１７】
また、以下の説明では、「ｘｘｘ管理テーブル」といった表現にて情報を説明することがあるが、情報は、どのようなデータ構造で表現されていてもよい。すなわち、情報がデータ構造に依存しないことを示すために、「ｘｘｘ管理テーブル」を「ｘｘｘ管理情報」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、１つのテーブルは、２以上のテーブルに分割されてもよいし、２以上のテーブルの全部又は一部が１つのテーブルであってもよい。
【００１８】
また、以下の説明では、「データベース」を「ＤＢ」と略記する。また、ＤＢとしての表を「ＤＢ表」と言う。
【００１９】
また、以下の説明では、「計算機システム」は、少なくとも１つの計算機を含むシステムである。このため、「計算機システム」は、１つの計算機であってもよいし、複数の計算機であってもよいし、計算機の他に計算機以外のデバイスを含んでいてもよい。また、「計算機」は、１以上の物理計算機であってよく、少なくとも１つの仮想計算機を含んでもよい。
【００２０】
また、以下の説明では、「集約処理」は、複数の値（データ）を１つの値に集約する処理を意味する。以下の説明では、集約処理の一例として、合計処理が採用される。しかし、集約処理として、平均値を算出する処理のように他の集約処理が採用されてもよい。
【００２１】
また、以下の説明では、「ジョイン処理」の一例として、ハッシュジョイン処理が採用される。しかし、ジョイン処理として、ハッシュジョイン処理以外のジョイン処理が採用されてもよい。
【００２２】
また、以下の説明では、ジョイン処理はハッシュジョイン処理のため、データベースに含まれる複数のＤＢ表は、１以上のスタースキーマを含む。スタースキーマは、１つのFact表と、そのFact表に関連付けられた１以上のDimension表とで構成される。
【００２３】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号における共通部分を使用し、同種の要素を区別して説明する場合は、参照符号を使用することがある。
【実施例１】
【００２４】
図１は、実施例１に係る計算機システムの構成例を示す。【００２５】
複数（又は１つ）のＳＳＤ１４０（Solid State Drive）と、複数（又は１つ）のＤＢ処理ボード１５０と、サーバ１００とを有する。本実施例では、複数（又は１つ）のストレージパッケージ１９８が備えられる。複数のストレージパッケージ１９８の各々が、少なくとも１つのＳＳＤ１４０と、その少なくとも１つのＳＳＤ１４０からデータを読み出す少なくとも１つのＤＢ処理ボード１５０とを有する。本実施例では、ＳＳＤ１４０とＤＢ処理ボード１５０が１：１で対応している。また、互いに対応しているＳＳＤ１４０及びＤＢ処理ボード１５０がストレージパッケージ１９８内にある。また、ＤＢ処理ボード１５０にとってのデータ読出し元は、そのＤＢ処理ボード１５０が存在するストレージパッケージ１９８内のＳＳＤ１４０であり、そのＤＢ処理ボード１５０が存在するストレージパッケージ１９８と異なるストレージパッケージ１９８内のＳＳＤ１４０ではない。しかし、本発明はそれに限らず、例えば、ＳＳＤ１４０とＤＢ処理ボード１５０との対応関係は１：１でなくてもよいし、また、ストレージパッケージ１９８は無くてもよい（例えば、複数のＳＳＤ１４０に１つのＤＢ処理ボード１５０が対応していてもよい）。【００２６】
各ＳＳＤ１４０は、記憶媒体（例えば、不揮発記憶媒体）の一例である。各ＤＢ処理ボード１５０は、ハードウェア回路の一例である。ハードウェア回路は、アクセラレータの一例である。つまり、ＤＢ処理ボード１５０は、アクセラレータの一例である。各ＤＢ処理ボード１５０は、ＳＲＡＭ（Static Random Access Memory）１６４を含んだＦＰＧＡ１６０と、ＤＲＡＭ（Dynamic Random Access Memory）１７０とを有する。ＳＲＡＭ１６４は、内部メモリの一例である。内部メモリは、第１メモリの一例である。ＤＲＡＭ１７０は、外部メモリの一例である。外部メモリは、第２メモリ（第１メモリより低速のメモリ）の一例である。メモリの高速／低速は、メモリがＦＰＧＡ１６０内にあるか否かと、メモリの種類とのうちの少なくとも１つに依存する。サーバ１００は、計算機の一例である。サーバ１００は、Ｉ／Ｆ１８０と、メモリ１２０と、それらに接続されたＣＰＵ１１０とを有する。Ｉ／Ｆ１８０は、インターフェース部の一例である。メモリ１２０は、記憶資源の一例である。ＣＰＵ１１０は、プロセッサ部の一例である。【００２７】
複数のＳＳＤ１４０の各々は、上述したように、記憶媒体の一例である。複数のＳＳＤ１４０の少なくとも１つに代えて、他種の記憶媒体、例えばＨＤＤ（Hard Disk Drive）を採用することができる。複数のＳＳＤ１４０に、ＤＢ表が格納される。【００２８】
ＤＢ処理ボード１５０は、一種のアクセラレータである。ＤＢ処理ボード１５０は、上述したように、ＦＰＧＡ１６０とＤＲＡＭ１７０とを有する。ＦＰＧＡ１６０も、アクセラレータの一例と言うことができる。ＦＰＧＡ１６０は、ＳＲＡＭ１６４を含む。ＦＰＧＡ１６０内のＳＲＡＭ１６４は、ＦＰＧＡ１６０にとって、ＦＰＧＡ１６０外のＤＲＡＭ１７０よりも高速である。ＦＰＧＡ１６０は、ＤＢＭＳ１３０からの後述のローカルコマンドに応答して、ローカル処理（データ読出し、グループ化、及び、ローカル集約処理を含んだ処理）を実行する。具体的には、ＦＰＧＡ１６０は、データ読出し部１６１、制御部１６２、グループ化処理部１６３及びローカル集約処理部１６５を有する。制御部１６２が、ＤＢＭＳ（Database management system）１３０からのローカルコマンドに応答して、データ読出し部１６１、グループ化処理部１６３及びローカル集約処理部１６５の各々に処理の実行を指示し、ローカルコマンドの実行結果をＤＢＭＳ１３０に返す。データ読出し部１６１は、ＳＳＤ１４０からデータを読み出し、読み出したデータを、ＳＲＡＭ１６４に格納する。グループ化処理部１６３は、読み出されたデータ（ＳＲＡＭ１６４内のデータ）をグループ化する。ローカル集約処理部１６５は、グループ化されたデータ（ＳＲＡＭ１６４内のデータ）を集約する処理であるローカル集約処理を実行する。なお、ここで、データ読出し部１６１により読み出されたデータ、グループ化処理部１６３によりグループ化されたデータ、及び、ローカル集約処理部１６５により集約されたデータは、いずれも、ＳＲＡＭ１６４に格納されるが、ＳＲＡＭ１６４の空き容量が不足した場合、ＤＲＡＭ１７０に格納される。【００２９】
メモリ１２０に、ＣＰＵ１１０に実行されるコンピュータプログラムの一例であるＤＢＭＳ１３０が格納される。ＤＢＭＳ１３０は、クエリ実行部１３１、ビルド処理部１３２、グループ化カラム特定部１３３、ローカルコマンド作成部１３４及びグローバル集約処理部１３５を有し、ＤＢ管理テーブル１３６及びセグメント管理テーブル１３７を管理する。クエリ実行部１３１は、クエリソース（図示せず）からクエリを受信し、適宜、他の処理部１３２、１３３、１３４又は１３５に指示を出し、クエリの結果をクエリソースに返す。クエリソースは、サーバ１００で実行されるアプリケーションプログラム（図示せず）でもよいし、サーバ１００に接続されたクライアント（図示せず）であってもよい。ビルド処理部１３２は、ハッシュジョイン処理のうちのビルド処理を実行する。グループ化カラム特定部１３３は、グループ化カラムを特定する。ローカルコマンド作成部１３４は、ＤＢ処理ボード１５０（ＦＰＧＡ１６０）向けのコマンドであってローカル処理を実行するためのコマンドであるローカルコマンド（コマンドの一例）を作成する。グローバル集約処理部１３５は、複数のＤＢ処理ボード１５０からの集約結果をハッシュ表（ビルド表）を用いて集約する処理であるグローバル集約処理を実行する。ローカル処理もグローバル集約処理も、プローブ処理に含まれる処理である。ＤＢ管理テーブル１３６は、ＤＢ表に関する情報を保持する。セグメント管理テーブル１３７は、ＤＢ表のセグメントに関する情報を保持する。【００３０】
図２は、ＤＢ管理テーブル１３６の構成を示す。【００３１】
ＤＢ管理テーブル１３６は、ＤＢ表毎にサブテーブル２０１を有する。サブテーブル２０１は、ＤＢ表名、データ行数（レコード数）、及び、カラム数を表す情報を保持する。また、サブテーブル２０１は、カラム毎に、カラム名、カラムデータ型、及び、ユニーク属性を表す情報を保持する。「ユニーク属性」とは、対応するカラムにおける同一の値（データ）に対応する値として、対応するカラム以外のいずれかのカラムにおいて複数の異なる値が有り得るか否かを意味する。例えば、ＤＢ表“Store”について、ユニーク属性“あり”は、対応するカラムにおける同一の値に対応する値として、対応するカラム以外のいずれかのカラム（ＤＢ表“Store”内のカラム）において複数の異なる値が有り得えないことを意味する。また、例えば、ＤＢ表“Sales”について、ユニーク属性“なし”は、対応するカラムにおける同一の値に対応する値として、対応するカラム以外のいずれかのカラム（ＤＢ表“Sales”内のカラム）において複数の異なる値が有り得えることを意味する。【００３２】
サブテーブル２０１Ａは、Fact表（ＤＢ表名“Sales”）に対応したテーブルである。一方、サブテーブル２０１Ｂは、Fact表（ＤＢ表名“Sales”）に関連付いたDimension表（ＤＢ表名“Store”）に対応したテーブルである。【００３３】
ＤＢ管理テーブル１３６は、スタースキーマ毎に存在してもよいし、スタースキーマ毎に２以上のサブテーブル２０１を保持してもよい。また、Fact表に対応したサブテーブル２０１Ａが、そのFact表に関連付いたDimension表に対応したサブテーブル２０１Ｂへのポインタを保持してもよいし、Dimension表に対応したサブテーブル２０１Ｂが、そのDimension表が関連付いたFact表に対応したサブテーブル２０１Ａへのポインタを保持してもよい。【００３４】
図３は、セグメント管理テーブル１３７の構成を示す。【００３５】
セグメント管理テーブル１３７は、ＤＢ表毎にサブテーブル３０１を有する。サブテーブル３０１は、ＤＢ表名、及び、格納デバイス数（対応するＤＢ表を格納する格納デバイス（ＳＳＤ１４０）の数）を表す情報を保持する。また、サブテーブル３０１は、格納デバイス毎に、ＳＳＤ識別子（格納デバイスであるＳＳＤの識別子）、先頭アドレス（対応するＤＢ表を格納した領域の先頭アドレス）、セグメントサイズ（セグメントのサイズ）、及び、セグメント数（対応する格納デバイスにおけるＤＢ表を構成するセグメントの数）を表す情報を保持する。【００３６】
サブテーブル３０１Ａは、Fact表（ＤＢ表名“Sales”）に対応したテーブルである。一方、サブテーブル３０１Ｂは、Fact表（ＤＢ表名“Sales”）に関連付いたDimension表（ＤＢ表名“Store”）に対応したテーブルである。【００３７】
セグメント管理テーブル１３７は、スタースキーマ毎に存在してもよいし、スタースキーマ毎に２以上のサブテーブル３０１を保持してもよい。また、Fact表に対応したサブテーブル３０１Ａが、そのFact表に関連付いたDimension表に対応したサブテーブル３０１Ｂへのポインタを保持してもよいし、Dimension表に対応したサブテーブル３０１Ｂが、そのDimension表が関連付いたFact表に対応したサブテーブル３０１Ａへのポインタを保持してもよい。【００３８】
図４は、クエリの一例を示す。【００３９】
クエリは、例えばSQLである。具体的には、例えば、クエリは、SQLのSelect文である。具体的には、例えば、クエリには、SELECT句（カラム“StoreName”、集約方法“SUM（SalesAmount）”）、FROM句（ＤＢ表“Store”及び“Sales”）、WHERE句（ＤＢ表“Store”のカラム“StoreNumber”における値とＤＢ表“Sales”のカラム“StoreNumber”における値が一致するという条件）、及び、GROUP BY句（ＤＢ表“Store”のカラム“StoreName”でグループ化）が指定されている。なお、以下の説明では、GROUP BY句で指定されたカラムを、「第１グループ化カラム」と言う。また、WHERE句で指定されたカラムを、「ジョインカラム」と言う。【００４０】
図５は、本実施例に係るジョイン処理の概要の模式図である。【００４１】
例えば、Fact表と、そのFact表に関連付けられた多数（１以上）のDimension表とで構成されたスタースキーマが用いられる。一般に、Fact表は、購買履歴などを管理するテーブルでありデータ量が大きい。一方、Dimension表は、支店名、商品名などを格納するテーブルであり、データ量は小さい。【００４２】
クエリに応答したハッシュジョイン処理は、Fact表５０３ＦとDimension表５０３Ｄのジョイン処理であるとする。Dimension表５０３Ｄは、第１ＤＢ表の一例である。Fact表５０３Ｆは、第２ＤＢ表の一例である。【００４３】
ハッシュジョイン処理は、一般に、以下の２つの処理を含む。
・ビルド処理：２つのＤＢ表のうちの小さい方の表（典型的にはDimension表）のハッシュ表を作成する処理。ハッシュ表は、ビルド表と呼ばれてもよい。
・プローブ処理：２つのＤＢ表のうちの大きい方の表（典型的にはFact表）における値のハッシュ値を算出し、算出されたハッシュ値と、ハッシュ表におけるハッシュ値との一致判定を行う処理。大きい方の表は、プローブ表と呼ばれてもよい。【００４４】
この２つの処理のうち、一般に、プローブ処理の方が、レコード件数が多く、負荷が高い。ジョイン処理の処理時間のうち、プローブ処理が最も大きな割合を占める。【００４５】
本実施例では、ＤＢ処理ボード１５０内のＦＰＧＡ１６０が、グループ化処理と集約処理を実行することにより、ハッシュジョイン処理を高速化する。【００４６】
具体的には、ビルド処理（Dimension表５０３Ｄのハッシュ表５０１を作成する処理）を、サーバ１００が実行し、プローブ処理の一部（例えば、グループ化処理とローカル集約処理）を、ＦＰＧＡ１６０が実行し、プローブ処理の残り（例えば、グローバル集約処理）を、サーバ１００が実行する。【００４７】
ＦＰＧＡ１６０において、グループ化処理とローカル集約処理は、Fact表５０３Ｆ（プローブ表の一例）のセグメント５１１毎に実行される。具体的には、ＦＰＧＡ１６０が、Fact表のセグメント５１１毎に、（ａ）Fact表におけるデータを読み出すことと、（ｂ）読み出されたデータをグループ化することと（グループ化処理）、（ｃ）グループ化されたデータを集約することと（ローカル集約処理）、（ｄ）集約結果をサーバ１００に返すことと、を実行する。セグメント５１１毎の（ａ）乃至（ｄ）を含んだ処理が、ローカル処理である。【００４８】
（ａ）乃至（ｄ）がセグメント５１１毎に行われるため、ＦＰＧＡ１６０での高速処理が期待できる。例えば、ＦＰＧＡ１６０は、セグメント５１１毎に、（ａ）乃至（ｄ）を、ＳＲＡＭ１６４を使用して実行するようになっている。すなわち、（ａ）で読み出されたデータ、（ｂ）でグループ化されたデータ、及び、（ｃ）で集約されたデータは、いずれも、ＳＲＡＭ１６４に格納されるようになっている。しかし、ＳＲＡＭ１６４の空き容量が不足した場合、データがＤＲＡＭ１７０に格納されるようになっている。セグメント５１１のサイズは、セグメント管理テーブル１３７に記録されているセグメントサイズ通りであり、そのサイズは、（ａ）乃至（ｄ）のために使用されるメモリ領域のサイズがＳＲＡＭ１６４のサイズ未満となるサイズである。このため、ローカル処理のためにＤＲＡＭ１７０が使用されてしまうことを避けることができる。故に、ローカル処理が高速である。【００４９】
また、図４に例示のクエリによれば、第１グループ化カラム（GROUP BY句において指定されているカラム）は“StoreName”であるが、WHERE句において指定されているカラムであるジョインカラム（一定判定用の条件に適合するカラム）は、“StoreNumber”である（そもそも、本実施例では、Fact表“Sales”には、カラム“StoreNumber”はあるが、カラム“StoreName”は無い）。このため、サーバ１００がＦＰＧＡ１６０に対して指定するグループ化カラム（ローカルコマンドにおいて指定するグループ化カラム）は、第１グループ化カラム“StoreName”とは異なるカラム“StoreNumber”である必要がある。以下の説明において、ローカルコマンドにおいて指定するグループ化カラムを、「第２グループ化カラム」と言う。ＦＰＧＡ１６０は、セグメント５１１毎に、データを読み出し、読み出されたデータを第２グループ化カラム“StoreNumber”でグループ化し、グループ化されたデータの集約であるローカル集約処理を実行し、集約結果をサーバ１００に返す。サーバ１００は、複数のＦＰＧＡ１６０から集約結果とハッシュ表５０１とを突き合わせる。【００５０】
本実施例に係るハッシュジョイン処理によれば、サーバ１００のプローブ処理の負荷は軽減され、結果として、ジョイン処理が高速になる。例えば、１つのセグメント５１１に、６４０００個のレコードがあるとする。また、StoreName値（カラム“StoreName”における値）として、異なる値が１００個であるとする（つまり、異なるStore nameが１００個あるとする）。ジョイン処理においてＤＢ処理ボード１５０が使用される場合、ＤＢ処理ボード１５０が使用されない場合に比べて、サーバ１００のプローブ処理の負荷は、100/64000≒0.16%に削減される。【００５１】
以下、本実施例に係るジョイン処理の流れの詳細を説明する。その際、図２〜図５を具体例として採用する。【００５２】
図６は、クエリ実行部１３１の処理フローを示す。この処理フローは、クエリソースからクエリを受信した場合に開始される。【００５３】
Ｓ６０１で、クエリ実行部１３１は、クエリに応答して、ジョイン処理におけるジョイン対象の２つのＤＢ表を決定する。ここでは、Fact表５０３ＦとDimension表５０３Ｄが決定されたとする。【００５４】
Ｓ６０２で、クエリ実行部１３１は、ビルド処理をビルド処理部１３２に指示する。その指示に従い、ビルド処理部１３２が、ビルド処理を実行する、すなわち、Ｓ６０１で決定された２つのＤＢ表５０３Ｆ及び５０３Ｄのうちデータ行数（レコード数）の少ない方のＤＢ表のハッシュ表を作成する。「データ行数（レコード数）の少ない方のＤＢ表」は、典型的には、Dimension表５０３Ｄである。ここでは、Dimension表５０３Ｄのハッシュ表５０１が作成されたとする。Dimension表５０３Ｄは、第１ＤＢ表の一例である。例えば、その指示に対する応答として、作成されたハッシュ表５０１の場所（例えば、メモリ１２０のアドレス）がクエリ実行部１３１に返される。【００５５】
Ｓ６０３で、クエリ実行部１３１は、２つのＤＢ表５０３Ｆ及び５０３Ｄのジョインカラムを決定する。ここでは、ジョインカラムは、カラム“StoreNumber”であるとする。【００５６】
Ｓ６０４で、クエリ実行部１３１は、ＤＢ処理ボード１５０を使用可能か否かを判断する。【００５７】
Ｓ６０４の判断の結果が偽の場合（Ｓ６０４：Ｎｏ）、Ｓ６０８が実行される。Ｓ６０８で、クエリ実行部１３１が、ジョイン処理の残り（つまり、プローブ処理の全体を含んだ処理）を実行する。【００５８】
一方、Ｓ６０４の判断の結果が真の場合（Ｓ６０４：Ｙｅｓ）、Ｓ６０５〜Ｓ６０７が実行される。【００５９】
Ｓ６０５で、クエリ実行部１３１は、グループ化カラムの特定をグループ化カラム特定部１３３に指示する。その指示に従い、グループ化カラム特定部１３３が、第１グループ化カラム名（“StoreName”）を基に、第２グループ化カラム名、すなわち、プローブ表であるFact表５０３Ｆのグループ化カラム名（“StoreNumber”）を特定する。その指示に対する応答として、特定された第２グループ化カラム名がクエリ実行部１３１に返される。【００６０】
Ｓ６０６で、クエリ実行部１３１は、ローカルコマンドの作成をローカルコマンド作成部１３４に指示する。その指示に従い、ローカルコマンド作成部１３４が、Fact表５０３Ｆを格納した１以上のＳＳＤからデータを読み出す１以上のＤＢ処理ボード１５０の各々に対して、ローカルコマンドを作成し、作成したローカルコマンドを送信する。ローカルコマンドを受信したＦＰＧＡ１６０が、そのローカルコマンドに応答してローカル処理を実行する。ＦＰＧＡ１６０は、ローカル処理において、セグメント毎に、ローカル集約処理の結果である集約結果をＤＢＭＳ１３０に返す。【００６１】
Ｓ６０７で、クエリ実行部１３１は、グローバル集約処理の実行をグローバル集約処理部１３５に指示する。その指示に従い、グローバル集約処理部１３５が、グローバル集約処理を実行する、すなわち、１以上のローカルコマンドの送信先である１以上のＤＢ処理ボード１５０からの集約結果を集約する。【００６２】
Ｓ６０９で、クエリ実行部１３１が、ジョイン処理の結果（クエリの結果）を、クエリソースに返す。ここで返る結果は、Ｓ６０７又はＳ６０８の結果である。【００６３】
図７は、ローカルコマンドの一例を示す。【００６４】
ローカルコマンドには、例えば、デバイス名、開始アドレス、セグメントサイズ、第２グループ化カラム名、集約方法、及び、集約カラム名が指定される。【００６５】
デバイス名は、読出し元のＳＳＤのデバイス名である。読出し元のＳＳＤは、ローカルコマンドの送信先のＤＢ処理ボード１５０を含んだストレージパッケージ１９８内のＳＳＤ１４０である。開始アドレスは、そのＳＳＤのアドレス（論理アドレス）であって、Fact表を格納した領域の先頭アドレスである。セグメントサイズは、セグメント５１１のサイズである。第２グループ化カラム名は、上述した第２グループ化カラムのカラム名である。集約方法は、クエリで指定されている集約方法に従う集約方法（典型的には同じ集約方法）である。具体的には、ローカルコマンド作成部１３４により、SELECT句から集約方法（SUM）が特定され、特定された集約方法がローカルコマンドで指定される。集約カラム名は、集約される値（カラム値）を保持したカラムのカラム名である。【００６６】
図８は、ＦＰＧＡ１６０内の制御部１６２の処理フローを示す。この処理フローは、ＤＢＭＳ１３０からローカルコマンドを受信した場合に開始される。なお、ＤＢ処理ボード１５０に対して、ローカルコマンドは、１つのジョイン処理につき１つ発行されるが、ローカルコマンドは、セグメント毎に発行されてもよい。【００６７】
Ｓ８０１で、制御部１６２は、データ読出し部１６１に、データ読出しを指示する。この指示に従い、データ読出し部１６１が、開始アドレスからセグメントサイズ分のデータを読み出す。セグメントサイズは、ローカルコマンドで指定されているセグメントサイズである。読み出されたデータは、ＳＲＡＭ１６４に格納される。【００６８】
Ｓ８０２で、制御部１６２は、読み出されたデータ（セグメントサイズ分のデータ）から１レコード分のデータを取得する。【００６９】
Ｓ８０３で、制御部１６２は、第２グループ化カラムで、Ｓ８０２で取得されたデータをグループ化する。ＳＲＡＭ１６４に、Ｓ８０２で取得されたデータがあり、そのデータが、Ｓ８０３でグループ化される。第２グループ化カラムは、ローカルコマンドで指定されている第２グループ化カラム名のカラムである。【００７０】
Ｓ８０４で、制御部１６２は、ローカル集約処理をローカル集約処理部１６５に指示する。その指示に従い、ローカル集約処理部１６５が、ローカル集約処理を実行する。具体的には、ローカル集約処理部１６５は、グループ化されたデータ（レコード）における集約カラム値を集約方法に従い集約する。「集約カラム値」は、集約カラム名のカラムにおける値である。集約カラム名及び集約方法は、ローカルコマンドで指定されている。図７の例によれば、集約カラム“SalesAmount”における値の合計（SUM）が算出される。【００７１】
Ｓ８０５で、制御部１６２は、Ｓ８０２で読み出したセグメントサイズ分のデータから全てのレコードのデータを取得したか否かを判断する。Ｓ８０５の判断結果が偽の場合（Ｓ８０５：Ｎｏ）、未取得のレコードについて、Ｓ８０２が実行される。Ｓ８０５の判断結果が真の場合（Ｓ８０５：Ｙｅｓ）、Ｓ８０６が実行される。【００７２】
Ｓ８０６で、制御部１６２は、セグメントサイズ分のデータの集約結果をＤＢＭＳ１３０に返す。集約結果の一例は、図９に示す通りである。すなわち、集約結果は、第２グループ化カラム“StoreNumber”におけるカラム値を保持し、且つ、そのカラム値毎に、集約カラム“SalesAmount”におけるカラム値の合計（SUM）を保持する。【００７３】
Ｓ８０７で、制御部１６２は、全てのセグメントについて読出しが行われたか否かを判断する。Ｓ８０５の判断結果が偽の場合（Ｓ８０７：Ｎｏ）、未だ読出しが行われていないセグメントについて、Ｓ８０１が実行される。Ｓ８０７の判断結果が真の場合（Ｓ８０７：Ｙｅｓ）、ローカルコマンドに従う処理、つまりローカル処理が終了する。【００７４】
以上の通り、ＦＰＧＡ１６０が、Fact表（プローブ表の一例）のセグメント毎に、（ａ）Fact表におけるデータを読み出すことと、（ｂ）読み出されたデータを、受信したローカルコマンドで指定されている第２グループ化カラム名でグループ化することと、（ｃ）グループ化されたデータを、そのローカルコマンドで指定されている集約方法及び集約カラムに従い集約することと、（ｄ）集約結果（ローカル処理の実行結果の少なくとも一部）を返すこととを実行する。【００７５】
ＤＢＭＳ１３０において、グローバル集約処理部１３５が、複数のＦＰＧＡからの集約結果をハッシュ表を用いて集約する。図９を例に取ると、次の通りである。すなわち、グローバル集約処理部１３５は、集約結果から１つのStoreNumber値（例えば“１”）を取得し、そのStoreNumber値のハッシュ値を算出し、算出したハッシュ値と同じハッシュ値がハッシュ表にあるか否かを判断する。その判断が真の場合、グローバル集約処理部１３５は、集約結果における、そのStoreNumber値に対応したSUM値を、そのStoreNumber値についてのこれまでの集約値（合計値）に加算することで、そのStoreNumber値に対応した最新の集約値を算出する。【００７６】
このようなグローバル集約処理の結果として、StoreNumber値毎の集約値が算出される。クエリ実行部１３１は、各StoreNumber値を、そのStoreNumber値に対応したStoreName値（カラム“StoreName”における値）に差し替える。クエリ実行部１３１は、クエリの結果として、StoreName値と集約値（SalesAmount値の合計）とのリストをクエリソースに返す。【００７７】
以上の説明において、StoreNumber値は、第２グループ化カラム値の一例である。StoreName値は、第１グループ化カラム値の一例である。上記の例では、第２グループ化カラムは第１グループ化カラムと異なるが、第２グループ化カラムは第１グループ化カラムと同じであることも有り得る。SalesAmount値は、集約カラム値の一例である。
【実施例２】
【００７８】
実施例２を説明する。その際、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略又は簡略する。【００７９】
図１０は、実施例２に係る計算機システムの構成を示す。【００８０】
ＦＰＧＡ１６０が内蔵された計算機１０００が採用される。計算機１０００のＦＰＧＡ１６０は、ネットワーク１２０３を介して、外部ストレージ１２０１からデータを読み出す。外部ストレージ１２０１は、記憶媒体の一例である。外部ストレージ１２０１は、例えば、ＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）グループを有し論理ボリュームを提供するいわゆるディスクアレイ装置でよい。ＦＰＧＡ１６０は、セグメント毎に、外部ストレージ１２０１からデータを読み出すことができる。
【実施例３】
【００８１】
実施例３を説明する。その際、実施例１及び２との相違点を主に説明し、実施例１及び２との共通点については説明を省略又は簡略する。【００８２】
図１１は、実施例３に係る計算機システムの構成を示す。【００８３】
ＤＢ処理ボード１５０（及びボード１５０を含んだストレージパッケージ１９８）に代えて、アクセラレータノード１５００が採用される。アクセラレータノード１５００は、アクセラレータの一例である。アクセラレータとして、ＤＢ処理ボード１５０とアクセラレータノード１５００とが計算機システムに混在してもよい。【００８４】
アクセラレータノード１５００は、計算機でよく、Ｉ／Ｆ１１８０、メモリ１１６０及びそれらに接続されたＣＰＵ１１７０を有する。Ｉ／Ｆ１１８０は、サーバ１００やＳＳＤ１４０と通信するためのインターフェースデバイスである。メモリ１１６０は、プログラムとしてのデータ読出し部１１６１、制御部１１６２、グループ化処理部１１６３及びローカル集約処理部１１６５を格納する。ＣＰＵは、それらの処理部（プログラム）１１６１、１１６２、１１６３及び１１６５を実行する。【００８５】
以上、幾つかの実施例を説明したが、本発明は上述した実施例に限られず、他の様々な態様に適用可能である。例えば、ＦＰＧＡ１６０に代えて、他種のハードウェア回路、例えば、ＦＰＧＡ１６０以外のＰＬＤ（Programmable Logic Device）が採用されてもよいし、ＡＳＩＣ（Application Specific Integrated Circuit）が採用されてもよい。
【符号の説明】
【００８６】
１００…サーバ
【図１】
2018003004.tif 000003
【図２】
2018003004.tif 000004
【図３】
2018003004.tif 000005
【図４】
2018003004.tif 000006
【図５】
2018003004.tif 000007
【図６】
2018003004.tif 000008
【図７】
2018003004.tif 000009
【図８】
2018003004.tif 000010
【図９】
2018003004.tif 000011
【図１０】
2018003004.tif 000012
【図１１】
2018003004.tif 000013
【国際調査報告】
2018003004.tif 000014
2018003004.tif 000015
2018003004.tif 000016
2018003004.tif 000017