(57)【要約】【課題】リソースが使用される期間を短縮可能にすること。【解決手段】記憶部１ａは、クエリＱ１に含まれる複数の処理による処理対象のデータＤ１を記憶する。処理部１ｂは、記憶部１ａに記憶されたデータＤ１に基づいて複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定する。処理部１ｂは、第１の装置２および第２の装置３の両方にクエリＱ１の実行開始を指示する。処理部１ｂは、第１の装置２により実行される監視対象処理の第１の進捗情報を取得し、第２の装置３により実行される監視対象処理の第２の進捗情報を取得する。処理部１ｂは、第１の進捗情報および第２の進捗情報に基づいて、第１の装置２および第２の装置３のうちの１の装置にクエリＱ１の実行停止を指示する。【選択図】図１
2018124658.tif 000002
【特許請求の範囲】
【請求項１】
クエリに含まれる複数の処理による処理対象のデータを記憶する記憶部と、
前記記憶部に記憶された前記データに基づいて前記複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、第１の装置および第２の装置の両方に前記クエリの実行開始を指示し、前記第１の装置により実行される前記監視対象処理の第１の進捗情報を取得し、前記第２の装置により実行される前記監視対象処理の第２の進捗情報を取得し、前記第１の進捗情報および前記第２の進捗情報に基づいて、前記第１の装置および前記第２の装置のうちの１の装置に前記クエリの実行停止を指示する処理部と、
を有する情報処理装置。
【請求項２】
前記処理部は、前記監視対象処理に対して、前記第１の装置および前記第２の装置のうちの前記実行停止を指示した方を識別可能な識別情報を前記記憶部に格納し、前記監視対象処理を含む他のクエリを受け付けると、前記記憶部に記憶された前記識別情報に基づいて、前記第１の装置および前記第２の装置の何れか一方に、前記他のクエリの実行開始を指示する、請求項１記載の情報処理装置。
【請求項３】
前記処理部は、前記複数の処理により用いられる複数のデータセットそれぞれの情報量に基づいて前記複数の処理それぞれの前記処理負荷を決定する、請求項１または２記載の情報処理装置。
【請求項４】
前記処理部は、前記複数のデータセットのうち、最大の情報量であるデータセットに対する処理を第１の監視対象処理と決定し、前記最大の情報量に基づいて第２の監視対象処理を決定する、請求項３記載の情報処理装置。
【請求項５】
前記処理部は、前記クエリに含まれる前記複数の処理それぞれのうち、第１の処理よりも先に実行される第２の処理を前記監視対象処理と決定し、前記第１の処理を前記監視対象処理としない、請求項１乃至４の何れか１項に記載の情報処理装置。
【請求項６】
クエリに含まれる複数の処理による処理対象のデータに基づいて、前記複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、
第１の装置および第２の装置の両方に前記クエリの実行開始を指示し、
前記第１の装置により実行される前記監視対象処理の第１の進捗情報を取得し、前記第２の装置により実行される前記監視対象処理の第２の進捗情報を取得し、
前記第１の進捗情報および前記第２の進捗情報に基づいて、前記第１の装置および前記第２の装置のうちの１の装置に前記クエリの実行停止を指示する、
処理をコンピュータに実行させるプログラム。
【請求項７】
コンピュータが、
クエリに含まれる複数の処理による処理対象のデータに基づいて、前記複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、
第１の装置および第２の装置の両方に前記クエリの実行開始を指示し、
前記第１の装置により実行される前記監視対象処理の第１の進捗情報を取得し、前記第２の装置により実行される前記監視対象処理の第２の進捗情報を取得し、
前記第１の進捗情報および前記第２の進捗情報に基づいて、前記第１の装置および前記第２の装置のうちの１の装置に前記クエリの実行停止を指示する、
情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置、プログラムおよび情報処理方法に関する。
【背景技術】
【０００２】
情報処理の分野では、処理対象となるデータの規模が増している。処理対象のデータが大規模化すると、コンピュータなどによるデータ処理の時間が増す。そこで、データ処理を高速に行う方法が考えられている。
【０００３】
例えば、マルチデータベースシステム（ＭＤＢＳ：Multi DataBase System）において、データ検索における照会応答時間を短縮する方法の提案がある。この提案では、ＭＤＢＳは、複数の地点に存在する複数のデータベースに対する大域的なアクセスを可能にする。ＭＤＢＳは、各地に点在する複数のテーブルに対する複数の結合演算を含む照会ツリーを、各結合演算を並列化できるように変換する。ＭＤＢＳは、変換後のツリーによりデータ照会のうち複数の結合演算を並列に実行することで、照会応答時間を短縮する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平８−３２８９２０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、制御用の装置が、２つの装置それぞれにデータ処理に関するクエリ（処理命令の集合）を実行させ、早く実行を完了した方の実行結果を採用することで、応答時間の短縮を図ることも考えられる。
【０００６】
この場合、一方の装置で実行結果が得られると、他方の装置による処理は余計になる。そこで、実行結果が得られた後に、他方の装置による処理の実行を停止させることが考えられる。しかし、この方法では、一方の装置で実行結果が得られるまで、他方の装置で当該処理のためにリソースが使用され続けるという問題がある。
【０００７】
１つの側面では、本発明は、リソースが使用される期間を短縮可能にすることを目的とする。
【課題を解決するための手段】
【０００８】
１つの態様では、情報処理装置が提供される。情報処理装置は、記憶部と処理部とを有する。記憶部は、クエリに含まれる複数の処理による処理対象のデータを記憶する。処理部は、記憶部に記憶されたデータに基づいて複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、第１の装置および第２の装置の両方にクエリの実行開始を指示し、第１の装置により実行される監視対象処理の第１の進捗情報を取得し、第２の装置により実行される監視対象処理の第２の進捗情報を取得し、第１の進捗情報および第２の進捗情報に基づいて、第１の装置および第２の装置のうちの１の装置にクエリの実行停止を指示する。
【発明の効果】
【０００９】
１つの側面では、リソースが使用される期間を短縮できる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】ＤＢサーバのハードウェア例を示す図である。
【図４】システムの機能例を示す図である。
【図５】ＤＢのテーブル例を示す図である。
【図６】クエリの例を示す図である。
【図７】プランツリーの例を示す図である。
【図８】オフロード選択テーブルの例を示す図である。
【図９】スキャン進捗率の差の例を示す図である。
【図１０】ＤＢサーバの処理の例を示すフローチャートである。
【図１１】クエリ実行制御の例を示すフローチャートである。
【図１２】サブ制御の例を示すフローチャートである。
【図１３】クエリ実行制御の第１の例を示す図である。
【図１４】クエリ実行制御の第２の例を示す図である。
【図１５】クエリ実行制御の第３の例を示す図である。
【図１６】クエリ実行制御の第４の例を示す図である。
【図１７】クエリ実行制御の第５の例を示す図である。
【図１８】クエリ実行制御の第６の例を示す図である。
【図１９】リソース解放のタイミングの例を示す図である。
【図２０】リソース解放のタイミングの比較例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、第１の装置２、第２の装置３、端末装置４および記憶装置５とネットワーク６を介して接続されている。情報処理装置１は、端末装置４によるクエリＱ１の入力を受け付ける。「クエリ」は、データに対する処理内容を示す命令の集合である。このため、クエリは、複数の命令に対応する複数の処理を含むといえる。「クエリ」は、「処理の要求」、「照会の要求」あるいは「問い合わせの要求」などと表すこともできる。
【００１２】
情報処理装置１は、第１の装置２および第２の装置３の両方に、クエリＱ１を実行させる。情報処理装置１は、第１の装置２および第２の装置３のうち、早く実行完了した方の実行結果を採用する。
【００１３】
ここで、例えば、両装置のハードウェア構成やソフトウェア構成の相違は、処理の速さに影響を及ぼし得る。第１の装置２が第１の種類のデータ処理を第２の装置３よりも高速に実行することもあれば、第２の装置３が第２の種類のデータ処理を第１の装置２よりも高速に実行することもある。しかし、あるクエリを両装置の何れの方が高速に実行できるかを事前に判断することは難しい。このため、情報処理装置１は、第１の装置２および第２の装置３の両方にクエリＱ１を実行させた上で、早く実行完了した方から実行結果を取得し、端末装置４に応答する。このような運用において、情報処理装置１は、第１の装置２および第２の装置３によるリソース利用の効率化を図る機能を提供する。情報処理装置１は、記憶部１ａおよび処理部１ｂを有する。
【００１４】
記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部１ｂは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。処理部１ｂはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）も含まれ得る。
【００１５】
記憶部１ａは、クエリＱ１に含まれる複数の処理による処理対象のデータ（処理対象データ）Ｄ１を記憶する。例えば、クエリＱ１は、処理ｐｒｏｃ１，ｐｒｏｃ２，ｐｒｏｃ３，ｐｒｏｃ４，・・・を含む。また、処理対象データＤ１は、データセットｄ１，ｄ２，ｄ３を含む。処理ｐｒｏｃ１は、データセットｄ１に対する処理である。処理ｐｒｏｃ２は、データセットｄ２に対する処理である。処理ｐｒｏｃ３は、データセットｄ３に対する処理である。例えば、処理対象データＤ１は、記憶装置５に記憶されたデータの母集団の一部でもよい。
【００１６】
処理部１ｂは、端末装置４によるクエリＱ１の入力を受け付ける。処理部１ｂは、記憶部１ａに記憶されたデータ（処理対象データＤ１）に基づいて、クエリＱ１に含まれる複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定する。監視対象処理は、１つでもよいし、複数でもよい。また、処理部１ｂは、受け付けたクエリＱ１に基づいて、クエリＱ１に複数の処理により用いられる処理対象データＤ１を特定し、処理対象データＤ１を記憶装置５から取得し、記憶部１ａに格納してもよい。
【００１７】
ここで、「処理負荷」は、該当の処理を実行する装置に与える負荷を意味する。例えば、処理部１ｂは、複数の処理それぞれの演算コストを、複数の処理それぞれの処理負荷とすることが考えられる。処理部１ｂは、処理対象となるデータセットに対する演算のステップ数やステップ数に対応する指標などにより、各処理の演算コストを評価し得る。より具体的には、処理部１ｂは、データセットに含まれるレコード数などの情報量を演算コストとしてもよい。処理対象となる情報量が増すほど、演算コストも増す可能性が高いからである。なお、「レコード」は、データセットに属する情報の単位であり、例えば、データセットがテーブルの場合、テーブルの１行に相当する。
【００１８】
一例では、「所定の負荷」は、レコード数の閾値によって定められる。処理部１ｂは、データセットｄ１，ｄ２，ｄ３それぞれのレコード数を閾値と比較する。ここでは、データセットｄ１のレコード数は、閾値より大きい。データセットｄ２のレコード数は、閾値より大きい。データセットｄ３のレコード数は、閾値より小さい。この場合、処理部１ｂは、データセットｄ１を用いる処理ｐｒｏｃ１、および、データセットｄ２を用いる処理ｐｒｏｃ２を、監視対象処理と決定する。
【００１９】
処理部１ｂは、第１の装置２および第２の装置３の両方にクエリＱ１の実行開始を指示する。例えば、処理部１ｂは、クエリＱ１の実行開始を指示する所定の命令を、第１の装置２および第２の装置３の両方に送信することで、クエリＱ１の実行開始を指示する。
【００２０】
第１の装置２は、実行開始の指示を受け付けると、クエリＱ１の実行を開始する。第２の装置３は、実行開始の指示を受け付けると、クエリＱ１の実行を開始する。クエリＱ１に含まれる複数の処理それぞれは、第１の装置２および第２の装置３それぞれにより個別に実行される。なお、処理部１ｂは、第１の装置２および第２の装置３に、処理対象データＤ１を提供してもよい。
【００２１】
処理部１ｂは、第１の装置２により実行される監視対象処理の第１の進捗情報を取得する。また、処理部１ｂは、第２の装置３により実行される監視対象処理の第２の進捗情報を取得する。ここで、進捗情報は、例えば、監視対象処理の進捗率を示す。一例では、進捗率は、監視対象処理により用いられるデータセットの全レコード数Ｎおよび処理済レコード数ｎに対し、ｎ／Ｎ×１００（％）である。
【００２２】
例えば、処理部１ｂは、監視対象処理の進捗を第１の装置２に問い合わせることで、第１の進捗情報を取得してもよい。あるいは、処理部１ｂは、第１の装置２による監視対象処理の進捗に応じて、監視対象処理で用いられるデータセットに含まれるレコードを、順番に、第１の装置２に提供することも考えられる。この場合、処理部１ｂは、第１の装置２に対するレコードの提供状況から第１の進捗情報を取得してもよい。同様に、処理部１ｂは、第２の装置３へ問い合わせることで第２の進捗情報を取得する。または、処理部１ｂは、第２の装置３に対するレコードの提供状況から第２の進捗情報を取得してもよい。
【００２３】
そして、処理部１ｂは、第１の進捗情報および第２の進捗情報に基づいて、第１の装置２および第２の装置３のうちの１の装置にクエリＱ１の実行停止を指示する。例えば、処理部１ｂは、第１の進捗情報および第２の進捗情報に基づいて、一方の装置で全ての監視対象処理の進捗率が１００％に達したか否かを判定する。処理部１ｂは、一方の装置で全ての監視対象処理の進捗率が１００％に達したと判定すると、他方の装置に対して、クエリＱ１の実行停止を指示する。また、処理部１ｂは、一方の装置で全ての監視対象処理の進捗率が１００％に達していないと判定すると、両方の装置によるクエリＱ１の実行を継続させる。なお、「全ての監視対象処理の進捗率が１００％に達したこと」は、「全ての監視対象処理の実行が完了したこと」ともいえる。また、例えば、処理部１ｂは、クエリＱ１の実行停止を指示する所定の命令を、第１の装置２および第２の装置３のうちの１の装置に送信することで、当該１の装置に、クエリＱ１の実行停止を指示する。
【００２４】
監視対象処理が処理ｐｒｏｃ１，ｐｒｏｃ２の場合の制御例は次の通りである。なお、以下の説明で「時刻」という場合、ある程度（微小な）幅のある時間範囲を表すと考えてもよい。図１下部の制御例では、左側から右側へ向かう方向が時間軸の正方向である。
【００２５】
時刻Ｔ１において、処理部１ｂは、第１の装置２および第２の装置３の両方に、クエリＱ１の実行開始を指示する。時刻Ｔ１以降、処理部１ｂは、監視対象処理ｐｒｏｃ１，ｐｒｏｃ２それぞれについて第１の進捗情報を、定期的に取得する。また、処理部１ｂは、監視対象処理ｐｒｏｃ１，ｐｒｏｃ２それぞれについて第２の進捗情報を、定期的に取得する。例えば、処理部１ｂは、第１の進捗情報および第２の進捗情報を定期的に取得するたびに、第１の進捗情報および第２の進捗情報に基づいて、クエリＱ１の実行に関する停止判定を行う。停止判定の条件は、前述の「一方の装置で全ての監視対象処理が実行完了されたこと」である。
【００２６】
時刻Ｔ２において、処理部１ｂは、第１の装置２による処理ｐｒｏｃ１の第１の進捗情報（ａとする）、および、第１の装置２による処理ｐｒｏｃ２の第１の進捗情報（ｂとする）を取得する。例えば、ａ＝５０％であり、ｂ＝１００％であるとする。また、時刻Ｔ２において、処理部１ｂは、第２の装置３による処理ｐｒｏｃ１の第１の進捗情報（ｃとする）、および、第２の装置３による処理ｐｒｏｃ２の第２の進捗情報（ｄとする）を取得する。例えば、ｃ＝１００％であり、ｄ＝１００％であるとする。
【００２７】
処理部１ｂは、第１の進捗情報（ａ，ｂ）および第２の進捗情報（ｃ，ｄ）に基づいて停止判定を行う。この場合、処理部１ｂは、第２の装置３において、全ての監視対象処理の進捗率が１００％に達したと判定する。このため、処理部１ｂは、クエリＱ１の実行停止を第１の装置２に指示する。
【００２８】
第１の装置２は、クエリＱ１の実行停止の指示を受け付けると、クエリＱ１の実行を停止する。一方、第２の装置３は、クエリＱ１の実行を継続する。
時刻Ｔ３において、第２の装置３は、クエリＱ１の実行を完了する。第２の装置３は、クエリＱ１の実行を完了したことを、処理部１ｂに通知する。処理部１ｂは、第２の装置３からクエリＱ１の実行結果を取得する。処理部１ｂは、クエリＱ１の実行結果を端末装置４に送信する。そして、端末装置４は、クエリＱ１の実行結果を受信する。
【００２９】
ここで、上記の例において、処理部１ｂによる停止判定を行わずに、第１の装置２によるクエリＱ１の実行を継続させることを考える。この場合、第１の装置２によるクエリＱ１の実行が完了する時刻は、時刻Ｔ３よりも後の時刻である可能性が高いと推定される。理由は次の通りである。
【００３０】
クエリＱ１の総実行所要時間に占める各処理の実行所要時間の割合は、処理負荷（演算コスト）の大きな処理ほど、大きいと考えられる。すなわち、上記の例の場合、処理ｐｒｏｃ１，ｐｒｏｃ２それぞれの実行所要時間の割合は、処理ｐｒｏｃ３の実行所要時間の割合に比べて大きい。この関係性は第１の装置２および第２の装置３に対して共通である。このため、処理ｐｒｏｃ１，ｐｒｏｃ２の両方または一方（上記例では処理ｐｒｏｃ１）の実行完了が遅延している第１の装置２では、クエリＱ１の総実行所要時間が、第２の装置３よりも長い可能性が高いと推定される。よって、第１の装置２によるクエリＱ１の実行が完了する時刻は、時刻Ｔ３よりも後の時刻である可能性が高いと推定される。
【００３１】
このような分析結果によれば、時刻Ｔ２以降も第１の装置２によるクエリＱ１の実行を継続することは非効率的である。特に、第２の装置３によるクエリＱ１の実行結果を得られた後に（時刻Ｔ３以後に）、第１の装置２によるクエリＱ１の実行を停止させるのでは遅過ぎる。第１の装置２により、クエリＱ１の処理実行のためにリソースが余計に利用され、第１の装置２を別の処理に活用する機会が減るし、また、第１の装置２による余計なリソース利用により、余計な電力消費も発生するからである。そこで、処理部１ｂは、時刻Ｔ２において第１の装置２によるクエリＱ１の実行を停止させる。
【００３２】
これにより、第１の装置２においてクエリＱ１の処理のためにリソースが利用される期間を短縮できる。図１の例でいえば、第１の装置２によるクエリＱ１の実行を時刻Ｔ３に停止させる場合に比べて、時間差ΔＴ＝Ｔ３−Ｔ２の分だけ、第１の装置２におけるクエリＱ１の処理のためのリソースの利用期間を短縮できることになる。その結果、第１の装置２の空いたリソースを別の処理に活用可能となる。また、クエリＱ１の実行に伴う第１の装置２の電力消費を低減できる。
【００３３】
図１の例では、処理部１ｂにより、第１の装置２によるクエリＱ１の実行を停止させる例を示したが、別のクエリでは、逆に、第２の装置３によるクエリの実行を停止させ、第１の装置２による当該クエリの実行を継続させることもある。この場合、第２の装置３による余計なリソース利用の期間を短縮できることになる。
【００３４】
こうして、第１の装置２および第２の装置３のリソースを効率的に利用可能となる。
なお、処理部１ｂは、クエリＱ１に含まれる複数の処理のうち、初期段階に実行され得る幾つかの処理を抽出し、初期段階に実行され得る幾つかの処理の中から、監視対象処理を決定してもよい。例えば、処理部１ｂは、クエリＱ１の構文から、クエリＱ１に含まれる複数の処理のうち、第１の処理よりも早く実行される第２の処理を特定し、第２の処理を監視対象処理と決定してもよい。より具体的には、クエリＱ１がデータベースに対する問い合わせを記述したＳＱＬ（Structured Query Language）文である場合が考えられる。この場合、処理部１ｂは、クエリＱ１により示される一連の処理の初期に行われる複数のテーブルスキャンを、ＳＱＬ文の構文を基に特定し、複数のテーブルスキャンの中から監視対象処理を特定してもよい。このようにすれば、一方の装置によるクエリＱ１の実行停止を一層早めることができる。
【００３５】
また、記憶部１ａおよび処理部１ｂの機能は、第１の装置２（または第２の装置３）に設けられてもよい。すなわち、第１の装置２（または第２の装置３）が情報処理装置１と同じ機能を有してもよい。情報処理装置１と第１の装置２とが同一の装置であってもよい）。あるいは、情報処理装置１と第２の装置３とが同一の装置であってもよい。また、第１の装置２（または第２の装置３）は、複数の他の装置を用いて、クエリＱ１の処理を分散して実行するものでもよい。
【００３６】
以下では、関係データベース（ＲＤＢ：Relational DataBase）に対する問い合わせを実行するデータベース管理システム（ＤＢＭＳ：DataBase Management System）を例示することで、情報処理装置１の機能を更に具体的に説明する。
【００３７】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムの例を示す図である。第２の実施の形態の情報処理システムは、データベース（ＤＢ：DataBase）サーバ１００、マスタサーバ２００、スレーブサーバ３００，４００，５００およびクライアント６００を含む。ＤＢサーバ１００、クライアント６００は、ネットワーク１０に接続されている。
【００３８】
マスタサーバ２００およびスレーブサーバ３００，４００，５００は、クラスタ２０を形成する。クラスタ２０は、ネットワーク２１を含む。マスタサーバ２００およびスレーブサーバ３００，４００，５００は、ネットワーク２１に接続されている。また、ネットワーク２１は、ネットワーク１０と接続される。ネットワーク１０，２１は、例えば、ＬＡＮ（Local Area Network）である。
【００３９】
ＤＢサーバ１００は、ＤＢＭＳの機能を有するサーバコンピュータである。ＤＢサーバ１００は、ＤＢに対する問い合わせ内容を示すクエリをクライアント６００から受信し、クエリに応じた処理をＤＢに対して実行する。ＤＢサーバ１００は、問い合わせに対する応答として、処理の実行結果を、クライアント６００に応答する。ＤＢサーバ１００は、ストレージ３０に接続されている。ストレージ３０は、ＨＤＤやＳＳＤ（Solid State Drive）などの複数の記憶装置を備え、複数の記憶装置を用いてＤＢを記憶する。ストレージ３０は、ＤＢサーバ１００に（直接またはネットワークを介して）外付けされてもよいし、ＤＢサーバ１００に内蔵されてもよい。
【００４０】
クラスタ２０は、ＤＢサーバ１００とともにＤＢアクセスに利用されるサブシステムである。クラスタ２０のうちマスタサーバ２００は、ＤＢサーバ１００からクエリの実行指示およびクエリに応じた処理対象のデータを受信し、スレーブサーバ３００，４００，５００に処理を割り振る。スレーブサーバ３００，４００，５００は、マスタサーバ２００により割り振られた処理を実行し、実行結果をマスタサーバ２００に送信する。マスタサーバ２００は、スレーブサーバ３００，４００，５００それぞれから実行結果を受信し、複数の実行結果をマージし、マージ後の実行結果を、ＤＢサーバ１００に送信する。
【００４１】
クライアント６００は、ユーザにより利用されるクライアントコンピュータである。クライアント６００は、ユーザによるクエリの入力を受け付け、入力されたクエリをＤＢサーバ１００に送信する。ユーザは、ＳＱＬを用いてクライアント６００にクエリを入力する。クライアント６００は、クエリの実行結果をＤＢサーバ１００から受信し、受信した実行結果をディスプレイにより表示する。
【００４２】
ここで、第２の実施の形態の情報処理システムでは、ＤＢサーバ１００のＤＢアクセス処理をクラスタ２０でも実行可能である。すなわち、ＤＢサーバ１００は、自身の処理を、クラスタ２０にオフロードさせることができる。オフロードにより、ＤＢサーバ１００の負荷を低減可能である。ＤＢサーバ１００は、ＤＢを管理するＤＢＭＳを有するサーバであり、ネイティブと呼ばれることがある。ネイティブのＤＢＭＳ機能を提供するソフトウェアの一例として、ＰｏｓｔｇｒｅＳＱＬが挙げられる（ただし、他のソフトウェアでもよい）。ネイティブ側のＤＢサーバは複数のサーバコンピュータにより構成されてもよい（例えば、ネイティブ側でも複数のＤＢサーバによる負荷分散や可用性向上を図ることもある）。また、クラスタ２０は、オフロード先のサブシステムであり、アクセラレータと呼ばれることがある。アクセラレータ機能を提供するソフトウェアの一例として、Ｓｐａｒｋが挙げられる（ただし、他のソフトウェアでもよい）。
【００４３】
ＤＢサーバ１００は、クエリに対応する処理（クエリ処理と称する）を、クラスタ２０に割り振る（オフロードする）ことで、当該処理の高速化を図れる。しかし、全てのクエリ処理をオフロードすればよいわけではない。例えば、クエリ処理の対象のテーブルのサイズやテーブルに対する処理の種別（例えば、インデックス（索引）スキャンか否かなど）によっては、クラスタ２０よりもＤＢサーバ１００の方が高速に処理を実行できることもある。
【００４４】
具体的には、クラスタ２０では、クエリ処理が比較的大きなサイズのテーブルに対する処理である場合や、インデックススキャンを使用しない場合（シーケンシャルスキャンの場合）に、ＤＢサーバ１００よりも処理を高速に実行できる可能性がある。大量データに対する順次処理を、クラスタ２０の複数のスレーブサーバにより分担して効率的に実行できるからである。他方、ＤＢサーバ１００では、クエリ処理が比較的小さなサイズのテーブルに対する処理である場合や、インデックススキャンを使用する場合に、クラスタ２０よりも処理を高速に実行できる可能性がある。処理対象のデータサイズが比較的小さい場合、クラスタ２０における分散化のための処理のオーバヘッドが本来の処理に比べて大きくなり得るからである。ただし、クラスタ２０により用いられるアルゴリズムはブラックボックスであることが多い。このため、具体的なクエリに対して、ＤＢサーバ１００（ネイティブ）およびクラスタ２０（アクセラレータ）の何れの方が処理を高速に実行できるかを、事前に評価することは難しい。
【００４５】
ＤＢサーバ１００は、ＤＢサーバ１００およびクラスタ２０におけるこのような性質を考慮して、クエリに対する応答性能を高める機能を提供する。
図３は、ＤＢサーバのハードウェア例を示す図である。ＤＢサーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、ＨＢＡ（Host Bus Adapter）１０４、画像信号処理部１０５、入力信号処理部１０６、媒体リーダ１０７および通信インタフェース１０８を有する。各ハードウェアはＤＢサーバ１００のバスに接続されている。
【００４６】
プロセッサ１０１は、ＤＢサーバ１００の情報処理を制御するハードウェアである。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００４７】
ＲＡＭ１０２は、ＤＢサーバ１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４８】
ＨＤＤ１０３は、ＤＢサーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。ＤＢサーバ１００は、フラッシュメモリやＳＳＤなどの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４９】
ＨＢＡ１０４は、ストレージ３０との接続に用いられる接続インタフェースである。ＨＢＡ１０４は、例えば、ファイバチャネル（ＦＣ：Fibre Channel）やＳＡＳ（Serial Attached SCSI、ＳＣＳＩはSmall Computer System Interfaceの略）のインタフェースである。
【００５０】
画像信号処理部１０５は、プロセッサ１０１からの命令に従って、ＤＢサーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１として、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００５１】
入力信号処理部１０６は、ＤＢサーバ１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２として、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００５２】
媒体リーダ１０７は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０７は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５３】
通信インタフェース１０８は、ネットワーク１０を介して他の装置と通信を行う。通信インタフェース１０８は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００５４】
なお、マスタサーバ２００、スレーブサーバ３００，４００，５００およびクライアント６００もＤＢサーバ１００と同様のハードウェアを用いて実現できる。
図４は、システムの機能例を示す図である。ＤＢサーバ１００は、記憶部１１０、通信処理部１２０、進捗監視部１３０、クエリ実行部１４０および連携制御部１５０を有する。
【００５５】
記憶部１１０は、クエリ処理の進捗に関する情報を記憶する。また、記憶部１１０は、オフロードを行うか否かの決定に用いられる情報（オフロード選択テーブル）を記憶する。
【００５６】
通信処理部１２０は、クライアント６００からクエリを受信する。また、通信処理部１２０は、クエリ処理の実行結果を、クライアント６００に送信する。
進捗監視部１３０は、クエリの内容に応じて、クエリに含まれる複数の処理のうち、進捗の監視対象とする監視対象処理を決定する。進捗監視部１３０は、ＤＢサーバ１００による監視対象処理の進捗、および、クラスタ２０による監視対象処理の進捗を監視する。進捗監視部１３０は、ＤＢサーバ１００による監視対象処理の進捗およびクラスタ２０による監視対象処理の進捗の監視に応じて、何れか一方によるクエリ処理を停止するように制御する。具体的には、進捗監視部１３０は、ＤＢサーバ１００およびクラスタ２０のうち監視対象処理を早く実行した一方の実行結果を取得し、他方によるクエリ処理を停止するように制御する。
【００５７】
進捗監視部１３０は、クエリ処理の対象のテーブルのデータを、ストレージ３０に記憶されたＤＢ３１から取得し、クエリ実行部１４０および連携制御部１５０に提供する。また、進捗監視部１３０は、クエリ実行部１４０および連携制御部１５０によるクエリ処理の実行結果を取得し、通信処理部１２０に提供する。
【００５８】
クエリ実行部１４０は、クエリ処理を実行する。クエリ実行部１４０は、ＤＢＭＳにおけるＳＱＬの実行エンジンである。
連携制御部１５０は、クラスタ２０との連携を制御する。連携制御部１５０は、クエリ処理の実行をマスタサーバ２００に依頼する。連携制御部１５０は、クエリ処理対象のテーブルのデータを、マスタサーバ２００に提供する。また、連携制御部１５０は、クエリ処理の実行結果をマスタサーバ２００から取得する。
【００５９】
マスタサーバ２００は、分散制御部２１０を有する。分散制御部２１０は、スレーブサーバ３００，４００，５００を用いたクエリの分散実行を制御する。分散制御部２１０は、連携制御部１５０からクエリ処理の依頼、および、クエリ処理対象のテーブルのデータを受信し、スレーブサーバ３００，４００，５００それぞれにクエリ処理の各部分を割り振る。例えば、分散制御部２１０は、スレーブサーバ３００，４００，５００それぞれにクエリ処理の異なる部分を割り振ることで、クエリ処理を高速化し得る。分散制御部２１０は、スレーブサーバ３００，４００，５００からクエリ処理の実行結果を取得し、マージする。分散制御部２１０は、マージ後の実行結果を連携制御部１５０に応答する。
【００６０】
スレーブサーバ３００は、分散実行部３１０を有する。スレーブサーバ４００は、分散実行部４１０を有する。スレーブサーバ５００は、分散実行部５１０を有する。分散実行部３１０，４１０，５１０は、分散制御部２１０により割り振られたクエリ処理の一部分を実行し、実行結果を分散制御部２１０に応答する。なお、マスタサーバ２００も分散実行部の機能を有してもよい。
【００６１】
ここで、記憶部１１０は、ＲＡＭ１０２またはＨＤＤ１０３に確保された記憶領域として実現される。通信処理部１２０、進捗監視部１３０、クエリ実行部１４０および連携制御部１５０の機能は、プロセッサ１０１がＲＡＭ１０２に記憶されたプログラムを実行することで発揮される。ただし、通信処理部１２０、進捗監視部１３０、クエリ実行部１４０および連携制御部１５０は、ＦＰＧＡやＡＳＩＣなどのハードワイヤードロジックにより実現されてもよい。
【００６２】
更に、分散制御部２１０の機能は、マスタサーバ２００が備えるプロセッサが、マスタサーバ２００が備えるＲＡＭに記憶されたプログラムを実行することで発揮される。分散実行部３１０の機能は、スレーブサーバ３００が備えるプロセッサが、スレーブサーバ３００が備えるＲＡＭに記憶されたプログラムを実行することで発揮される。分散実行部４１０の機能は、スレーブサーバ４００が備えるプロセッサが、スレーブサーバ４００が備えるＲＡＭに記憶されたプログラムを実行することで発揮される。分散実行部５１０の機能は、スレーブサーバ５００が備えるプロセッサが、スレーブサーバ５００が備えるＲＡＭに記憶されたプログラムを実行することで発揮される。
【００６３】
図５は、ＤＢのテーブル例を示す図である。ＤＢ３１は、テーブル３１ａ，３１ｂ，３１ｃ，３１ｄ，・・・を含む。図５では、ＤＢ３１に含まれる複数のテーブルのうち、テーブル３１ａ，３１ｂの内容が例示されている。
【００６４】
テーブル３１ａのテーブル名は、“ｔｂｌ１”である。テーブル３１ａは、ｎａｍｅおよびａｇｅの項目（あるいは属性）を含む。ｎａｍｅの項目には、人物の名前が登録される。ａｇｅの項目には、人物の年齢が登録される。例えば、テーブル３１ａには、ｎａｍｅが“Ａｌｉｃｅ”、ａｇｅが“３１”という行（あるいは、タプル）が登録されている。これは、“Ａｌｉｃｅ”という人物の年齢が“３１”歳であることを示す。なお、１つの行を１つのレコードと称してもよい。
【００６５】
テーブル３１ｂのテーブル名は、“ｔｂｌ２”である。テーブル３１ｂは、ｎａｍｅおよびｓｔａｔｅの項目を含む。ｎａｍｅの項目には、人物の名前が登録される。ｓｔａｔｅの項目には、人物が属する地方の略称が登録される。例えば、テーブル３１ｂには、ｎａｍｅが“Ａｌｉｃｅ”、ｓｔａｔｅが“ＮＹ”という行が登録されている。これは、“Ａｌｉｃｅ”という人物が属する地方の略称が“ＮＹ”（New Yorkの略）であることを示す。
【００６６】
なお、テーブル３１ｃのテーブル名は、“ｔｂｌ３”であるとする。また、テーブル３１ｄのテーブル名は、“ｔｂｌ４”であるとする。
図６は、クエリの例を示す図である。クエリ４０は、ＳＱＬを用いて記述されている。クエリ４０は、複数の処理に対応する複数のコマンドを含む。クエリ４０は、テーブル３１ａ，３１ｂをｎａｍｅで結合し、結合後のテーブルからａｇｅが“４０”以上である行（ｎａｍｅ，ａｇｅ，ｓｔａｔｅの組）を取り出す（選択する）操作である。クエリ４０の例では、進捗監視部１３０は、ＳＱＬの構文により、クエリ４０のプランツリーを生成する。プランツリーは、クエリの実行プランを表す情報である。
【００６７】
図７は、プランツリーの例を示す図である。プランツリー５０は、クエリ４０に対応するプランツリーである。プランツリー５０は、ノード５１，５２，５３，５４を含む。ノード５１，５２それぞれは、ノード５３とエッジで接続される。ノード５３は、ノード５４とエッジで接続される。
【００６８】
ノード５１は、テーブル３１ａに対するａｇｅ“４０”以上である行のスキャンを表す。ここで、「スキャン」は、該当の条件に合致する行（条件がない場合は全部の行）をテーブルから抽出する処理である。ノード５２は、テーブル３１ｂに対するフルスキャン（全行のスキャン）を表す。ノード５３は、ノード５１，５２のスキャン結果に対するｎａｍｅによる結合演算（ＪＯＩＮ）を表す。ノード５４は、結合結果に対するｎａｍｅ，ａｇｅ，ｓｔａｔｅの選択演算（ＳＥＬＥＣＴ）を表す。ノード５１，５２はリーフ、または、葉ノードと呼ばれる。
【００６９】
プランツリー５０によれば、ＤＢサーバ１００またはクラスタ２０によりクエリ４０を実行する場合、まず、テーブル３１ａ，３１ｂのスキャン（ノード５１，５２に相当）が実行される。次に、結合演算（ノード５３に相当）が実行される。その後、選択演算（ノード５４に相当）が実行される。なお、テーブル３１ａ，３１ｂに対して何れの種別（インデックススキャンまたはシーケンシャルスキャン）のスキャンを行うかは、クエリの内容に応じて、クエリ実行部１４０および分散制御部２１０により決定される。同じクエリであれば、クエリ実行部１４０および分散制御部２１０は同じ種別のスキャンを採用する。
【００７０】
ここで、ＤＢに対するクエリ処理において、テーブルスキャンは、結合演算や選択演算に比べて演算コストが大きい傾向にある。例えば、テーブルによっては数万から数千万の行を含み、大量のデータに対するスキャンが行われ得るからである。そこで、進捗監視部１３０は、比較的負荷の大きなテーブルスキャンを、プランツリー５０から特定し、監視対象とする。このとき、進捗監視部１３０は、プランツリー５０に含まれる複数のテーブルスキャンのうち、監視対象とするテーブルスキャンを、スキャン対象のテーブルの情報量に基づいて更に絞り込む。
【００７１】
具体的には、進捗監視部１３０は、クエリによる処理対象である複数のテーブルのうち、サイズが最大のテーブルを基準テーブルとする。進捗監視部１３０は、当該複数のテーブルのうち、次の条件（１）または条件（２）を満たすテーブルを、監視対象テーブルと決定する。ここで、「サイズが最大」とは、「行数が最大」であることを示す。
【００７２】
条件（１）は、「最大行数のテーブル（基準テーブル）であること」である。
条件（２）は、「閾値Ｙ＝（最大行数のテーブルの行数Ｘ）＊（コスト値Ｃ）以上の行数をもつテーブルであること」である。ここで、コスト値Ｃとして、例えば、シーケンシャルスキャンによる演算コストに対するインデックススキャンの演算コストの比を用いることが考えられる。例えば、シーケンシャルスキャンの演算コストを“１．０”としたときのインデックススキャンの演算コストが“０．００５”であれば、コスト値Ｃは、“０．００５”である。
【００７３】
１つの例として、テーブル３１ａが１０００万行であり、テーブル３１ｂが５万行である場合を考える。この場合、プランツリー５０によれば、テーブル３１ａ，３１ｂによるスキャンを含む。このうち、最大行数のテーブルは、テーブル３１ａである。また、最大行数Ｘは１０００万である。したがって、閾値Ｙ＝ＸＣ＝１０００万＊０．００５＝５万である。この場合、テーブル３１ｂの行数は、５万行であるので、閾値Ｙ以上であり、条件（２）を満たす。よって、進捗監視部１３０は、テーブル３１ａ，３１ｂを監視対象テーブルと決定する。
【００７４】
監視対象テーブルに対するテーブルスキャンは、監視対象処理に相当する。すなわち、進捗監視部１３０は、監視対象テーブルを決定することで、監視対象処理を決定しているともいえる。
【００７５】
図８は、オフロード選択テーブルの例を示す図である。オフロード選択テーブル１１１は、記憶部１１０に格納される。オフロード選択テーブル１１１は、使用テーブル、スキャン種別、スキャン進捗率の差およびオフロード選択フラグの項目を含む。
【００７６】
使用テーブルの項目には、過去に実行済のクエリにおける監視対象テーブルのテーブル名が登録される。スキャン種別の項目には、当該監視対象テーブルに対するテーブルスキャンで使用されたスキャン種別が登録される。スキャン種別“ｓｅｑ”は、シーケンシャルスキャンを表す。スキャン種別“ｉｎｄ”は、インデックススキャンを表す。スキャン進捗率の差の項目には、当該監視対象テーブルに対するＤＢサーバ１００のスキャン進捗率と、クラスタ２０のスキャン進捗率との最終的な差が登録される。スキャン進捗率は、スキャン対象のテーブルの全行数のうち、スキャン済の行数の割合（百分率とする）である。スキャン進捗率の差は、“（アクセラレータの進捗率）−（ネイティブの進捗率）”である。したがって、スキャン進捗率の差が正（全て正）の値であれば、アクセラレータ側の方が早く監視対象処理を完了したことになる。一方、スキャン進捗率の差が負（全て負）の値であれば、ネイティブ側の方が早く監視対象処理を完了したことになる。オフロード選択フラグの項目には、次回以降にオフロードを行うか否かを示すフラグが登録される。オフロード選択フラグ“ＴＲＵＥ”は、オフロードを行うことを示す。「オフロードを行う」とは、クラスタ２０に該当のクエリ処理を割り振り、ＤＢサーバ１００では、当該クエリ処理を実行しないことを示す。オフロード選択フラグ“ＦＡＬＳＥ”は、オフロードを行わないことを示す。「オフロードを行わない」とは、クラスタ２０に該当のクエリ処理を割り振らず、ＤＢサーバ１００で当該クエリ処理を実行することを示す。オフロード選択フラグは、該当行の実績において、ＤＢサーバ１００およびクラスタ２０のうち、クエリの実行停止を指示した方を識別可能な識別情報であるといえる。
【００７７】
ここで、使用テーブル、スキャン種別およびスキャン進捗率の差の項目には、複数の値（値の個数は、各項目で同じ）が登録され得る。使用テーブル、スキャン種別およびスキャン進捗率の差の項目に複数の値が登録される場合、複数の値は、順番通りに対応付けられる。
【００７８】
例えば、オフロード選択テーブル１１１には、使用テーブルが“ｔｂｌ１，ｔｂｌ２，ｔｂｌ３”、スキャン種別が“ｓｅｑ，ｉｎｄ，ｓｅｑ”、スキャン進捗率の差が“３０，２０，５０”、オフロード選択フラグが“ＴＲＵＥ”という情報が登録されている。
【００７９】
これは、テーブル名“ｔｂｌ１”（テーブル３１ａ）、“ｔｂｌ２”（テーブル３１ｂ）、“ｔｂｌ３”（テーブル３１ｃ）の３つの監視対象テーブルに対するテーブルスキャンを含むクエリが過去に実行された実績があることを示す。当該実績では、テーブル３１ａに対してシーケンシャルスキャンを実行し、スキャン進捗率の差が“３０”であったことを示す。また、当該実績では、テーブル３１ｂに対してインデックススキャンを実行し、スキャン進捗率の差が“２０”であったことを示す。更に、当該実績では、テーブル３１ｃに対してシーケンシャルスキャンを実行し、スキャン進捗率の差が“５０”であったことを示す。そして、次回以降に、テーブル３１ａに対するシーケンシャルスキャン、テーブル３１ｂに対するインデックススキャン、テーブル３１ｃに対するシーケンシャルスキャンを行うクエリを受け付けた場合に、オフロードを行うことを示す。
【００８０】
また、例えば、オフロード選択テーブル１１１には、使用テーブルが“ｔｂｌ２，ｔｂｌ３”、スキャン種別が“ｉｎｄ，ｉｎｄ”、スキャン進捗率の差が“−３０，−５０”、オフロード選択フラグが“ＦＡＬＳＥ”という情報が登録されている。
【００８１】
これは、テーブル名“ｔｂｌ２”（テーブル３１ｂ）、“ｔｂｌ３”（テーブル３１ｃ）の２つのテーブルに対する監視対象テーブルに対するテーブルスキャンを含むクエリが過去に実行された実績があることを示す。当該実績では、テーブル３１ｂに対してインデックススキャンを実行し、スキャン進捗率の差が“−３０”であったことを示す。また、当該実績では、テーブル３１ｃに対してインデックススキャンを実行し、スキャン進捗率の差が“−５０”であったことを示す。そして、次回以降に、テーブル３１ｂに対するインデックススキャン、テーブル３１ｃに対するインデックススキャンを行うクエリを受け付けた場合に、オフロードを行わないことを示す。
【００８２】
図９は、スキャン進捗率の差の例を示す図である。進捗監視部１３０は、過去に実行された実績のあるクエリに対して、ＤＢサーバ１００（ネイティブ）およびクラスタ２０（アクセラレータ）による最終的な進捗率の差を求める。進捗率の差は、前述のように、“（アクセラレータの進捗率）−（ネイティブの進捗率）”である。したがって、監視対象処理の最終的な進捗率の差が正（監視対象処理が複数の場合、全て正）であれば、アクセラレータによる処理の方が、ネイティブによる処理よりも速いことになる。一方、監視対象処理の最終的な進捗率の差が負（監視対象処理が複数の場合、全て負）であれば、ネイティブによる処理の方が、アクセラレータによる処理よりも速いことになる。
【００８３】
以下では主に、スキャン進捗率の差を、“（アクセラレータの進捗率）−（ネイティブの進捗率）”する例を示すが、“（ネイティブの進捗率）−（アクセラレータの進捗率）”としてもよい。この場合、スキャン進捗率の差の正の値および負の値の解釈が逆転することになる。
【００８４】
次に、ＤＢサーバ１００による処理手順を説明する。
図１０は、ＤＢサーバの処理の例を示すフローチャートである。以下、図１０に示す処理をステップ番号に沿って説明する。
【００８５】
（Ｓ１）通信処理部１２０は、クライアント６００からクエリを受信する。
（Ｓ２）進捗監視部１３０は、通信処理部１２０により受信されたクエリを取得し、クエリ実行制御を行う。処理の詳細は後述される。進捗監視部１３０は、クエリ実行制御により、ＤＢサーバ１００またはクラスタ２０によるクエリの実行結果を取得し、通信処理部１２０に提供する。
【００８６】
（Ｓ３）通信処理部１２０は、クライアント６００にクエリの実行結果を送信する。
図１１は、クエリ実行制御の例を示すフローチャートである。以下、図１１に示す処理をステップ番号に沿って説明する。以下の手順は、図１０のステップＳ２に相当する。
【００８７】
（Ｓ１１）進捗監視部１３０は、クエリのＳＱＬ構文に基づいて、プランツリーを作成し、プランツリーを基にテーブルスキャンで使用されるテーブル（使用テーブル）を特定する。進捗監視部１３０は、ストレージ３０に記憶されたＤＢ３１から使用テーブルを取得する。進捗監視部１３０は、取得した使用テーブルを記憶部１１０に格納する。
【００８８】
（Ｓ１２）進捗監視部１３０は、所定行数以上の使用テーブルを監視対象テーブルと決定する。具体的には、進捗監視部１３０は、前述のように次の条件（１）または条件（２）を満たすテーブルを監視対象テーブルと決定する。条件（１）は、「最大行数のテーブル（基準テーブル）であること」である。条件（２）は、「閾値Ｙ＝（最大行数のテーブルの行数Ｘ）＊（コスト値Ｃ）以上の行数をもつテーブルであること」である。
【００８９】
（Ｓ１３）進捗監視部１３０は、監視対象テーブルのスキャン種別を特定する。監視対象テーブルが複数の場合、進捗監視部１３０は、監視対象テーブル毎にスキャン種別を特定する。スキャン種別は、クエリの内容に応じてクエリ実行部１４０（またはＤＢＭＳの所定の機能）により決定される。進捗監視部１３０は、監視対象テーブルに対して選択されるスキャン種別を、クエリ実行部１４０（またはＤＢＭＳの所定の機能）に問い合わせることで、当該スキャン種別を取得してもよい。
【００９０】
（Ｓ１４）進捗監視部１３０は、記憶部１１０に記憶されたオフロード選択テーブル１１１を参照して、オフロード選択テーブル１１１に今回クエリの処理内容と完全一致するタプル（完全一致タプルと称する）があるか否かを判定する。ここで、処理内容とは、監視対象テーブルおよびスキャン種別である。監視対象テーブルが今回クエリと全て同じで、各監視対象テーブルに対するスキャン種別も今回クエリと全て同じである場合に、オフロード選択テーブル１１１に完全一致タプルがあることになる。オフロード選択テーブル１１１に完全一致タプルがある場合、進捗監視部１３０は、ステップＳ１５に処理を進める。オフロード選択テーブル１１１に完全一致タプルがない場合、進捗監視部１３０は、ステップＳ１６に処理を進める。
【００９１】
（Ｓ１５）進捗監視部１３０は、オフロード選択テーブル１１１の完全一致タプルにおけるオフロード選択フラグに応じた依頼先に、クエリ処理の実行開始を指示する。具体的には、該当のオフロード選択フラグが“ＦＡＬＳＥ”の場合、進捗監視部１３０は、クエリ実行部１４０に、クエリ処理の実行開始を指示する。また、該当のオフロード選択フラグが“ＴＲＵＥ”の場合、進捗監視部１３０は、クエリ処理の実行開始の指示をマスタサーバ２００に送るよう連携制御部１５０に指示する。そして、進捗監視部１３０は、ステップＳ２１に処理を進める。
【００９２】
（Ｓ１６）進捗監視部１３０は、オフロード選択テーブル１１１を参照して、オフロード選択テーブル１１１に今回クエリの処理内容と部分一致するタプル（部分一致タプルと称する）があるか否かを判定する。オフロード選択テーブル１１１の行のうち、使用テーブルが今回クエリの監視対象テーブルと一部分であり、当該使用テーブルに対するスキャン種別も今回クエリの当該一部分に対応する監視対象テーブルに対するスキャン種別と同じである行が、部分一致タプルである。オフロード選択テーブル１１１に部分一致タプルがある場合、進捗監視部１３０は、ステップＳ１７に処理を進める。オフロード選択テーブル１１１に部分一致タプルがない場合、進捗監視部１３０は、ステップＳ１８に処理を進める。なお、部分一致タプルに対応する過去実績の監視対象処理は、今回クエリにおける複数の監視対象処理のうちの第１の部分であるといえる。一方、今回クエリにおける複数の監視対象処理のうちの第１の部分以外の第２の部分は、新規部分であるといえる。
【００９３】
（Ｓ１７）進捗監視部１３０は、クエリ実行制御におけるサブ制御を実行する。サブ制御の詳細は後述される。そして、進捗監視部１３０は、ステップＳ２０に処理を進める。
（Ｓ１８）進捗監視部１３０は、ネイティブ（ＤＢサーバ１００）とアクセラレータ（クラスタ２０）との両方にクエリ処理の実行開始を指示し、両方の進捗情報の取得を開始する。具体的には、進捗監視部１３０は、クエリ処理の実行開始をクエリ実行部１４０に指示する。また、進捗監視部１３０は、クエリ処理の実行開始の指示をマスタサーバ２００に送るよう連携制御部１５０に指示する。また、進捗監視部１３０は、クエリ実行部１４０および連携制御部１５０に、クエリ処理の使用テーブルを提供する。クエリ実行部１４０は、提供された使用テーブルに基づいてクエリ処理を実行する。連携制御部１５０は、クエリ処理の実行開始の指示、および、提供された使用テーブルを、マスタサーバ２００に送信する。
【００９４】
（Ｓ１９）進捗監視部１３０は、ステップＳ１３で特定した全ての監視対象テーブルに対する一方のスキャンが完了すると、クエリ処理の実行停止を他方に指示する。例えば、クエリ実行部１４０の方が、クラスタ２０よりも先に、全ての監視対象テーブルに対するスキャンを完了したとする。この場合、進捗監視部１３０は、クエリ処理の実行停止の指示をマスタサーバ２００に送るよう連携制御部１５０に指示する。連携制御部１５０は、当該指示に応じて、マスタサーバ２００にクエリ処理の実行停止の指示を送信する。また、例えば、クラスタ２０の方が、クエリ実行部１４０よりも先に、全ての監視対象テーブルに対するスキャンを完了したとする。この場合、進捗監視部１３０は、クエリ処理の実行停止を、クエリ実行部１４０に指示する。クエリ実行部１４０は、当該指示に応じて該当のクエリ処理の実行を停止する。
【００９５】
（Ｓ２０）進捗監視部１３０は、オフロード選択テーブル１１１に今回の実績を登録する。具体的には、進捗監視部１３０は、オフロード選択テーブル１１１に、今回のクエリの使用テーブル、スキャン種別を登録する。また、進捗監視部１３０は、ステップＳ１９における両方の最終的なスキャン進捗率（一方での監視対象テーブルに対するスキャン進捗率が全て１００％）を基に、スキャン進捗率の差を計算し、オフロード選択テーブル１１１に登録する。スキャン進捗率の差は、“（アクセラレータの進捗率）−（ネイティブの進捗率）”である。したがって、進捗監視部１３０は、スキャン進捗率の差が全て正の値の場合、オフロード選択テーブル１１１にオフロード選択フラグ“ＴＲＵＥ”を登録する。また、進捗監視部１３０は、スキャン進捗率の差が全て負の値の場合、オフロード選択テーブル１１１にオフロード選択フラグ“ＦＡＬＳＥ”を登録する。
【００９６】
（Ｓ２１）進捗監視部１３０は、クエリ実行部１４０または連携制御部１５０のうち、クエリ処理を実行完了した方からクエリ処理の実行結果を取得し、取得した実行結果を通信処理部１２０に提供する。そして、進捗監視部１３０は、クエリ実行制御の処理を終了する。ここで、連携制御部１５０から取得されるクエリ処理の実行結果は、連携制御部１５０がマスタサーバ２００から取得したクラスタ２０によるクエリ処理の実行結果である。
【００９７】
ここで、ステップＳ１８では、例えば、進捗監視部１３０は、監視対象テーブルに対するテーブルスキャンの進捗をクエリ実行部１４０に問い合わせることで、クエリ実行部１４０によるスキャン進捗率を取得してもよい。また、進捗監視部１３０は、監視対象テーブルに対するテーブルスキャンの進捗を、連携制御部１５０を介して、クラスタ２０に問い合わせることで、クラスタ２０によるスキャン進捗率を取得してもよい。
【００９８】
あるいは、進捗監視部１３０は、クエリ実行部１４０によるテーブルスキャンの進捗に応じて、監視対象テーブルに含まれるレコードを、順番に、クエリ実行部１４０に提供することも考えられる。この場合、進捗監視部１３０は、クエリ実行部１４０に対するレコードの提供状況から、クエリ実行部１４０によるスキャン進捗率を取得してもよい。また、進捗監視部１３０は、クラスタ２０によるテーブルスキャンの進捗に応じて、監視対象テーブルに含まれるレコードを、順番に、連携制御部１５０を介してクラスタ２０に提供することも考えられる。この場合、進捗監視部１３０は、クラスタ２０に対するレコードの提供状況から、クラスタ２０によるスキャン進捗率を取得してもよい。
【００９９】
図１２は、サブ制御の例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。以下の手順は、図１１のステップＳ１７に相当する。
（Ｓ３１）進捗監視部１３０は、ネイティブ（ＤＢサーバ１００）とアクセラレータ（クラスタ２０）との両方にクエリ処理の実行開始を指示する。具体的には、進捗監視部１３０は、クエリ処理の実行開始をクエリ実行部１４０に指示する。また、進捗監視部１３０は、クエリ処理の実行開始の指示をマスタサーバ２００に送るよう連携制御部１５０に指示する。また、進捗監視部１３０は、クエリ実行部１４０および連携制御部１５０に、クエリ処理の使用テーブルを提供する。クエリ実行部１４０は、提供された使用テーブルに基づいてクエリ処理を実行する。連携制御部１５０は、クエリ処理の実行開始の指示、および、提供された使用テーブルを、マスタサーバ２００に送信する。
【０１００】
（Ｓ３２）進捗監視部１３０は、複数の監視対象テーブルに対するテーブルスキャンを、過去の実績に対する部分一致部分と、新規部分との２つに分けて監視し、各監視対象テーブルに対するスキャン進捗率の取得を開始する。
【０１０１】
（Ｓ３３）進捗監視部１３０は、ネイティブおよびアクセラレータの両方で部分一致部分のスキャン進捗率が新規部分よりも先に１００％に到達したか否かを判定する。ネイティブおよびアクセラレータの両方で部分一致部分のスキャン進捗率が新規部分よりも先に１００％に到達した場合、進捗監視部１３０は、ステップＳ３４に処理を進める。ネイティブおよびアクセラレータの両方で部分一致部分のスキャン進捗率が新規部分よりも先に１００％に到達していない場合、進捗監視部１３０は、ステップＳ３５に処理を進める。
【０１０２】
なお、部分一致部分および新規部分の両方または何れかが複数の監視対象テーブルに対するテーブルスキャン（監視対象処理）を含むこともある。例えば、部分一致部分が複数の監視対象テーブルに対する複数のテーブルスキャンを含む場合、進捗監視部１３０は、当該複数のテーブルスキャンの全てのスキャン進捗率が１００％になったとき、部分一致部分のスキャン進捗率が１００％になったとみなす。新規部分についても同様である。
【０１０３】
（Ｓ３４）進捗監視部１３０は、ネイティブおよびアクセラレータのうち、新規部分のスキャン進捗率の低い方に、クエリ処理の実行停止を指示する。考慮すべきスキャン進捗率が複数の場合、進捗監視部１３０は、スキャン進捗率の平均値の低い方にクエリの処理の実行停止を指示してもよい。例えば、クラスタ２０の方が新規部分のスキャン進捗率が低い場合、進捗監視部１３０は、クエリ処理の実行停止の指示をマスタサーバ２００に送るよう連携制御部１５０に指示する。連携制御部１５０は、当該指示に応じて、マスタサーバ２００にクエリ処理の実行停止の指示を送信する。また、例えば、クエリ実行部１４０の方が新規部分のスキャン進捗率が低い場合、進捗監視部１３０は、クエリ処理の実行停止をクエリ実行部１４０に指示する。クエリ実行部１４０は、当該指示に応じて、該当のクエリ処理の実行を停止する。そして、進捗監視部１３０は、処理を終了する。
【０１０４】
（Ｓ３５）進捗監視部１３０は、ネイティブおよびアクセラレータの少なくとも一方で新規部分のスキャン進捗率が部分一致部分よりも先に１００％に到達したか否かを判定する。ネイティブおよびアクセラレータの少なくとも一方で新規部分のスキャン進捗率が部分一致部分よりも先に１００％に到達した場合、進捗監視部１３０は、ステップＳ３６に処理を進める。ネイティブおよびアクセラレータの少なくとも一方で新規部分のスキャン進捗率が部分一致部分よりも先に１００％に到達していない場合、進捗監視部１３０は、ステップＳ３３に処理を進める（スキャン進捗率の監視を継続する）。
【０１０５】
なお、部分一致部分および新規部分の両方または何れかが複数の監視対象テーブルに対するテーブルスキャン（監視対象処理）を含むこともある。例えば、部分一致部分が複数の監視対象テーブルに対する複数のテーブルスキャンを含む場合、進捗監視部１３０は、当該複数のテーブルスキャンの全てのスキャン進捗率が１００％になったとき、部分一致部分のスキャン進捗率が１００％になったとみなす。新規部分についても同様である。
【０１０６】
（Ｓ３６）進捗監視部１３０は、現スキャン進捗率の差の絶対値が、記憶部１１０に記憶されたオフロード選択テーブル１１１の部分一致タプルにおけるスキャン進捗率の差の絶対値以上であるか否かを判定する。現スキャン進捗率の差の絶対値が、部分一致タプルにおけるスキャン進捗率の差の絶対値以上の場合、進捗監視部１３０は、ステップＳ３７に処理を進める。現スキャン進捗率の差の絶対値が、部分一致タプルにおけるスキャン進捗率の差の絶対値以上でない場合、進捗監視部１３０は、ステップＳ３３に処理を進める（スキャン進捗率の監視を継続する）。ここで、部分一致タプルが複数の場合、進捗監視部１３０は一致する監視対象テーブルの数が最大の部分一致タプルを選択する。
【０１０７】
なお、考慮すべきスキャン進捗率の差が複数の場合もある。この場合、進捗監視部１３０は、全ての現スキャン進捗率の差の絶対値が、対応する部分一致タプルのスキャン進捗率の差の絶対値以上である場合に、ステップＳ３６  Ｙｅｓであり、そうでない場合に、ステップＳ３６  Ｎｏとする。
【０１０８】
更に、進捗監視部１３０は、現スキャン進捗率の差の符号（正または負）と、部分一致タプルにおけるスキャン進捗率の差の符号（正または負）との一致を確認してもよい。進捗監視部１３０は、符号が一致する場合に、両方の差の絶対値を比較し、符号が一致しない場合に、ステップＳ３３に処理を進めてもよい。
【０１０９】
（Ｓ３７）進捗監視部１３０は、新規部分のスキャン進捗率が１００％に到達した依頼先は、部分一致タプルのオフロード選択フラグにより特定される実行継続先（過去の実績でクエリ処理を停止させなかった方）と一致するか否かを判定する。一致する場合、進捗監視部１３０は、ステップＳ３８に処理を進める。一致しない場合、進捗監視部１３０は、ステップＳ３３に処理を進める（スキャン進捗率の監視を継続する）。
【０１１０】
（Ｓ３８）進捗監視部１３０は、部分一致部分のスキャン進捗率の低い方にクエリ処理の実行停止を指示する。考慮すべきスキャン進捗率が複数の場合、進捗監視部１３０は、スキャン進捗率の平均値の低い方にクエリの処理の実行停止を指示してもよい。ここでは、ステップＳ３７で特定される実行継続先とは異なる方に実行停止の指示が行われることが期待される。例えば、クラスタ２０によるクエリ処理の実行停止を指示する場合、進捗監視部１３０は、クエリ処理の実行停止の指示をマスタサーバ２００に送るよう連携制御部１５０に指示する。連携制御部１５０は、当該指示に応じて、マスタサーバ２００にクエリ処理の実行停止の指示を送信する。また、クエリ実行部１４０によるクエリ処理を停止させる場合、進捗監視部１３０は、該当のクエリ処理の実行停止をクエリ実行部１４０に指示する。クエリ実行部１４０は、当該指示に応じて、該当のクエリ処理の実行を停止する。そして、進捗監視部１３０は、サブ制御の処理を終了する。
【０１１１】
ここで、ステップＳ３６，Ｓ３７の判定は、部分一致部分における現テーブルスキャンのスキャン進捗率に対して過去の実績を流用できることを確認する処理であるといえる。すなわち、ネイティブおよびアクセラレータの両方で新規部分に対応する監視対象処理が完了している場合、部分一致部分に対応する監視対象処理に対する過去の実績を基にネイティブおよびアクセラレータの何れか一方のクエリ実行を停止させることが考えられる。
【０１１２】
このとき、過去の実績においてクエリ実行を停止させなかった方（部分一致タプルのオフロード選択フラグにより特定可能）で今回の新規部分に対する監視対象処理が完了している場合、部分一致タプルで示される結果を今回のクエリ処理に流用できる可能性がある。今回クエリで未完了である部分一致部分に対応する監視対象処理については、過去の実績においてオフロード選択フラグにより特定されるクエリ実行を停止させなかった実行主体側（実行継続先）の方が、他方よりも早く実行完了できると推定されるからである。
【０１１３】
したがって、この場合、進捗監視部１３０は、部分一致部分に対するスキャン進捗率の差の絶対値よりも、当該部分一致部分に対する現スキャン進捗率の差の絶対値の方が大きい場合に、部分一致部分のスキャン進捗率の低い方にクエリ処理の実行停止を指示する。今回の進捗率の差の幅が過去の実績以上であれば、部分一致タプルの実績を適用してもよいと考えられるからである。
【０１１４】
このとき、ステップＳ３８の「部分一致部分のスキャン進捗率の低い方」は、部分一致タプルのオフロード選択フラグで示される過去の実績でクエリ実行を停止させた方（本例において、オフロード選択フラグ“ＦＡＬＳＥ”ならネイティブ、同“ＴＲＵＥ”ならアクセラレータ）に一致することが期待される。また、ステップＳ３６で例示したように、ステップＳ３６でスキャン進捗率の差の符号の一致も確認していると、「部分一致部分のスキャン進捗率の低い方」は部分一致タプルのオフロード選択フラグで示される過去の実績でクエリ実行を停止させた方に一致する。
【０１１５】
なお、ステップＳ３６，３７の実行順は逆でもよい。
次に、以上の手順によるＤＢサーバ１００によるクエリ実行制御の具体例を説明する。
図１３は、クエリ実行制御の第１の例を示す図である。図１３の左側から右側へ向かう方向が時間軸の正方向である（以降の図でも同様である）。
【０１１６】
時刻Ｔ１１において、ＤＢサーバ１００は、クライアント６００によるクエリの入力を受け付ける。該当のクエリの内容に対応する実績は、オフロード選択テーブル１１１に未だ記録されていないものとする。ＤＢサーバ１００は、クエリからプランツリーを作成し、監視対象テーブルを決定する。ここでは、監視対象テーブルは、テーブル３１ａ，３１ｂであるとする。ＤＢサーバ１００は、ＤＢサーバ１００のクエリ実行部１４０（ネイティブのＤＢＭＳ）およびクラスタ２０（アクセラレータ）の両方に、受け付けたクエリの実行開始を指示する。クエリ実行部１４０は、実行開始の指示を受け付けるとクエリの実行を開始する。クラスタ２０は、実行開始の指示を受け付けるとクエリの実行を開始する。ＤＢサーバ１００は、クエリ実行部１４０およびクラスタ２０それぞれによるテーブル３１ａ，３１ｂのテーブルスキャンの進捗の監視を開始する。
【０１１７】
時刻Ｔ１２において、ＤＢサーバ１００は、クエリ実行部１４０について、テーブル３１ａのスキャン進捗率６０％であり、テーブル３１ｂのスキャン進捗率１００％を検出する。また、ＤＢサーバ１００は、クラスタ２０についてテーブル３１ａのスキャン進捗率１００％、テーブル３１ｂのスキャン進捗率１００％を検出する。このため、ＤＢサーバ１００は、クエリ実行部１４０に、該当のクエリの実行停止を指示する。クエリ実行部１４０は、該当のクエリの実行を停止する。クラスタ２０は、該当のクエリの実行を継続する。
【０１１８】
時刻Ｔ１３において、クラスタ２０は、クエリの実行を完了する。ＤＢサーバ１００は、クラスタ２０からクエリの実行結果を取得し、クライアント６００に送信する。
このように、ＤＢサーバ１００は、ＤＢサーバ１００におけるクエリ処理を、時刻Ｔ１２で停止させることができる。その結果、時刻Ｔ１２の段階で、ＤＢサーバ１００における当該クエリ処理のためのリソースを解放させることができる。
【０１１９】
図１４は、クエリ実行制御の第２の例を示す図である。図１４の例では、ＤＢサーバ１００に入力されるクエリの内容は、テーブル３１ａ（テーブル名“ｔｂｌ１”）に対するシーケンシャルスキャン、および、テーブル３１ｃ（テーブル名“ｔｂｌ３”）に対するシーケンシャルスキャンを含むとする。監視対象テーブルは、テーブル３１ａ，３１ｃであるとする。
【０１２０】
更に、テーブル３１ａに対するシーケンシャルスキャンおよびテーブル３１ｃに対するシーケンシャルスキャンを行ったクエリの過去の実績（入力されるクエリに対する完全一致タプル）が、オフロード選択テーブル１１１に登録されているものとする。例えば、ＤＢサーバ１００は次の制御を行う。
【０１２１】
時刻Ｔ２１において、ＤＢサーバ１００は、クライアント６００によるクエリの入力を受け付ける。ＤＢサーバ１００は、当該クエリがテーブル３１ａ，３１ｃそれぞれに対するシーケンシャルスキャンを含むことを特定する。また、ＤＢサーバ１００は、当該クエリにおける監視対象テーブルをテーブル３１ａ，３１ｃと決定する。ＤＢサーバ１００は、オフロード選択テーブル１１１を参照して、テーブル３１ａに対するシーケンシャルスキャン、および、テーブル３１ｃに対するシーケンシャルスキャンを行ったクエリの実績に対応する行を特定する。特定された行は、入力されたクエリの内容に対する完全一致タプルである。そして、ＤＢサーバ１００は、特定された行に設定されたオフロード選択フラグが“ＴＲＵＥ”であることを特定する。
【０１２２】
このため、ＤＢサーバ１００は、今回受け付けたクエリの実行開始をクラスタ２０に指示する。また、ＤＢサーバ１００は、当該クエリの実行開始をＤＢサーバ１００に指示しない。したがって、ＤＢサーバ１００では当該クエリを最初から実行しないことになる。
【０１２３】
時刻Ｔ２２において、クラスタ２０は、クエリの実行を完了する。ＤＢサーバ１００は、クラスタ２０からクエリの実行結果を取得し、クライアント６００に送信する。
このように、ＤＢサーバ１００は、過去の実績を基に、ＤＢサーバ１００またはクラスタ２０の一方に対してクエリの実行開始の指示を行わないよう制御することもできる。これにより、ＤＢサーバ１００による余計な処理の実行を抑えられる。その結果、当該処理によりＤＢサーバ１００で余計なリソースが使用されることを抑えられる。
【０１２４】
図１５は、クエリ実行制御の第３の例を示す図である。図１５の例では、ＤＢサーバ１００に入力されるクエリの内容は、テーブル３１ｂ（テーブル名“ｔｂｌ２”）に対するインデックススキャン、テーブル３１ｃ（テーブル名“ｔｂｌ３”）に対するインデックススキャン、および、テーブル３１ｄ（テーブル名“ｔｂｌ４”）に対するシーケンシャルスキャンを含むとする。監視対象テーブルは、テーブル３１ｂ，３１ｃ，３１ｄであるとする。
【０１２５】
また、テーブル３１ｂ，３１ｃそれぞれに対するインデックスキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを行ったクエリの過去の実績（入力されるクエリの内容に対する完全一致タプル）が、オフロード選択テーブル１１１に登録されていないものとする。更に、テーブル３１ｂに対するインデックススキャンおよびテーブル３１ｃに対するインデックススキャンを行ったクエリの過去の実績（入力されたクエリの内容に対する部分一致タプル）が、オフロード選択テーブル１１１に登録されているものとする。例えば、ＤＢサーバ１００は次の制御を行う。
【０１２６】
時刻Ｔ３１において、ＤＢサーバ１００は、クライアント６００によるクエリの入力を受け付ける。ＤＢサーバ１００は、当該クエリがテーブル３１ｂ，３１ｃそれぞれに対するインデックススキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを含むことを特定する。また、ＤＢサーバ１００は、当該クエリにおける監視対象テーブルをテーブル３１ｂ，３１ｃ，３１ｄと決定する。ＤＢサーバ１００は、オフロード選択テーブル１１１を参照して、テーブル３１ｂ，３１ｃそれぞれに対するシーケンシャルスキャンを行ったクエリの実績に対応する行を特定する。特定された行は、入力されたクエリの内容に対する部分一致タプルである。
【０１２７】
ＤＢサーバ１００は、ＤＢサーバ１００のクエリ実行部１４０およびクラスタ２０の両方に、受け付けたクエリの実行開始を指示する。クエリ実行部１４０は、実行開始の指示を受け付けるとクエリの実行を開始する。クラスタ２０は、実行開始の指示を受け付けるとクエリの実行を開始する。ＤＢサーバ１００は、クエリ実行部１４０およびクラスタ２０それぞれによるテーブル３１ａ，３１ｂのテーブルスキャンの進捗の監視を開始する。この場合、ＤＢサーバ１００は、複数の監視対象テーブルのうち、部分一致部分（テーブル３１ｂ，３１ｃ）と、新規部分（テーブル３１ｄ）とに対するテーブルスキャンを分けて監視する。
【０１２８】
時刻Ｔ３２において、ＤＢサーバ１００は、クエリ実行部１４０について、テーブル３１ｂのスキャン進捗率１００％、テーブル３１ｃのスキャン進捗率１００％、および、テーブル３１ｄのスキャン進捗率８０％を検出する。また、ＤＢサーバ１００は、クラスタ２０について、テーブル３１ｂのスキャン進捗率１００％、テーブル３１ｃのスキャン進捗率１００％、および、テーブル３１ｄのスキャン進捗率９０％を検出する。
【０１２９】
この場合、複数の監視対象テーブルのうち、部分一致部分（テーブル３１ｂ，３１ｃ）に対するスキャン進捗率がクエリ実行部１４０およびクラスタ２０の両方で全て１００％である。このため、ＤＢサーバ１００は、複数の監視対象テーブルのうちの新規部分（テーブル３１ｄ）のスキャン進捗率が低い方に、クエリの実行停止を指示する。この例では、クエリ実行部１４０によるテーブル３１ｄのスキャン進捗率の方が、クラスタ２０によるテーブル３１ｄのスキャン進捗率よりも低い。したがって、ＤＢサーバ１００は、クエリ実行部１４０に、当該クエリの実行停止を指示する。クエリ実行部１４０は、実行停止の指示を受け付けると、当該クエリの実行を停止する。
【０１３０】
時刻Ｔ３３において、クラスタ２０は、クエリの実行を完了する。ＤＢサーバ１００は、クラスタ２０からクエリの実行結果を取得し、クライアント６００に送信する。
このように、ＤＢサーバ１００は、ＤＢサーバ１００におけるクエリ処理を、時刻Ｔ３２で停止させることができる。その結果、時刻Ｔ３２の段階で、ＤＢサーバ１００における当該クエリ処理のためのリソースを解放させることができる。特に、過去の実績を用いることで、図１３の場合に比べて、複数の監視対象テーブルの全てのスキャン進捗率が１００％に到達する前に、ネイティブまたはアクセラレータのうちの一方のクエリの実行を停止させることができる。その結果、リソースの解放を一層早めることができる。
【０１３１】
図１６は、クエリ実行制御の第４の例を示す図である。図１６の例では、ＤＢサーバ１００に入力されるクエリの内容は、テーブル３１ｂ（テーブル名“ｔｂｌ２”）に対するインデックススキャン、テーブル３１ｃ（テーブル名“ｔｂｌ３”）に対するインデックススキャン、および、テーブル３１ｄ（テーブル名“ｔｂｌ４”）に対するシーケンシャルスキャンを含むとする。監視対象テーブルは、テーブル３１ｂ，３１ｃ，３１ｄであるとする。
【０１３２】
また、テーブル３１ｂ，３１ｃそれぞれに対するインデックスキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを行ったクエリの過去の実績（入力されるクエリの内容に対する完全一致タプル）が、オフロード選択テーブル１１１に登録されていないものとする。更に、テーブル３１ｂに対するインデックススキャンおよびテーブル３１ｃに対するインデックススキャンを行ったクエリの過去の実績（入力されたクエリの内容に対する部分一致タプル）が、オフロード選択テーブル１１１に登録されているものとする。例えば、ＤＢサーバ１００は次の制御を行う。
【０１３３】
時刻Ｔ４１において、ＤＢサーバ１００は、クライアント６００によるクエリの入力を受け付ける。ＤＢサーバ１００は、当該クエリがテーブル３１ｂ，３１ｃそれぞれに対するインデックススキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを含むことを特定する。また、ＤＢサーバ１００は、当該クエリにおける監視対象テーブルをテーブル３１ｂ，３１ｃ，３１ｄと決定する。ＤＢサーバ１００は、オフロード選択テーブル１１１を参照して、テーブル３１ｂ，３１ｃそれぞれに対するシーケンシャルスキャンを行ったクエリの実績に対応する行を特定する。特定された行は、入力されたクエリの内容に対する部分一致タプルである。
【０１３４】
ＤＢサーバ１００は、ＤＢサーバ１００のクエリ実行部１４０およびクラスタ２０の両方に、受け付けたクエリの実行開始を指示する。クエリ実行部１４０は、実行開始の指示を受け付けるとクエリの実行を開始する。クラスタ２０は、実行開始の指示を受け付けるとクエリの実行を開始する。ＤＢサーバ１００は、クエリ実行部１４０およびクラスタ２０それぞれによるテーブル３１ａ，３１ｂのテーブルスキャンの進捗の監視を開始する。この場合、ＤＢサーバ１００は、複数の監視対象テーブルのうち、部分一致部分（テーブル３１ｂ，３１ｃ）と、新規部分（テーブル３１ｄ）とに対するテーブルスキャンを分けて監視する。
【０１３５】
時刻Ｔ４２において、ＤＢサーバ１００は、クエリ実行部１４０について、テーブル３１ｂのスキャン進捗率９０％、テーブル３１ｃのスキャン進捗率７０％、および、テーブル３１ｄのスキャン進捗率１００％を検出する。また、ＤＢサーバ１００は、クラスタ２０について、テーブル３１ｂのスキャン進捗率３０％、テーブル３１ｃのスキャン進捗率２０％、および、テーブル３１ｄのスキャン進捗率１００％を検出する。
【０１３６】
この場合、複数の監視対象テーブルのうち、新規部分（テーブル３１ｄ）に対するスキャン進捗率がクエリ実行部１４０およびクラスタ２０の両方で１００％である。このため、ＤＢサーバ１００は、複数の監視対象テーブルのうちの部分一致部分（テーブル３１ｂ，３１ｃ）の現スキャン進捗率の差の絶対値を、オフロード選択テーブル１１１の部分一致タプルに登録されたスキャン進捗率の差の絶対値と比較する。
【０１３７】
テーブル３１ｂについて、現スキャン進捗率の差は、３０％−９０％＝−６０％である。したがって、テーブル３１ｂについて、現スキャン進捗率の差の絶対値は６０％である。テーブル３１ｃについて、現スキャン進捗率の差は、２０％−７０％＝−５０％である。したがって、テーブル３１ｃについて、現スキャン進捗率の差の絶対値は５０％である。
【０１３８】
一方、オフロード選択テーブル１１１の部分一致タプルに含まれるテーブル３１ｂのスキャン進捗率の差の絶対値は３０％である。また、当該部分一致タプルに含まれるテーブル３１ｃのスキャン進捗率の差の絶対値は５０％である。
【０１３９】
この場合、テーブル３１ｂについて、現スキャン進捗率の差の絶対値（６０％）≧部分一致タプルにおけるスキャン進捗率の差の絶対値（３０％）を満たす。また、テーブル３１ｃについて、現スキャン進捗率の差の絶対値（５０％）≧部分一致タプルにおけるスキャン進捗率の差の絶対値（５０％）を満たす。よって、ＤＢサーバ１００は、部分一致部分（テーブル３１ｂ，３１ｃ）の現スキャン進捗率の差の絶対値が、部分一致タプルに登録されたスキャン進捗率の差の絶対値以上であると判定する。
【０１４０】
更に、新規部分（テーブル３１ｄ）のスキャン進捗率が１００％に達した依頼先は、部分一致タプルにおけるオフロード選択フラグ“ＦＡＬＳＥ”により特定される実行継続先であるクエリ実行部１４０（ＤＢサーバ１００）に一致している。このため、ＤＢサーバ１００は、複数の監視対象テーブルのうちの部分一致部分（テーブル３１ｂ，３１ｃ）のスキャン進捗率が低い方に、クエリの実行停止を指示する。この例では、クラスタ２０によるテーブル３１ｂ，３１ｃのスキャン進捗率の方が、クエリ実行部１４０によるテーブル３１ｂ，３１ｃのスキャン進捗率よりも低い（例えば、前述のように、スキャン進捗率の平均値で比較してもよい）。したがって、ＤＢサーバ１００は、クラスタ２０に、当該クエリの実行停止を指示する。クラスタ２０は、実行停止の指示を受け付けると、当該クエリの実行を停止する。ここでは、未完了の監視対象処理に関する過去の実績から、オフロード選択フラグ“ＦＡＬＳＥ”により特定される実行継続先であるクエリ実行部１４０とは異なる方（クラスタ２０）に対して、実行停止の指示が行われることが期待される。
【０１４１】
時刻Ｔ４３において、クエリ実行部１４０は、クエリの実行を完了する。ＤＢサーバ１００は、クエリ実行部１４０からクエリの実行結果を取得し、クライアント６００に送信する。
【０１４２】
このように、ＤＢサーバ１００は、クラスタ２０におけるクエリ処理を、時刻Ｔ４２で停止させることができる。その結果、時刻Ｔ４２の段階で、クラスタ２０における当該クエリ処理のためのリソースを解放させることができる。特に、過去の実績を用いることで、図１３の場合に比べて、複数の監視対象テーブルの全てのスキャン進捗率が１００％に到達する前に、ネイティブまたはアクセラレータのうちの一方のクエリの実行を停止させることができる。その結果、リソースの解放を一層早めることができる。
【０１４３】
図１７は、クエリ実行制御の第５の例を示す図である。図１７の例では、ＤＢサーバ１００に入力されるクエリの内容は、テーブル３１ｂ（テーブル名“ｔｂｌ２”）に対するインデックススキャン、テーブル３１ｃ（テーブル名“ｔｂｌ３”）に対するインデックススキャン、および、テーブル３１ｄ（テーブル名“ｔｂｌ４”）に対するシーケンシャルスキャンを含むとする。監視対象テーブルは、テーブル３１ｂ，３１ｃ，３１ｄであるとする。
【０１４４】
また、テーブル３１ｂ，３１ｃそれぞれに対するインデックスキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを行ったクエリの過去の実績（入力されるクエリの内容に対する完全一致タプル）が、オフロード選択テーブル１１１に登録されていないものとする。更に、テーブル３１ｂに対するインデックススキャンおよびテーブル３１ｃに対するインデックススキャンを行ったクエリの過去の実績（入力されたクエリの内容に対する部分一致タプル）が、オフロード選択テーブル１１１に登録されているものとする。例えば、ＤＢサーバ１００は次の制御を行う。
【０１４５】
時刻Ｔ５１において、ＤＢサーバ１００は、クライアント６００によるクエリの入力を受け付ける。ＤＢサーバ１００は、当該クエリがテーブル３１ｂ，３１ｃそれぞれに対するインデックススキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを含むことを特定する。また、ＤＢサーバ１００は、当該クエリにおける監視対象テーブルをテーブル３１ｂ，３１ｃ，３１ｄと決定する。ＤＢサーバ１００は、オフロード選択テーブル１１１を参照して、テーブル３１ｂ，３１ｃそれぞれに対するシーケンシャルスキャンを行ったクエリの実績に対応する行を特定する。特定された行は、入力されたクエリの内容に対する部分一致タプルである。
【０１４６】
ＤＢサーバ１００は、ＤＢサーバ１００のクエリ実行部１４０およびクラスタ２０の両方に、受け付けたクエリの実行開始を指示する。クエリ実行部１４０は、実行開始の指示を受け付けるとクエリの実行を開始する。クラスタ２０は、実行開始の指示を受け付けるとクエリの実行を開始する。ＤＢサーバ１００は、クエリ実行部１４０およびクラスタ２０それぞれによるテーブル３１ａ，３１ｂのテーブルスキャンの進捗の監視を開始する。この場合、ＤＢサーバ１００は、複数の監視対象テーブルのうち、部分一致部分（テーブル３１ｂ，３１ｃ）と、新規部分（テーブル３１ｄ）とに対するテーブルスキャンを分けて監視する。
【０１４７】
時刻Ｔ５２において、ＤＢサーバ１００は、クエリ実行部１４０について、テーブル３１ｂのスキャン進捗率９０％、テーブル３１ｃのスキャン進捗率７０％、および、テーブル３１ｄのスキャン進捗率１００％を検出する。また、ＤＢサーバ１００は、クラスタ２０について、テーブル３１ｂのスキャン進捗率３０％、テーブル３１ｃのスキャン進捗率２０％、および、テーブル３１ｄのスキャン進捗率４０％を検出する。
【０１４８】
この場合、複数の監視対象テーブルのうち、新規部分（テーブル３１ｄ）に対するスキャン進捗率がクエリ実行部１４０で１００％である。このため、ＤＢサーバ１００は、複数の監視対象テーブルのうちの部分一致部分（テーブル３１ｂ，３１ｃ）の現スキャン進捗率の差の絶対値を、オフロード選択テーブル１１１の部分一致タプルに登録されたスキャン進捗率の差の絶対値と比較する。
【０１４９】
テーブル３１ｂについて、現スキャン進捗率の差は、３０％−９０％＝−６０％である。したがって、テーブル３１ｂについて、現スキャン進捗率の差の絶対値は６０％である。テーブル３１ｃについて、現スキャン進捗率の差は、２０％−７０％＝−５０％である。したがって、テーブル３１ｃについて、現スキャン進捗率の差の絶対値は５０％である。
【０１５０】
一方、オフロード選択テーブル１１１の部分一致タプルに含まれるテーブル３１ｂのスキャン進捗率の差の絶対値は３０％である。また、当該部分一致タプルに含まれるテーブル３１ｃのスキャン進捗率の差の絶対値は５０％である。
【０１５１】
この場合、テーブル３１ｂについて、現スキャン進捗率の差の絶対値（６０％）≧部分一致タプルにおけるスキャン進捗率の差の絶対値（３０％）を満たす。また、テーブル３１ｃについて、現スキャン進捗率の差の絶対値（５０％）≧部分一致タプルにおけるスキャン進捗率の差の絶対値（５０％）を満たす。よって、ＤＢサーバ１００は、部分一致部分（テーブル３１ｂ，３１ｃ）の現スキャン進捗率の差の絶対値が、部分一致タプルに登録されたスキャン進捗率の差の絶対値以上であると判定する。
【０１５２】
更に、新規部分（テーブル３１ｄ）のスキャン進捗率が１００％に達した依頼先は、部分一致タプルにおけるオフロード選択フラグ“ＦＡＬＳＥ”により特定される実行継続先であるクエリ実行部１４０（ＤＢサーバ１００）に一致している。このため、ＤＢサーバ１００は、複数の監視対象テーブルのうちの部分一致部分（テーブル３１ｂ，３１ｃ）のスキャン進捗率が低い方に、クエリの実行停止を指示する。この例では、クラスタ２０によるテーブル３１ｂ，３１ｃのスキャン進捗率の方が、クエリ実行部１４０によるテーブル３１ｂ，３１ｃのスキャン進捗率よりも低い（例えば、前述のように、スキャン進捗率の平均値で比較してもよい）。したがって、ＤＢサーバ１００は、クラスタ２０に、当該クエリの実行停止を指示する。クラスタ２０は、実行停止の指示を受け付けると、当該クエリの実行を停止する。ここでは、未完了の監視対象処理に関する過去の実績から、オフロード選択フラグ“ＦＡＬＳＥ”により特定される実行継続先であるクエリ実行部１４０とは異なる方（クラスタ２０）に対して、実行停止の指示が行われることが期待される。
【０１５３】
時刻Ｔ５３において、クエリ実行部１４０は、クエリの実行を完了する。ＤＢサーバ１００は、クエリ実行部１４０からクエリの実行結果を取得し、クライアント６００に送信する。
【０１５４】
このように、ＤＢサーバ１００は、クラスタ２０におけるクエリ処理を、時刻Ｔ５２で停止させることができる。その結果、時刻Ｔ５２の段階で、クラスタ２０における当該クエリ処理のためのリソースを解放させることができる。特に、過去の実績を用いることで、図１３の場合に比べて、複数の監視対象テーブルの全てのスキャン進捗率が１００％に到達する前に、ネイティブまたはアクセラレータのうちの一方のクエリの実行を停止させることができる。その結果、リソースの解放を一層早めることができる。
【０１５５】
特に、ＤＢサーバ１００において、テーブル３１ｄのスキャン進捗率が１００％に到達していれば、クラスタ２０においてテーブル３１ｄのスキャン進捗率が１００％に到達していなくても、クラスタ２０によるクエリの実行を停止させることができる。したがって、リソースの解放を一層早めることができる。
【０１５６】
図１８は、クエリ実行制御の第６の例を示す図である。図１８の例では、ＤＢサーバ１００に入力されるクエリの内容は、テーブル３１ｂ（テーブル名“ｔｂｌ２”）に対するインデックススキャン、テーブル３１ｃ（テーブル名“ｔｂｌ３”）に対するインデックススキャン、および、テーブル３１ｄ（テーブル名“ｔｂｌ４”）に対するシーケンシャルスキャンを含むとする。監視対象テーブルは、テーブル３１ｂ，３１ｃ，３１ｄであるとする。
【０１５７】
また、テーブル３１ｂ，３１ｃそれぞれに対するインデックスキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを行ったクエリの過去の実績（入力されるクエリの内容に対する完全一致タプル）が、オフロード選択テーブル１１１に登録されていないものとする。更に、テーブル３１ｂに対するインデックススキャンおよびテーブル３１ｃに対するインデックススキャンを行ったクエリの過去の実績（入力されたクエリの内容に対する部分一致タプル）が、オフロード選択テーブル１１１に登録されているものとする。例えば、ＤＢサーバ１００は次の制御を行う。
【０１５８】
時刻Ｔ６１において、ＤＢサーバ１００は、クライアント６００によるクエリの入力を受け付ける。ＤＢサーバ１００は、当該クエリがテーブル３１ｂ，３１ｃそれぞれに対するインデックススキャン、および、テーブル３１ｄに対するシーケンシャルスキャンを含むことを特定する。また、ＤＢサーバ１００は、当該クエリにおける監視対象テーブルをテーブル３１ｂ，３１ｃ，３１ｄと決定する。ＤＢサーバ１００は、オフロード選択テーブル１１１を参照して、テーブル３１ｂ，３１ｃそれぞれに対するシーケンシャルスキャンを行ったクエリの実績に対応する行を特定する。特定された行は、入力されたクエリの内容に対する部分一致タプルである。
【０１５９】
ＤＢサーバ１００は、ＤＢサーバ１００のクエリ実行部１４０およびクラスタ２０の両方に、受け付けたクエリの実行開始を指示する。クエリ実行部１４０は、実行開始の指示を受け付けるとクエリの実行を開始する。クラスタ２０は、実行開始の指示を受け付けるとクエリの実行を開始する。ＤＢサーバ１００は、クエリ実行部１４０およびクラスタ２０それぞれによるテーブル３１ａ，３１ｂのテーブルスキャンの進捗の監視を開始する。この場合、ＤＢサーバ１００は、複数の監視対象テーブルのうち、部分一致部分（テーブル３１ｂ，３１ｃ）と、新規部分（テーブル３１ｄ）とに対するテーブルスキャンを分けて監視する。
【０１６０】
時刻Ｔ６２において、ＤＢサーバ１００は、クエリ実行部１４０について、テーブル３１ｂのスキャン進捗率９０％、テーブル３１ｃのスキャン進捗率７０％、および、テーブル３１ｄのスキャン進捗率６０％を検出する。また、ＤＢサーバ１００は、クラスタ２０について、テーブル３１ｂのスキャン進捗率３０％、テーブル３１ｃのスキャン進捗率２０％、および、テーブル３１ｄのスキャン進捗率１００％を検出する。
【０１６１】
この場合、複数の監視対象テーブルのうち、新規部分（テーブル３１ｄ）に対するスキャン進捗率がクラスタ２０で１００％である。このため、ＤＢサーバ１００は、複数の監視対象テーブルのうちの部分一致部分（テーブル３１ｂ，３１ｃ）の現スキャン進捗率の差の絶対値を、オフロード選択テーブル１１１の部分一致タプルに登録されたスキャン進捗率の差の絶対値と比較する。
【０１６２】
テーブル３１ｂについて、現スキャン進捗率の差は、３０％−９０％＝−６０％である。したがって、テーブル３１ｂについて、現スキャン進捗率の差の絶対値は６０％である。テーブル３１ｃについて、現スキャン進捗率の差は、２０％−７０％＝−５０％である。したがって、テーブル３１ｃについて、現スキャン進捗率の差の絶対値は５０％である。
【０１６３】
一方、オフロード選択テーブル１１１の部分一致タプルに含まれるテーブル３１ｂのスキャン進捗率の差の絶対値は３０％である。また、当該部分一致タプルに含まれるテーブル３１ｃのスキャン進捗率の差の絶対値は５０％である。
【０１６４】
この場合、テーブル３１ｂについて、現スキャン進捗率の差の絶対値（６０％）≧部分一致タプルにおけるスキャン進捗率の差の絶対値（３０％）を満たす。また、テーブル３１ｃについて、現スキャン進捗率の差の絶対値（５０％）≧部分一致タプルにおけるスキャン進捗率の差の絶対値（５０％）を満たす。よって、ＤＢサーバ１００は、部分一致部分（テーブル３１ｂ，３１ｃ）の現スキャン進捗率の差の絶対値が、部分一致タプルに登録されたスキャン進捗率の差の絶対値以上であると判定する。
【０１６５】
更に、新規部分（テーブル３１ｄ）のスキャン進捗率が１００％に達した依頼先は、クラスタ２０である。クラスタ２０は、部分一致タプルにおけるオフロード選択フラグ“ＦＡＬＳＥ”により特定される実行継続先であるクエリ実行部１４０（ＤＢサーバ１００）に一致していない。このため、ＤＢサーバ１００は、時刻Ｔ６２の段階では、クエリ実行部１４０およびクラスタ２０の両方によるクエリ処理を継続させると判定し、各監視対象テーブルのテーブルスキャンの監視を継続する。この段階では、ネイティブおよびアクセラレータの何れの方が全ての監視対象処理を早く完了できるかを適切に判定できないからである。すなわち、この段階では、クエリ実行部１４０によるテーブル３１ｄのスキャン（比較的大きな負荷の処理）が完了していないため、今後、クエリ実行部１４０によるテーブル３１ｂ，３１ｃのスキャンに、過去の実績よりも時間がかかる可能性を否定できない。したがって、このような場合には、ＤＢサーバ１００は、両方のクエリ処理を継続させ、スキャン進捗率の監視を継続する。
【０１６６】
こうして、何れによるクエリ処理を停止させれば有利であるかを判定できない場合には、両方によるクエリ処理を継続し、監視を継続することで、適切なタイミングで、ネイティブおよびアクセラレータの何れかによるクエリ処理を停止させることができる。
【０１６７】
図１９は、リソース解放のタイミングの例を示す図である。図１９（Ａ）は、アクセラレータ側のクエリの実行を停止させる場合を例示している。図１９（Ｂ）は、ネイティブ側のクエリの実行を停止させる場合を例示している。
【０１６８】
図１９（Ａ）の例でいえば、時刻Ｔ７１に、ネイティブおよびアクセラレータの両方がクエリの実行を開始する。そして、時刻Ｔ７２に、アクセラレータ側のクエリの実行が停止される。更に、時刻Ｔ７３に、ネイティブ側のクエリの実行が完了する。このように、ネイティブ側のクエリの実行が完了する時刻Ｔ７３よりも前の時刻Ｔ７２に、アクセラレータ側のクエリの実行が停止される。こうして、アクセラレータ側のクエリ処理に伴うリソースを、時刻Ｔ７２において解放させることができる。特に、テーブルスキャンというクエリの初期段階に実行される処理を進捗の監視対象とすることで、アクセラレータ側のクエリの実行を初期段階で停止させることができ、比較的早い段階でリソースを解放させることができる。
【０１６９】
図１９（Ｂ）の例でいえば、時刻Ｔ７１ａに、ネイティブおよびアクセラレータの両方がクエリの実行を開始する。そして、時刻Ｔ７２ａに、ネイティブ側のクエリの実行が停止される。更に、時刻Ｔ７３ａに、アクセラレータ側のクエリの実行が完了する。このように、アクセラレータ側のクエリの実行が完了する時刻Ｔ７３ａよりも前の時刻Ｔ７２ａに、ネイティブ側のクエリの実行が停止される。こうして、ネイティブ側のクエリ処理に伴うリソースを、時刻Ｔ７２ａにおいて解放させることができる。図１９（Ａ）の場合と同様に、テーブルスキャンを進捗の監視対象とすることで、ネイティブ側のクエリの実行を初期段階で停止させることができ、比較的早い段階でリソースを解放させることができる。
【０１７０】
一方、ＤＢサーバ１００によるクエリ実行制御を行わない方法も考えられる。
図２０は、リソース解放のタイミングの比較例を示す図である。図２０では、ネイティブおよびアクセラレータのうち、何れか一方がクエリに含まれる全ての処理を完了した段階で、他方のクエリの実行を停止させる例である。図２０（Ａ）は、アクセラレータ側のクエリの実行を停止させる場合を示している。図２０（Ｂ）は、ネイティブ側のクエリの実行を停止させる場合を示している。
【０１７１】
図２０（Ａ）の例でいえば、時刻Ｔ８１に、ネイティブおよびアクセラレータの両方がクエリの実行を開始する。そして、時刻Ｔ８２に、ネイティブ側のクエリの実行が完了する。このため、時刻Ｔ８２に、未完了であるアクセラレータ側のクエリの実行が停止される。
【０１７２】
図２０（Ｂ）の例でいえば、時刻Ｔ８１ａに、ネイティブおよびアクセラレータの両方がクエリの実行を開始する。そして、時刻Ｔ８２ａに、アクセラレータ側のクエリの実行が完了する。このため、時刻Ｔ８２ａに、未完了であるネイティブ側のクエリの実行が停止される。
【０１７３】
図２０（Ａ）および図２０（Ｂ）の何れの例においても、一方のクエリの実行が完了するまで、他方のクエリの実行が継続される。このため、一方でクエリの実行が完了するまで、他方によるクエリ処理に伴うリソースの使用は継続され、リソース解放のタイミングが遅い。すなわち、図２０（Ａ）および図２０（Ｂ）の例では、リソースを余計に使用する期間が長くなる。
【０１７４】
一方、ＤＢサーバ１００のクエリ実行制御によれば、前述のように、ネイティブおよびアクセラレータのうちの一方でクエリの実行が完了するよりも前に、他方のクエリの実行を停止させることができる。したがって、一方でクエリの実行が完了した後に、他方のクエリの実行を停止させるよりも、他方のクエリの実行の停止を早めることができる。その結果、他方によるクエリ処理に伴うリソースを、より早く解放させることができる。そして、解放されたリソースを、別の処理に活用可能となる。また、クエリの実行の停止を早めることで、クエリ処理に伴う消費電力の低減を図れる。
【０１７５】
こうして、情報処理システムによるクエリに対する応答性能を高めながら、ネイティブおよびアクセラレータによるリソース利用の効率化を図れる。
なお、第１の実施の形態の情報処理は、処理部１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０１７６】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【０１７７】
以上の第１，第２の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
（付記１）  クエリに含まれる複数の処理による処理対象のデータを記憶する記憶部と、
前記記憶部に記憶された前記データに基づいて前記複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、第１の装置および第２の装置の両方に前記クエリの実行開始を指示し、前記第１の装置により実行される前記監視対象処理の第１の進捗情報を取得し、前記第２の装置により実行される前記監視対象処理の第２の進捗情報を取得し、前記第１の進捗情報および前記第２の進捗情報に基づいて、前記第１の装置および前記第２の装置のうちの１の装置に前記クエリの実行停止を指示する処理部と、
を有する情報処理装置。
【０１７８】
（付記２）  前記処理部は、前記監視対象処理に対して、前記第１の装置および前記第２の装置のうちの前記実行停止を指示した方を識別可能な識別情報を前記記憶部に格納し、前記監視対象処理を含む他のクエリを受け付けると、前記記憶部に記憶された前記識別情報に基づいて、前記第１の装置および前記第２の装置の何れか一方に、前記他のクエリの実行開始を指示する、付記１記載の情報処理装置。
【０１７９】
（付記３）  前記処理部は、前記クエリに含まれる前記監視対象処理が前記他のクエリに含まれる複数の監視対象処理のうちの第１の部分に一致する場合、前記第１および前記第２の装置の両方に前記他のクエリの実行開始を指示し、前記第１および前記第２の装置それぞれの前記第１の部分に対する進捗と、前記複数の監視対象処理のうちの前記第１の部分とは異なる第２の部分に対する前記第１および前記第２の装置それぞれの進捗とに基づいて、前記第１および前記第２の装置のうちの１の装置に前記他のクエリの実行停止を指示する、付記２記載の情報処理装置。
【０１８０】
（付記４）  前記処理部は、前記第１および前記第２の装置の両方により前記第１の部分の実行が完了すると、前記第１の装置により実行される前記第２の部分に対する第３の進捗情報と前記第２の装置により実行される前記第２の部分に対する第４の進捗情報とに基づいて、前記第１および前記第２の装置のうちの１の装置に前記他のクエリの実行停止を指示する、付記３記載の情報処理装置。
【０１８１】
（付記５）  前記処理部は、前記第１および前記第２の装置の両方または何れか一方により前記第２の部分の実行が完了すると、前記第１の装置により実行される前記第１の部分に対する第５の進捗情報と前記第２の装置により実行される前記第１の部分に対する第６の進捗情報と前記識別情報とに基づいて、前記第１および前記第２の装置のうちの１の装置に前記他のクエリの実行停止を指示する、付記３または４記載の情報処理装置。
【０１８２】
（付記６）  前記処理部は、前記複数の処理により用いられる複数のデータセットそれぞれの情報量に基づいて前記複数の処理それぞれの前記処理負荷を決定する、付記１乃至５の何れか１つに記載の情報処理装置。
【０１８３】
（付記７）  前記処理部は、前記複数のデータセットのうち、最大の情報量であるデータセットに対する処理を第１の監視対象処理と決定し、前記最大の情報量に基づいて第２の監視対象処理を決定する、付記６記載の情報処理装置。
【０１８４】
（付記８）  前記データセットは、関係データベースにおけるテーブルであり、
前記処理部は、前記テーブルの行数に基づいて前記情報量を取得する、
付記６または７記載の情報処理装置。
【０１８５】
（付記９）  前記処理部は、前記クエリに含まれる前記複数の処理それぞれのうち、第１の処理よりも先に実行される第２の処理を前記監視対象処理と決定し、前記第１の処理を前記監視対象処理としない、付記１乃至８の何れか１つに記載の情報処理装置。
【０１８６】
（付記１０）  前記クエリは、関係データベースにおけるテーブルに対する複数の処理を含み、
前記第２の処理は、前記テーブルに対するテーブルスキャンである、
付記９記載の情報処理装置。
【０１８７】
（付記１１）  クエリに含まれる複数の処理による処理対象のデータに基づいて、前記複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、
第１の装置および第２の装置の両方に前記クエリの実行開始を指示し、
前記第１の装置により実行される前記監視対象処理の第１の進捗情報を取得し、前記第２の装置により実行される前記監視対象処理の第２の進捗情報を取得し、
前記第１の進捗情報および前記第２の進捗情報に基づいて、前記第１の装置および前記第２の装置のうちの１の装置に前記クエリの実行停止を指示する、
処理をコンピュータに実行させるプログラム。
【０１８８】
（付記１２）  コンピュータが、
クエリに含まれる複数の処理による処理対象のデータに基づいて、前記複数の処理のうち処理負荷が所定の負荷よりも大きいと推定される監視対象処理を決定し、
第１の装置および第２の装置の両方に前記クエリの実行開始を指示し、
前記第１の装置により実行される前記監視対象処理の第１の進捗情報を取得し、前記第２の装置により実行される前記監視対象処理の第２の進捗情報を取得し、
前記第１の進捗情報および前記第２の進捗情報に基づいて、前記第１の装置および前記第２の装置のうちの１の装置に前記クエリの実行停止を指示する、
情報処理方法。
【符号の説明】
【０１８９】
１  情報処理装置
１ａ  記憶部
１ｂ  処理部
２  第１の装置
３  第２の装置
４  端末装置
５  記憶装置
６  ネットワーク
Ｄ１  処理対象データ
Ｑ１  クエリ
【図１】
2018124658.tif 000003
【図２】
2018124658.tif 000004
【図３】
2018124658.tif 000005
【図４】
2018124658.tif 000006
【図５】
2018124658.tif 000007
【図６】
2018124658.tif 000008
【図７】
2018124658.tif 000009
【図８】
2018124658.tif 000010
【図９】
2018124658.tif 000011
【図１０】
2018124658.tif 000012
【図１１】
2018124658.tif 000013
【図１２】
2018124658.tif 000014
【図１３】
2018124658.tif 000015
【図１４】
2018124658.tif 000016
【図１５】
2018124658.tif 000017
【図１６】
2018124658.tif 000018
【図１７】
2018124658.tif 000019
【図１８】
2018124658.tif 000020
【図１９】
2018124658.tif 000021
【図２０】
2018124658.tif 000022