(57)【要約】【課題】配列型データを扱うストリームデータ処理の処理効率を向上させる。【解決手段】ストリームデータ処理を実行する計算機におけるデータ処理方法であって、計算機は、ストリームデータ処理におけるオペレータの構成を示すクエリグラフの情報を生成するクエリ解析部と、クエリグラフの情報に基づいて、オペレータ実行部を生成するクエリ構築部と、入力されたストリームデータを処理するクエリ実行部と、を有し、クエリ構築部が、処理対象のオペレータを選択するステップと、オペレータの処理内容を解析し、解析の結果に基づいて、オペレータに対応するオペレータ実行部に割り当てられるデータ格納領域におけるデータ構造を決定するステップと、解析の結果及びデータ構造の情報に基づいて、オペレータ実行部を生成するステップと、オペレータ実行部をクエリ実行部に登録するステップと、を含む。【選択図】図２
2015011484.tif 000002
【特許請求の範囲】
【請求項１】
ストリームデータ処理を実行する計算機におけるデータ処理方法であって、
前記計算機は、プロセッサ、前記プロセッサに接続されるメモリ、前記プロセッサに接続されるネットワークインタフェースを有し、
前記ストリームデータ処理は、処理の最小単位となるオペレータを複数含み、
前記ストリームデータ処理の対象であるストリームデータは、複数のカラムから構成されるタプルを複数含み、
前記計算機は、
前記ストリームデータ処理を実現するための一つ以上のクエリを含む分析シナリオを受け付け、前記分析シナリオを解析することによって、前記ストリームデータ処理における前記オペレータの構成を示すクエリグラフの情報を生成するクエリ解析部と、
前記クエリグラフの情報に基づいて、前記オペレータに対応する処理を実行するオペレータ実行部を生成するクエリ構築部と、
前記クエリ構築部によって生成された前記オペレータ実行部に基づいて、入力されたストリームデータを処理するクエリ実行部と、
を有し、
前記方法は、
前記クエリ構築部が、前記ストリームデータ処理に含まれる前記複数のオペレータの中から処理対象のオペレータを選択する第１のステップと、
前記クエリ構築部が、前記クエリグラフの情報に基づいて、前記選択されたオペレータの処理内容を解析し、前記解析の結果に基づいて、前記選択されたオペレータに対応する前記オペレータ実行部に割り当てられるデータ格納領域におけるデータ構造を決定する第２のステップと、
前記クエリ構築部が、前記解析の結果及び前記決定されたデータ構造の情報に基づいて、前記選択されたオペレータに対応するオペレータ実行部を生成する第３のステップと、
前記クエリ構築部が、前記生成されたオペレータ実行部を前記クエリ実行部に登録する第４のステップと、
を含むことを特徴とするデータ処理方法。
【請求項２】
請求項１に記載のデータ処理方法であって、
前記方法は、
前記クエリ解析部が、前記分析シナリオを解析することによって、前記ストリームデータ処理の対象となる前記タプルを構成するカラムのうち、１から連続する整数である配列インデクス型のカラムを特定するステップと、
前記クエリ解析部が、前記特定された配列インデクス型のカラムの情報を含む、前記クエリグラフの情報を生成するステップと、
を含み、
前記２のステップは、
前記クエリグラフの情報を参照し、前記選択されたオペレータによって処理されるタプルが前記配列インデクス型のカラムを含むか否かを判定する第５のステップと、
前記選択されたオペレータによって処理されるタプルが前記配列インデクス型のカラムを含むと判定された場合、前記データ格納領域における当該タプルを前記配列インデクス型に基づいて定義される多次元配列として管理するように決定し、前記タプルを多次元配列として管理するための設定情報を生成する第６のステップと、を含むことを特徴とするデータ処理方法。
【請求項３】
請求項２に記載のデータ処理方法であって、
前記ストリームデータ処理は、前記ストリームデータから所定数の前記タプルを抽出する第１のオペレータを含み、
前記第６のステップは、
前記選択されたオペレータによって処理されるタプルを構成するカラムを、前記配列インデクス型のカラムと、当該配列インデクス型以外のカラムである通常型のカラムとに分類するステップと、
前記分類の結果に基づいて、前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むか否かを判定するステップと、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含まないと判定された場合、前記配列インデクス型のカラムの数と同数の次元の多次元配列として前記タプルを保持するための前記設定情報を生成するステップと、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むと判定された場合、前記通常型のカラムをキーとし、前記配列インデクス型のカラムの数と同数の次元の多次元配列が値となるハッシュマップとして前記タプルを保持するための前記設定情報を生成するステップと、
を含むことを特徴とするデータ処理方法。
【請求項４】
請求項２に記載のデータ処理方法であって、
前記ストリームデータ処理は、前記複数のオペレータから入力された前記タプルを所定のカラムの条件に基づいて結合する第２のオペレータを含み、
前記第６のステップは、
前記クエリグラフの情報を参照し、前記選択されたオペレータによって処理されるタプルに含まれる前記配列インデクス型のカラムが、前記第２のオペレータにおける前記所定のカラムの条件に関連するか否かを判定するステップと、
前記選択されたオペレータによって処理されるタプルに含まれる前記配列インデクス型のカラムが、前記第２のオペレータにおける前記所定のカラムの条件に関連すると判定された場合、前記配列インデクス型のカラムの数と同数の次元の多次元配列として前記タプルを保持するための前記設定情報を生成するステップと、
を含むことを特徴とするデータ処理方法。
【請求項５】
請求項２に記載のデータ処理方法であって、
前記ストリームデータ処理は、前記複数のタプルを所定の条件に基づいて複数のグループに分割し、前記複数のグループ毎に前記複数のタプルの値を所定の演算処理に基づいて集約する第３のオペレータを含み、
前記第６のステップは、
前記選択されたオペレータによって処理されるタプルを構成するカラムを、前記配列インデクス型のカラムと、当該配列インデクス型以外のカラムである通常型のカラムとに分類するステップと、
前記分類の結果に基づいて、前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むか否かを判定するステップと、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含まないと判定された場合、前記配列インデクス型のカラムの数と同数の次元の多次元配列として前記タプルを保持するための前記設定情報を生成するステップと、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むと判定された場合、前記通常型のカラムをキーとし、前記配列インデクス型のカラムの数と同数の次元の多次元配列が値となるハッシュマップとして前記タプルを保持するための前記設定情報を生成するステップと、
を含むことを特徴とするデータ処理方法。
【請求項６】
プロセッサ、前記プロセッサに接続されるメモリ、前記プロセッサに接続されるネットワークインタフェースを有し、ストリームデータ処理を実行する計算機であって、
前記ストリームデータ処理は、処理の最小単位となるオペレータを複数含み、
前記ストリームデータ処理の対象であるストリームデータは、複数のカラムから構成されるタプルを複数含み、
前記計算機は、
前記ストリームデータ処理を実現するための一つ以上のクエリを含む分析シナリオを受け付け、前記分析シナリオを解析することによって、前記ストリームデータ処理における前記オペレータの構成を示すクエリグラフの情報を生成するクエリ解析部と、
前記クエリグラフの情報に基づいて、前記オペレータに対応する処理を実行するオペレータ実行部を生成するクエリ構築部と、
前記クエリ構築部によって生成された前記オペレータ実行部に基づいて、入力されたストリームデータを処理するクエリ実行部と、
を有し、
前記クエリ構築部は、
前記ストリームデータ処理に含まれる前記複数のオペレータの中から処理対象のオペレータを選択し、
前記クエリグラフの情報に基づいて、前記選択されたオペレータの処理内容を解析し、前記解析の結果に基づいて、前記選択されたオペレータに対応する前記オペレータ実行部に割り当てられるデータ格納領域におけるデータ構造を決定し、
前記解析の結果及び前記決定されたデータ構造の情報に基づいて、前記選択されたオペレータに対応するオペレータ実行部を生成し、
前記生成されたオペレータ実行部を前記クエリ実行部に登録することを特徴とする計算機。
【請求項７】
請求項６に記載の計算機であって、
前記クエリ解析部は、
前記分析シナリオを解析することによって、前記ストリームデータ処理の対象となる前記タプルを構成するカラムのうち、１から連続する整数である配列インデクス型のカラムを特定し、
前記特定された配列インデクス型のカラムの情報を含む、前記クエリグラフの情報を生成し、
前記クエリ構築部は、
前記データ格納領域におけるデータ構造を決定する場合に、前記クエリグラフの情報を参照し、前記選択されたオペレータによって処理されるタプルが前記配列インデクス型のカラムを含むか否かを判定し、
前記選択されたオペレータによって処理されるタプルが前記配列インデクス型のカラムを含むと判定された場合、前記データ格納領域における当該タプルを前記配列インデクス型に基づいて定義される多次元配列として管理するように決定し、
前記タプルを多次元配列として管理するための設定情報を生成することを特徴とする計算機。
【請求項８】
請求項７に記載の計算機であって、
前記ストリームデータ処理は、前記ストリームデータから所定数の前記タプルを抽出する第１のオペレータを含み、
前記クエリ構築部は、
前記データ格納領域におけるデータ構造を決定する場合に、前記選択されたオペレータによって処理されるタプルを構成するカラムを、前記配列インデクス型のカラムと、当該配列インデクス型以外のカラムである通常型のカラムとに分類し、
前記分類の結果に基づいて、前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むか否かを判定し、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含まないと判定された場合、前記配列インデクス型のカラムの数と同数の次元の多次元配列として前記タプルを保持するための前記設定情報を生成し、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むと判定された場合、前記通常型のカラムをキーとし、前記配列インデクス型のカラムの数と同数の次元の多次元配列が値となるハッシュマップとして前記タプルを保持するための前記設定情報を生成することを特徴とする計算機。
【請求項９】
請求項７に記載の計算機であって、
前記ストリームデータ処理は、前記複数のオペレータから入力された前記タプルを所定のカラムの条件に基づいて結合する第２のオペレータを含み、
前記クエリ構築部は、
前記データ格納領域におけるデータ構造を決定する場合に、前記クエリグラフの情報を参照し、前記選択されたオペレータによって処理されるタプルに含まれる前記配列インデクス型のカラムが、前記第２のオペレータにおける前記所定のカラムの条件に関連するか否かを判定し、
前記選択されたオペレータによって処理されるタプルに含まれる前記配列インデクス型のカラムが、前記第２のオペレータにおける前記所定のカラムの条件に関連すると判定された場合、前記配列インデクス型のカラムの数と同数の次元の多次元配列として前記タプルを保持するための前記設定情報を生成することを特徴とする計算機。
【請求項１０】
請求項７に記載の計算機であって、
前記ストリームデータ処理は、前記複数のタプルを所定の条件に基づいて複数のグループに分割し、前記複数のグループ毎に前記複数のタプルの値を所定の演算処理に基づいて集約する第３のオペレータを含み、
前記クエリ構築部は、
前記データ格納領域におけるデータ構造を決定する場合に、前記選択されたオペレータによって処理されるタプルを構成するカラムを、前記配列インデクス型のカラムと、当該配列インデクス型以外のカラムである通常型のカラムとに分類し、
前記分類の結果に基づいて、前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むか否かを判定し、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含まないと判定された場合、前記配列インデクス型のカラムの数と同数の次元の多次元配列として前記タプルを保持するための前記設定情報を生成し、
前記選択されたオペレータによって処理されるタプルが前記通常型のカラムを含むと判定された場合、前記通常型のカラムをキーとし、前記配列インデクス型のカラムの数と同数の次元の多次元配列が値となるハッシュマップとして前記タプルを保持するための前記設定情報を生成することを特徴とする計算機。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、配列型データを扱うストリームデータ処理の処理効率を向上させるデータ処理方法に関する。
【背景技術】
【０００２】
近年、処理するデータ量が増大しており、リアルタイムにデータを集計し、また、分析することを可能とするストリームデータ処理システムが注目を集めている。ストリームデータ処理システムは、ストリームデータを処理対象とする。ここで、ストリームデータとは、途切れることなく到来する時系列順のデータ列である。
【０００３】
ストリームデータ処理システムでは、予め定義されたクエリにしたがって所定のストリームデータ処理が実行される。クエリとは、処理の対象とするデータ及び処理内容を示すシナリオである。クエリを定義する計算機言語の例は、非特許文献１に開示されている。
【０００４】
ストリームデータ処理のアプリケーションにおいては、回帰分析による時系列予測計算などの数値計算が必要となるケースがある。このような計算は、ベクトル計算や行列計算となるため、配列型データを用いた処理として定義される。
【０００５】
ストリームデータではないが、ストックされたデータに対する標準クエリ言語であるＳＱＬ９９では、配列型データを単一のカラム値として表現する、配列型カラムの仕様を規定している。この仕様は、ストリーム処理のクエリ言語にも適用可能である。同じく、ストックされた多次元配列のデータを効率的に処理する技術としては、非特許文献２に記載された技術が知られている。非特許文献２には、膨大なスケールの配列データを管理するデータ管理システムであるＳｃｉＤＢについて記載されている。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Ａ． Ａｒａｓｕ、 Ｓ． Ｂａｂｕ  ａｎｄ Ｊ． Ｗｉｄｏｍ  著、“Ｔｈｅ ＣＱＬ Ｃｏｎｔｉｎｕｏｕｓ Ｑｕｅｒｙ Ｌａｎｇｕａｇｅ： Sｅｍａｎｔｉｃ Ｆｏｕｎｄａｔｉｏｎｓ  ａｎｄ Ｑｕｅｒｙ Ｅｘｅｃｕｔｉｏｎ”、２００３年
【非特許文献２】Ｐａｕｌ Ｇ.  Ｂｒｏｗｎ著、“Ｏｖｅｒｖｉｅｗ ｏｆ ｓｃｉＤＢ： ｌａｒｇｅ ｓｃａｌｅ ａｒｒａｙ ｓｔｏｒａｇｅ, ｐｒｏｃｅｓｓｉｎｇ ａｎｄ ａｎａｌｙｓｉｓ”、Ｉｎ  Ｐｒｏｃ．  ｏｆ  ＳＩＧＭＯＤ  ２０１０、９６３〜９６８頁、２０１０年
【発明の概要】
【発明が解決しようとする課題】
【０００７】
従来、配列型データを扱うストリームデータ処理の高速化を実現するためには、配列の検索処理のコスト、及びメモリの利用効率が問題となる。ここで、二つの行列の積を算出する演算処理の例を用いて、従来の課題について説明する。
【０００８】
図１１は、従来の二つの行列の積を算出する演算処理を実現するためのクエリの一例を示す図である。図１１に示すクエリでは、行列Ａと行列Ｂとの積を算出するための演算処理が実行される。
【０００９】
図１１に示すクエリでは、行列のデータは、行のカラム、列のカラム、及び行列成分の値のカラムから構成されるタプルを複数含むデータ構造で管理される。したがって、一般的な行列表現のデータと比較して、データ量が増加するため、メモリの利用効率が低いという問題がある。
【００１０】
また、クエリに基づく演算処理では、行列Ａの列のカラムの値と、行列Ｂの行のカラムの値とが一致する組合せを検索する処理が必要となる。したがって、行及び列の数が大きくなると検索処理のコストの増大し、これに伴って、演算処理の性能が低下するという問題がある。
【００１１】
前述した二つの問題を解決する方法として、以下のような従来技術が知られている。
【００１２】
一つの方法は、予め、行列Ａの列のカラムの値、及び行列Ｂの行のカラムの値との組合せを指定するインデクスを用いる方法である。当該インデクスを用いることによって、前述した検索処理のコストの増大を抑制することができる。しかし、インデクスを格納するメモリ領域を確保する必要があるため、メモリの利用効率がさらに低くなるという問題がある。
【００１３】
他の方法は、前述のＳＱＬ９９と同様の配列型カラムを利用する方法である。図１２は、配列型カラムを用いたクエリの一例を示す図である。図１２に示すクエリでは、行列成分そのものが配列として管理される。単純に配列型カラムを用いたクエリでは以下のような問題がある。
【００１４】
一つの問題は、一つの行列成分のデータ更新に伴う演算処理が効率的に行えないことである。例えば、行列の積が算出された後に行列成分の一つが更新された場合、その更新によって変化する積の成分は、更新された成分と行又は列が一致する成分に限られる。このように、更新後の行列の積を得るためには、変化した成分の演算処理のみを実行すればよい。しかし、配列型カラムでは行列全体が一つのカラムに対応するため、一つの行列成分の更新に伴って配列型カラム（行列）そのものが更新される。改めて行列の積を算出しなければならない。したがって、一部の値の更新に関する演算処理を効率的に行えないという問題がある。
【００１５】
他の問題は、行列の積を算出するための組込関数を定義する必要がある。配列型カラムを用いた場合、演算に必要な関数を新たに定義する必要がある。また、予めライブラリとして用意されていない関数が必要になる場合がある。そのため、開発効率が悪いという問題点がある。
【００１６】
本願発明は前述した課題に鑑みてなされた発明である。すなわち、配列型データを扱うストリームデータ処理の高速化が実現可能なデータ処理方法及び計算機を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、ストリームデータ処理を実行する計算機におけるデータ処理方法であって、前記計算機は、プロセッサ、前記プロセッサに接続されるメモリ、前記プロセッサに接続されるネットワークインタフェースを有し、前記ストリームデータ処理は、処理の最小単位となるオペレータを複数含み、前記ストリームデータ処理の対象であるストリームデータは、複数のカラムから構成されるタプルを複数含み、前記計算機は、前記ストリームデータ処理を実現するための一つ以上のクエリを含む分析シナリオを受け付け、前記分析シナリオを解析することによって、前記ストリームデータ処理における前記オペレータの構成を示すクエリグラフの情報を生成するクエリ解析部と、前記クエリグラフの情報に基づいて、前記オペレータに対応する処理を実行するオペレータ実行部を生成するクエリ構築部と、前記クエリ構築部によって生成された前記オペレータ実行部に基づいて、入力されたストリームデータを処理するクエリ実行部と、を有し、前記方法は、前記クエリ構築部が、前記ストリームデータ処理に含まれる前記複数のオペレータの中から処理対象のオペレータを選択する第１のステップと、前記クエリ構築部が、前記クエリグラフの情報に基づいて、前記選択されたオペレータの処理内容を解析し、前記解析の結果に基づいて、前記選択されたオペレータに対応する前記オペレータ実行部に割り当てられるデータ格納領域におけるデータ構造を決定する第２のステップと、前記クエリ構築部が、前記解析の結果及び前記決定されたデータ構造の情報に基づいて、前記選択されたオペレータに対応するオペレータ実行部を生成する第３のステップと、前記クエリ構築部が、前記生成されたオペレータ実行部を前記クエリ実行部に登録する第４のステップと、を含むことを特徴とする。
【発明の効果】
【００１８】
本発明によれば、ストリームデータ処理に含まれるオペレータ毎に、配列データのデータ構造を最適化することができるため、計算処理のコストの低減及びメモリ利用効率を向上させることができる。したがって、ストリームデータ処理の高速化が可能となる。
【００１９】
上記した以外の課題、構成及び効果は、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【００２０】
【図１】本発明の実施例１におけるストリームデータ処理システムの構成例を示すブロック図である。
【図２】本発明の実施例１におけるストリームデータ処理部の構成例を示すブロック図である。
【図３】本発明の実施例１の分析シナリオの一例を示す説明図である。
【図４】本発明の実施例１のクエリグラフ構成情報の一例を示す説明図である。
【図５】本発明の実施例のストリームデータ処理部が分析シナリオの登録時に実行する処理を説明するフローチャートである。
【図６】本発明の実施例１のＰａｒｔｉｔｉｏｎウィンドウ最適化部が実行する処理を説明するフローチャートである。
【図７】本発明の実施例１のＪｏｉｎオペレータ最適化部が実行する処理を説明するフローチャートである。
【図８】本発明の実施例１のＧｒｏｕｐＢｙオペレータ最適化部が実行する処理を説明するフローチャートである。
【図９】本発明の実施例１のオペレータ間のデータの流れを示す説明図である。
【図１０】本発明の実施例１におけるオペレータ間のデータの流れを示す説明図である。
【図１１】従来の二つ行列の積を算出する演算処理を実現するためのクエリの一例を示す図である。
【図１２】従来の配列型カラムを用いたクエリの一例を示す図である。
【発明を実施するための形態】
【００２１】
以下、本発明の実施例を添付図面に基づいて説明する。
【実施例１】
【００２２】
図１は、本発明の実施例１におけるストリームデータ処理システムの構成例を示すブロック図である。
【００２３】
ストリームデータ処理システムは、ストリームデータ処理サーバ１００、及び、複数のホスト計算機１２０、１３０、１４０から構成される。
【００２４】
ストリームデータ処理サーバ１００は、ネットワーク１５０を介して複数のホスト計算機１２０、１３０、１４０と接続される。なお、ネットワーク１５０は、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）及びＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）などを用いることが考えられるが、本発明はネットワーク１５０の接続形式に限定されない。
【００２５】
ストリームデータ処理サーバ１００は、ホスト計算機１２０から送信されるストリームデータを受信し、また、指示されたクエリに従ってストリームデータを処理し、処理結果を出力タプル１４１として出力する。
【００２６】
ストリームデータは、複数の入力タプル１２１を含む。本実施例では、入力タプル１２１は、値のカラム、及び当該値を特定するためのインデクスのカラムを含む。なお、入力タプル１２１には、インデクスのカラムが一つ以上含まれるものとする。また、入力タプル１２１は、タイムスタンプのカラムを含んでいてもよい。
【００２７】
ストリームデータ処理サーバ１００は、プロセッサ１０１、メモリ１０２、ネットワークインタフェース１０４、及びストレージ装置１０５を備え、各構成はバス１０３を介して接続される。
【００２８】
プロセッサ１０１は、メモリ１０２に格納されるプログラムを実行することによって各種処理を実行する。以下の説明では、プログラムを主体に処理を記載する場合、当該プログラムがプロセッサ１０１によって実行されていることを示す。
【００２９】
メモリ１０２は、プロセッサ１０１が実行するプログラム及び当該プログラムを実行するために必要な情報を格納する。具体的には、メモリ１０２は、ストリームデータ処理部１１０を実現するプログラムを格納する。
【００３０】
ストリームデータ処理部１１０は、ストリームデータを処理する。ストリームデータ処理部１１０の詳細については、図２を用いて後述する。
【００３１】
ストレージ装置１０５は、ストリームデータ、クエリ、及びその他の情報を格納する。ストレージ装置１０５は、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）又はＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶媒体が考えられる。なお、本発明は記憶媒体の種類に限定されない。
【００３２】
なお、メモリ１０２に格納されるプログラム及び情報は、ストレージ装置１０５に格納されてもよい。この場合、プロセッサ１０１がストレージ装置１０５からプログラム及び情報を読み出し、読み出されたプログラム及び情報をメモリ１０２にロードする。
【００３３】
ホスト計算機１２０、１３０、１４０は、ストリームデータ処理サーバ１００を利用するユーザが利用する計算機であり、プロセッサ（図示省略）、メモリ（図示省略）、及びネットワークインタフェース（図示省略）を備える。
【００３４】
ホスト計算機１２０は、ストリームデータ処理サーバ１００が処理するストリームデータ（入力タプル１２１）を送信する。なお、入力タプル１２１は、複数のホスト計算機１２０を含むシステムから送信されてもよい。
【００３５】
ホスト計算機１４０は、ストリームデータ処理サーバ１００によって処理された出力タプル１４１を受信する。なお、出力タプル１４１は、複数のホスト計算機１４０を含むシステムが受信してもよい。
【００３６】
ホスト計算機１３０は、クエリ登録インタフェース１３１を実現するためのプログラムを実行する。クエリ登録インタフェース１３１は、分析シナリオ１３２を登録し、また、当該分析シナリオ１３２の実行を命令するためのインタフェースである。
【００３７】
ここで、分析シナリオ１３２は、一つ以上のクエリを含む。また、クエリは、一つ以上のオペレータを含む。オペレータは、ストリームデータ処理における最小単位の処理を示す。オペレータは、例えば、データの抽出処理、データの集約処理等が対応する。
【００３８】
本実施例の分析シナリオ１３２には、一つ以上の入力ストリームを定義するストリーム定義情報、及び一つ以上のクエリを定義するクエリ定義情報が含まれる。なお、分析シナリオ１３２の詳細については、図３を用いて後述する。
【００３９】
ストリームデータ処理サーバ１００は、分析シナリオ１３２が入力されると、当該分析シナリオ１３２を分析し、所定のストリームデータ処理を実行するためのクエリグラフを構成する。ストリームデータ処理サーバ１００は、クエリグラフにしたがって、ストリームデータ（入力タプル１２１）を処理する。
【００４０】
図２は、本発明の実施例１におけるストリームデータ処理部１１０の構成例を示すブロック図である。
【００４１】
ストリームデータ処理部１１０は、クエリパーサ２０１、クエリ構築部２０３、クエリ実行部２１０、タプル入力部２２１、及びタプル出力部２２２を備える。また、ストリームデータ処理部１１０は、クエリグラフ構成情報２０２を保持する。
【００４２】
クエリパーサ２０１は、分析シナリオ１３２の入力を受け付け、受け付けた分析シナリオ１３２を解析し、解析結果に基づいてクエリグラフを生成する。生成されたクエリグラフに関する情報は、クエリグラフ構成情報２０２として保持される。クエリグラフ構成情報２０２の詳細については、図４を用いて後述する。
【００４３】
前述したように、分析シナリオには一つ以上のオペレータが含まれる。したがって、クエリグラフは、一つ以上のオペレータから構成される。
【００４４】
図２に示す例では、オペレータ１、オペレータ２、オペレータ３、オペレータ４、オペレータ５、及びオペレータ６から構成されるクエリグラフを示す。なお、本発明は、オペレータの処理内容に限定されない。
【００４５】
クエリ構築部２０３は、クエリグラフ構成情報２０２に基づいて、オペレータ実行部２１１を生成し、生成されたオペレータ実行部２１１をクエリ実行部２１０に出力する。
【００４６】
オペレータ実行部２１１は、クエリグラフに含まれるオペレータの具体的な処理を実行するモジュールである。オペレータ実行部２１１には、処理対象のタプル、タプルに含まれるカラム、及び処理に使う関数等の、処理の実行に必要な設定情報が含まれる。本実施例では、さらに、オペレータのデータ格納領域の設定情報が含まれる。
【００４７】
ここで、データ格納領域は、オペレータに対応するオペレータ実行部２１１が一時的にタプルを保持する記憶領域である。また、データ格納領域の設定情報は、データ格納領域に保持されるデータの構造を設定するための情報であり、例えば、多次元配列のデータ構造を設定するための情報が考えられる。データ格納領域の設定情報の例は、図６を用いて後述する。
【００４８】
クエリ構築部２０３は、クエリ最適化部２０４を含む。クエリ最適化部２０４は、クエリグラフ構成情報２０２に基づいて、分析シナリオ１３２を解析し、各オペレータのデータ格納領域の管理方法を決定する。
【００４９】
本実施例では、クエリグラフに含まれるオペレータとして、Ｐａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータ、Ｊｏｉｎオペレータ、及びＧｒｏｕｐＢｙオペレータを想定する。したがって、クエリ最適化部２０４は、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５、Ｊｏｉｎオペレータ最適化部２０６、及びＧｒｏｕｐＢｙオペレータ最適化部２０７を含む。
【００５０】
Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、Ｐａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータのデータ格納領域の管理方法を決定する。Ｊｏｉｎオペレータ最適化部２０６は、Ｊｏｉｎオペレータのデータ格納領域の管理方法を決定する。ＧｒｏｕｐＢｙオペレータ最適化部２０７は、ＧｒｏｕｐＢｙオペレータのデータ格納領域の管理方法を決定する。
【００５１】
本実施例では、クエリ最適化部２０４が、各オペレータのデータ格納領域の管理方法を決定し、当該処理結果を出力する。クエリ構築部２０３は、当該処理結果に基づいて、各オペレータに対応するオペレータ実行部２１１を生成する。
【００５２】
なお、クエリ最適化部２０４が実行する処理の詳細については、図５から図８を用いて後述する。
【００５３】
タプル入力部２２１は、ストリームデータ（入力タプル１２１）の入力を受け付ける。また、タプル入力部２２１は、受け付けたストリームデータ（入力タプル１２１）をクエリ実行部２１０に出力する。
【００５４】
クエリ実行部２１０は、入力タプル１２１を用いてストリームデータ処理を実行し、また、処理結果をタプル出力部２２２に出力する。
【００５５】
クエリ実行部２１０は、クエリグラフを構成するオペレータ毎に、オペレータ実行部を含む。図２に示す例では、クエリ実行部２１０には、オペレータ１実行部２１１−１、オペレータ２実行部２１１−２、オペレータ３実行部２１１−３、オペレータ４実行部２１１−４、オペレータ５実行部２１１−５、及びオペレータ６実行部２１１−６が含まれる。
【００５６】
以下の説明では、各オペレータ実行部２１１−１、２１１−２、２１１−３、２１１−４、２１１−５、２１１−６を区別しない場合、オペレータ実行部２１１とも記載する。
【００５７】
タプル出力部２２２は、クエリ実行部２１０から出力された処理結果を、出力タプル１４１としてホスト計算機１４０に送信する。
【００５８】
図３は、本発明の実施例１の分析シナリオ１３２の一例を示す説明図である。
【００５９】
図３に示す分析シナリオ１３２は、行列Ａと行列Ｂの各成分を表現するストリーム定義情報、及び両行列の積を算出するための一つのクエリ定義情報から構成される。
【００６０】
なお、カラム「ｉ」は行列の行に対応するインデクス、カラム「ｊ」は行列の列に対応するインデクス、カラム「ｖ」は行列成分の値を表す。また、カラム「Ａ．ｉ」は行列Ａのカラム「ｉ」、カラム「Ａ．ｊ」は行列Ａのカラム「ｊ」、カラム「Ａ．ｖ」は行列Ａのカラム「ｖ」を表す。行列Ｂについても同様である。
【００６１】
図３に示すクエリＣでは、以下のような行列の積の演算が定義される。
【００６２】
まず、ＰＡＲＴＩＴＩＯＮウィンドウの指定に従って、ストリームデータＡのカラム「ｉ」、及びカラム「ｊ」の組合せに対してカラム「ｖ」の値が一つだけ抽出される。同様に、ストリームデータＢのカラム「ｉ」、カラム「ｊ」の組合せに対してカラム「ｖ」の値が一つだけ抽出される。
【００６３】
次に、ＷＨＥＲＥ句の指定に従って、カラム「Ａ．ｊ」及びカラム「Ｂ．ｉ」が一致するタプルが結合される。
【００６４】
次に、ＧＲＯＵＰ  ＢＹ句の指定に従って、カラム「Ａ．ｉ」及び「Ｂ．ｊ」の組合せ毎にタプルのグループ分けが行われ、ＳＥＬＥＣＴ句の指定に従って、グループ内のタプルのカラム「Ａ．ｖ」とカラム「Ｂ．ｖ」との積の総和が算出される。
【００６５】
本実施例では、入力ストリームを定義するＲＥＧＩＳＴＥＲ  ＳＴＲＥＡＭ句に、インデクスに対応するカラムが配列インデクス型カラムであることを指定する文字列「ＡＲＲＡＹ＿ＩＮＤＥＸ」を用いる。
【００６６】
ここで、配列インデクス型カラムは、カラムの値域が１から連続する整数であるカラムを表す。なお、以下の説明では、配列インデクス型カラム以外のカラムを通常型カラムとも記載する。
【００６７】
図３に示す例では、入力ストリームＡのカラム「ｉ」及びカラム「ｊ」、並びに、入力ストリームＢのカラム「ｉ」及びカラム「ｊ」が、配列インデクス型カラムとして指定されている。
【００６８】
図４は、本発明の実施例１のクエリグラフ構成情報２０２の一例を示す説明図である。
【００６９】
クエリグラフ構成情報２０２は、複数の情報（テーブル）を含む。具体的には、クエリグラフ構成情報２０２は、オペレータ管理情報４１０、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０、Ｊｏｉｎオペレータ管理情報４３０、及びＧｒｏｕｐＢｙオペレータ管理情報４４０を含む。
【００７０】
オペレータ管理情報４１０は、クエリグラフに含まれる全てのオペレータの概要を管理するための情報である。オペレータ管理情報４１０は、オペレータＩＤ４１１、タイプ４１２、及び入力４１３を含む。
【００７１】
オペレータＩＤ４１１は、クエリグラフに含まれるオペレータを一意に識別するための識別情報である。
【００７２】
タイプ４１２は、オペレータの種別を示す情報である。本実施例では、「Ｐａｒｔｉｔｉｏｎ」、「Ｊｏｉｎ」又は「ＧｒｏｕｐＢｙ」のいずれかの情報がタイプ４１２に格納される。
【００７３】
入力４１３は、オペレータに対して入力されるデータの識別情報である。
【００７４】
Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０は、Ｐａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータの詳細情報である。Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０は、オペレータＩＤ４２１、入力カラム４２２、Ｇｒｏｕｐｉｎｇカラム４２３、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４、及びウィンドウサイズ４２５を含む。
【００７５】
オペレータＩＤ４２１は、オペレータＩＤ４１１と同一のものである。
【００７６】
入力カラム４２２は、Ｐａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータに入力されるタプルに含まれるカラムの識別情報である。
【００７７】
Ｇｒｏｕｐｉｎｇカラム４２３は、Ｐａｒｔｉｔｉｏｎウィンドウ演算におけるグループ分け対象のカラムの識別情報である。なお、Ｐａｒｔｉｔｉｏｎウィンドウ演算では、複数のタプルの集合から複数の部分集合（グループ）が生成される。
【００７８】
Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４は、配列インデクス型カラムに対応するカラムの識別情報である。
【００７９】
ウィンドウサイズ４２５は、部分集合に含まれる要素の数を示す。図４に示す例では、カラム「ｉ」とカラム「ｊ」との組合せに対して、同時に生存できるタプルが高々一つに限られることを示す。したがって、カラム「ｉ」が「１」、カラム「ｊ」が「２」のタプルが入力された後、新たに、カラム「ｉ」が「１」、カラム「ｊ」が「２」のタプルが入力されると、新たなタプルのみが存在することができる。
【００８０】
Ｊｏｉｎオペレータ管理情報４３０は、Ｊｏｉｎオペレータの詳細情報である。Ｊｏｉｎオペレータ管理情報４３０は、オペレータＩＤ４３１、入力カラム４３２、Ｊｏｉｎカラム４３３、及びＡｒｒａｙ  Ｉｎｄｅｘカラム４３４を含む。
【００８１】
オペレータＩＤ４３１は、オペレータＩＤ４１１と同一のものである。
【００８２】
入力カラム４３２は、Ｊｏｉｎオペレータに入力されるタプルに含まれるカラムの識別情報である。
【００８３】
Ｊｏｉｎカラム４３３は、結合対象のカラムの識別情報である。
【００８４】
Ａｒｒａｙ  Ｉｎｄｅｘカラム４３４は、配列インデクス型カラムに対応するカラムの識別情報である。
【００８５】
ＧｒｏｕｐＢｙオペレータ管理情報４４０は、ＧｒｏｕｐＢｙオペレータの詳細情報である。ＧｒｏｕｐＢｙオペレータ管理情報４４０は、オペレータＩＤ４４１、入力カラム４４２、Ｇｒｏｕｐｉｎｇカラム４４３、及びＡｒｒａｙ  Ｉｎｄｅｘカラム４４４を含む。
【００８６】
オペレータＩＤ４４１は、オペレータＩＤ４１１と同一のものである。
【００８７】
入力カラム４４２は、ＧｒｏｕｐＢｙオペレータに入力されるタプルに含まれるカラムの識別情報である。
【００８８】
Ｇｒｏｕｐｉｎｇカラム４４３は、ＧｒｏｕｐＢｙオペレータにおけるグループ分け対象のカラムの識別情報である。
【００８９】
Ａｒｒａｙ  Ｉｎｄｅｘカラム４４４は、配列インデクス型カラムに対応するカラムの識別情報である。
【００９０】
図５は、本発明の実施例１のストリームデータ処理部１１０が分析シナリオ１３２の登録時に実行する処理を説明するフローチャートである。
【００９１】
ストリームデータ処理部１１０は、分析シナリオ１３２を受け付けると（ステップＳ５０１）、当該分析シナリオ１３２に基づいて、クエリグラフ構成情報２０２を生成する（ステップＳ５０２）。具体的には、以下のような処理が実行される。なお、ここでは、図３に示す分析シナリオ１３２を受け付けたものとする。
【００９２】
まず、クエリパーサ２０１は、分析シナリオ１３２に基づいて、クエリＣに含まれるオペレータを特定する。本実施例では、クエリパーサ２０１は、クエリＣの定義情報から、二つのＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータ、一つのＪｏｉｎオペレータ、及びの一つのＧｒｏｕｐＢｙオペレータを特定する。
【００９３】
クエリパーサ２０１は、オペレータ管理情報４１０、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０、Ｊｏｉｎオペレータ管理情報４３０、及びＧｒｏｕｐＢｙオペレータ管理情報４４０を初期化する。
【００９４】
クエリパーサ２０１は、特定されたオペレータに「１」から「４」の識別番号を付与する。例えば、クエリパーサ２０１は、オペレータの実行順序に識別番号を付与する。
【００９５】
クエリパーサ２０１は、オペレータ管理情報４１０にエントリを生成し、生成されたエントリのオペレータＩＤ４１１に付与された識別番号を格納し、タイプ４１２に各オペレータの識別情報を格納する。
【００９６】
また、クエリパーサ２０１は、クエリＣの定義情報から各オペレータの入出力関係を解析し、解析結果に基づいて入力４１３に入力されるデータの識別情報を格納する。例えば、オペレータＩＤ４１１が「１」のエントリは、入力ストリームＡが入力されるＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータであるため、タイプ４１２には「Ｐａｒｔｉｔｉｏｎ」が格納され、入力４１３には「Ｓｔｒｅａｍ  Ａ」が格納される。
【００９７】
次に、クエリパーサ２０１は、各オペレータの管理情報を生成する。本実施例では、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０、Ｊｏｉｎオペレータ管理情報４３０、及びＧｒｏｕｐＢｙオペレータ管理情報４４０が生成される。
【００９８】
Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０は以下のようにして生成される。
【００９９】
クエリパーサ２０１は、入力ストリームＡの定義情報に基づいて、タプルに含まれるカラムを特定する。また、クエリパーサ２０１は、入力ストリームＡの定義情報に基づいて、配列インデクス型カラムを特定する。本実施例では、クエリパーサ２０１は、カラムｉ及びカラムｊが配列インデクス型カラムであることが分かる。
【０１００】
また、クエリパーサ２０１は、クエリＣの定義情報のＦＲＯＭ句に基づいて、グループ分けの条件、及びウィンドウサイズを特定する。
【０１０１】
クエリパーサ２０１は、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０にエントリを生成し、前述した解析結果に基づいて、生成されたエントリに必要な情報を格納する。入力ストリームＢが入力されるＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータについても同様の処理が実行される。
【０１０２】
Ｊｏｉｎオペレータ管理情報４３０は以下のようにして生成される。
【０１０３】
クエリパーサ２０１は、入力ストリームＡの定義情報、入力ストリームＢの定義情報、及びクエリＣの定義情報のＷＨＥＲＥ句に基づいて、タプルに含まれるカラム、及び結合条件を特定する。
【０１０４】
また、クエリパーサ２０１は、入力ストリームＡの定義情報、及び入力ストリームＢの定義情報に基づいて、タプルに含まれるカラムの中から配列インデクス型カラムを特定する。
【０１０５】
本実施例では、カラム「ｉ」及びカラム「ｊ」が配列インデクス型カラムとして指定されているため、クエリパーサ２０１は、当該カラムに対応するカラム「Ａｉ」、カラム「Ａｊ」、カラム「Ｂｉ」、及びカラム「Ｂｊ」も配列インデクス型カラムであることが分かる。
【０１０６】
クエリパーサ２０１は、Ｊｏｉｎオペレータ管理情報４３０にエントリを生成し、前述した解析結果に基づいて、生成されたエントリに必要な情報を格納する。
【０１０７】
ＧｒｏｕｐＢｙオペレータ管理情報４４０は以下のようにして生成される。
【０１０８】
クエリパーサ２０１は、入力ストリームＡの定義情報、入力ストリームＢの定義情報、及びクエリＣの定義情報のＧＲＯＵＰ  ＢＹ句に基づいて、タプルに含まれるカラム、及びグループ分けの条件を特定する。また、クエリパーサ２０１は、入力ストリームＡの定義情報、及びストリームデータＢの定義情報に基づいて、タプルに含まれるのカラムの中から配列インデクス型カラムを特定する。
【０１０９】
本実施例では、カラム「ｉ」及びカラム「ｊ」が配列インデクス型カラムとして指定されているため、クエリパーサ２０１は、当該カラムに対応するカラム「Ａｉ」、カラム「Ａｊ」、カラム「Ｂｉ」、及びカラム「Ｂｊ」も配列インデクス型カラムであることが分かる。
【０１１０】
クエリパーサ２０１は、ＧｒｏｕｐＢｙオペレータ管理情報４４０にエントリを生成し、解析結果に基づいて、生成されたエントリに必要な情報を格納する。
【０１１１】
以上が、ステップＳ５０２の処理の説明である。なお、前述した処理は一例であって本発明はこれに限定されない。
【０１１２】
次に、ストリームデータ処理部１１０は、オペレータのループ処理を開始する（ステップＳ５０３）。具体的には、以下のような処理が実行される。
【０１１３】
ストリームデータ処理部１１０は、クエリ構築部２０３を呼び出し、処理の開始を指示する。クエリ構築部２０３は、クエリ最適化部２０４を呼び出し、処理の開始を指示する。
【０１１４】
クエリ最適化部２０４は、クエリグラフ構成情報２０２のオペレータ管理情報４１０を参照し、分析シナリオ１３２に含まれるオペレータの中から処理対象のオペレータを一つ選択する。ここでは、オペレータ管理情報４１０の上のエントリから順に選択するものとする。なお、本発明は、オペレータの選択方法に限定されない。
【０１１５】
クエリ最適化部２０４は、選択されたオペレータがＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータであるか否かを判定する（ステップＳ５０４）。
【０１１６】
具体的には、クエリ最適化部２０４は、選択されたオペレータに対応するエントリのタイプ４１２が「Ｐａｒｔｉｔｉｏｎ」であるか否かを判定する。タイプ４１２が「Ｐａｒｔｉｔｉｏｎ」である場合、クエリ最適化部２０４は、選択されたオペレータがＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータであると判定する。
【０１１７】
選択されたオペレータがＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータでないと判定された場合、クエリ最適化部２０４は、ステップＳ５０６に進む。
【０１１８】
選択されたオペレータがＰａｒｔｉｔｉｏｎウィンドウ演算に対応するオペレータであると判定された場合、クエリ最適化部２０４は、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５を呼び出し、処理の開始を指示する（ステップＳ５０５）。なお、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５が実行する処理については、図６を用いて後述する。
【０１１９】
クエリ最適化部２０４は、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５から処理結果が出力されるまで待ち状態となる。
【０１２０】
クエリ最適化部２０４は、選択されたオペレータがＪｏｉｎオペレータであるか否かを判定する（ステップＳ５０６）。
【０１２１】
具体的には、クエリ最適化部２０４は、選択されたオペレータに対応するエントリのタイプ４１２が「Ｊｏｉｎ」であるか否かを判定する。タイプ４１２が「Ｊｏｉｎ」である場合、クエリ最適化部２０４は、選択されたオペレータがＪｏｉｎオペレータであると判定する。
【０１２２】
選択されたオペレータがＪｏｉｎオペレータでないと判定された場合、クエリ最適化部２０４は、ステップＳ５０８に進む。
【０１２３】
選択されたオペレータがＪｏｉｎオペレータであると判定された場合、クエリ最適化部２０４は、Ｊｏｉｎオペレータ最適化部２０６を呼び出し、処理の開始を指示する（ステップＳ５０７）。なお、Ｊｏｉｎオペレータ最適化部２０６が実行する処理については、図７を用いて後述する。
【０１２４】
クエリ最適化部２０４は、Ｊｏｉｎオペレータ最適化部２０６から処理結果が出力されるまで待ち状態となる。
【０１２５】
クエリ最適化部２０４は、選択されたオペレータがＧｒｏｕｐＢｙオペレータであるか否かを判定する（ステップＳ５０８）。
【０１２６】
具体的には、クエリ最適化部２０４は、選択されたオペレータに対応するエントリのタイプ４１２が「ＧｒｏｕｐＢｙ」であるか否かを判定する。タイプ４１２が「ＧｒｏｕｐＢｙ」である場合、クエリ最適化部２０４は、選択されたオペレータがＧｒｏｕｐＢｙオペレータであると判定する。
【０１２７】
選択されたオペレータがＧｒｏｕｐＢｙオペレータでないと判定された場合、クエリ最適化部２０４は、ステップＳ５１０に進む。
【０１２８】
選択されたオペレータがＧｒｏｕｐＢｙオペレータであると判定された場合、クエリ最適化部２０４は、ＧｒｏｕｐＢｙオペレータ最適化部２０７を呼び出し、処理の開始を指示する（ステップＳ５０９）。
【０１２９】
クエリ最適化部２０４は、ＧｒｏｕｐＢｙオペレータ最適化部２０７から処理結果が出力されるまで待ち状態となる。クエリ最適化部２０４は、ＧｒｏｕｐＢｙオペレータ最適化部２０７から処理結果が出力された後、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５、Ｊｏｉｎオペレータ最適化部２０６、又はＧｒｏｕｐＢｙオペレータ最適化部２０７から出力された処理結果をクエリ構築部２０３に出力し、処理を終了する。
【０１３０】
クエリ構築部２０３は、クエリグラフ構成情報２０２、及びクエリ最適化部２０４から出力された処理結果に基づいて、オペレータ実行部２１１を生成する（ステップＳ５１０）。具体的には、以下のような処理が実行される。
【０１３１】
クエリ構築部２０３は、クエリグラフ構成情報２０２に基づいて、処理の実行に必要な設定情報を生成し、また、クエリ最適化部２０４から出力された処理結果に基づいて、オペレータのデータ格納領域の設定情報を生成する。
【０１３２】
クエリ構築部２０３は、生成された各設定情報に基づいて、オペレータ実行部２１１を生成する。また、クエリ構築部２０３は、生成されたオペレータ実行部２１１をクエリ実行部２１０に登録する。
【０１３３】
以上がステップＳ５１０の処理の説明である。
【０１３４】
次に、クエリ最適化部２０４は、分析シナリオ１３２に含まれる全てのオペレータについて処理を完了したか否かを判定する（ステップＳ５１１）。
【０１３５】
分析シナリオ１３２に含まれる全てのオペレータについて処理が完了していないと判定された場合、クエリ最適化部２０４は、ステップＳ５０３に戻り、同様の処理を実行する。
【０１３６】
分析シナリオ１３２に含まれる全てのオペレータについて処理が完了したと判定された場合、クエリ最適化部２０４は、処理を終了する。
【０１３７】
なお、ストリームデータ処理部１１０は、分析シナリオ１３２の受付を契機に処理を開始しているが、処理開始の契機はこれに限定されない。例えば、ストリームデータ処理部１１０は、受け付けた分析シナリオ１３２をストレージ装置１０５等に格納し、ユーザ等から処理開始の指示が入力された場合に、処理を開始してもよい。
【０１３８】
図６は、本発明の実施例１のＰａｒｔｉｔｉｏｎウィンドウ最適化部２０５が実行する処理を説明するフローチャートである。
【０１３９】
Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、クエリ最適化部２０４から呼び出されると以下で説明する処理を開始する。このとき、クエリ最適化部２０４は、処理対象のオペレータの識別情報（オペレータＩＤ）を出力する。
【０１４０】
Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、クエリグラフ構成情報２０２に含まれるＰａｒｔｉｔｉｏｎウィンドウ管理情報４２０を参照し、グループ分け対象のカラムに配列インデクス型カラムが含まれるか否かを判定する（ステップＳ６０１）。具体的には、以下のような処理が実行される。
【０１４１】
Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０を参照し、オペレータＩＤ４２１が入力されたオペレータの識別情報と一致するエントリを検索する。
【０１４２】
Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、検索されたエントリのＧｒｏｕｐｉｎｇカラム４２３とＡｒｒａｙ  Ｉｎｄｅｘカラム４２４とを比較し、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４に、Ｇｒｏｕｐｉｎｇカラム４２３に格納されるカラムと一致するカラムが一つ以上存在するか否かを判定する。
【０１４３】
なお、Ｇｒｏｕｐｉｎｇカラム４２３がグループ分け対象のカラムに対応し、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４が配列インデクス型カラムに対応する。
【０１４４】
Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４に、Ｇｒｏｕｐｉｎｇカラム４２３に格納されるカラムと一致するカラムが一つ以上存在する場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、グループ分け対象のカラムに配列インデクス型カラムが含まれると判定する。
【０１４５】
以上がステップＳ６０１の処理の説明である。
【０１４６】
グループ分け対象のカラムに配列インデクス型カラムが含まれないと判定された場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、データ格納領域の設定情報が必要ない旨を処理結果として、クエリ最適化部２０４に出力し（ステップＳ６０６）、処理を終了する。
【０１４７】
グループ分け対象のカラムに配列インデクス型カラムが含まれると判定された場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０に基づいて、グループ分け対象のカラムを配列インデクス型カラムと通常型カラムとに分類する（ステップＳ６０２）。
【０１４８】
Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、分類結果に基づいて、グループ分け対象のカラムの中に通常型カラムが含まれるか否かを判定する（ステップＳ６０３）。
【０１４９】
例えば、Ｇｒｏｕｐｉｎｇカラム４２３に格納される全てのカラムの識別情報が、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４に格納される場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、グループ分け対象のカラムの中に、通常型カラムが含まれないと判定する。
【０１５０】
図４に示す例では、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、グループ分け対象のカラムの中に通常型カラムが含まれないと判定する。
【０１５１】
グループ分け対象のカラムの中に、通常型カラムが含まれないと判定された場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、データ格納領域におけるデータ構造を決定する（ステップＳ６０４）。その後、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、決定されたデータ格納領域におけるデータ構造の情報を処理結果として出力し（ステップＳ６０６）、処理を終了する。
【０１５２】
具体的には、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、配列インデクス型カラムの数と同数の次元の配列としてタプルを保持するように決定する。
【０１５３】
図４に示す例では、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４には、カラム「ｉ」、「ｊ」の二つ２つのカラムの識別情報が格納される。したがって、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、２次元配列としてタプルを保持するように決定する。
【０１５４】
グループ分け対象のカラムの中に通常型カラムが含まれると判定された場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、データ格納領域におけるデータ構造を決定する（ステップＳ６０５）。その後、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、決定されたデータ格納領域におけるデータ構造の情報を処理結果として出力し（ステップＳ６０６）、処理を終了する。
【０１５５】
具体的には、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、通常型カラムをキーとし、配列インデクス型カラムの数と同数の次元の配列を値とするハッシュマップとしてタプルを保持するように決定する。
【０１５６】
例えば、配列インデクス型カラム「ｉ」、「ｊ」、通常型カラム「ｋ」を含むタプルの場合、Ｐａｒｔｉｔｉｏｎウィンドウ最適化部２０５は、通常型カラム「ｋ」をキーとし、２次元配列を値とするハッシュマップとしてタプルを保持するように決定する。
【０１５７】
以上のように決定したデータ構造は、データ格納領域の設定情報として、オペレータ実行部２１１に保持する。オペレータ実行部２１１は、クエリ実行時に、当該設定情報に従って各タプルのデータを一時保存する。
【０１５８】
当該設定情報は、データ格納領域の形態（すなわち、多次元配列又はハッシュマップの何れであるか）と、多次元配列又はハッシュマップに関する情報から構成される。多次元配列又はハッシュマップに関する情報は、多次元配列の場合、各次元の配列インデクス型カラムの名前が含まれ、ハッシュマップの場合、ハッシュマップのキーとなる通常型カラムの名前、及びハッシュマップの値となる多次元配列の、各次元の配列インデクス型カラムの名前が含まれる。
【０１５９】
例えば、上記の二つの例における設定情報は、（形態＝多次元配列，配列インデクスカラム＝「ｉ」、「ｊ」）、及び（形態＝ハッシュマップ，ハッシュキーカラム＝「ｋ」，配列インデクスカラム＝「ｉ」、「ｊ」）のように表現される。
【０１６０】
図７は、本発明の実施例１のＪｏｉｎオペレータ最適化部２０６が実行する処理を説明するフローチャートである。
【０１６１】
Ｊｏｉｎオペレータ最適化部２０６は、クエリ最適化部２０４から呼び出されると以下で説明する処理を開始する。このとき、クエリ最適化部２０４は、処理対象のオペレータの識別情報（オペレータＩＤ）を出力する。
【０１６２】
Ｊｏｉｎオペレータ最適化部２０６は、クエリグラフ構成情報２０２に含まれるＪｏｉｎオペレータ管理情報４３０を参照し、入力スキーマに配列インデクス型カラムが含まれるか否かを判定する（ステップＳ７０１）。具体的には、以下のような処理が実行される。
【０１６３】
Ｊｏｉｎオペレータ最適化部２０６は、オペレータ管理情報４１０を参照し、オペレータＩＤ４１１が入力されたオペレータの識別情報と一致するエントリを検索する。
【０１６４】
Ｊｏｉｎオペレータ最適化部２０６は、検索されたエントリの入力４１３を参照し、入力先のオペレータの識別情報を取得する。また、Ｊｏｉｎオペレータ最適化部２０６は、検索されたエントリのタイプ４１２に基づいて、参照する管理情報を特定する。
【０１６５】
図４に示す例では、オペレータＩＤ４１１が「１」、「２」のタイプ４１２が「Ｐａｒｔｉｔｉｏｎ」であるため、Ｊｏｉｎオペレータ最適化部２０６は、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０を参照する。
【０１６６】
Ｊｏｉｎオペレータ最適化部２０６は、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０を参照し、取得されたオペレータの識別情報と一致するエントリを検索する。Ｊｏｉｎオペレータ最適化部２０６は、検索されたエントリのＡｒｒａｙ  Ｉｎｄｅｘカラム４２４に格納されるカラムの識別情報を取得する。
【０１６７】
Ｊｏｉｎオペレータ最適化部２０６は、Ｊｏｉｎオペレータ管理情報４３０を参照し、オペレータＩＤ４３１が入力されたオペレータの識別情報と一致するエントリを検索する。
【０１６８】
Ｊｏｉｎオペレータ最適化部２０６は、検索されたエントリの入力カラム４３２から、入力スキーマのカラムの識別情報を取得する。
【０１６９】
Ｊｏｉｎオペレータ最適化部２０６は、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４から取得されたカラムの識別情報と、入力カラム４３２から取得されたカラムの識別情報とを比較し、Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４に格納されるカラムと一致するカラムが入力カラム４３２に一つ以上存在するか否かを判定する。
【０１７０】
Ａｒｒａｙ  Ｉｎｄｅｘカラム４２４に格納されるカラムと一致するカラムが入力カラム４３２に一つ以上存在する場合、Ｊｏｉｎオペレータ最適化部２０６は、入力スキーマに配列インデクス型カラムが含まれると判定する。
【０１７１】
以上がステップＳ７０１の処理の説明である。
【０１７２】
入力スキーマに配列インデクス型カラムが含まれないと判定された場合、Ｊｏｉｎオペレータ最適化部２０６は、データ格納領域の設定情報が必要ない旨を処理結果として、クエリ最適化部２０４に出力し（ステップＳ７０４）、処理を終了する。
【０１７３】
入力スキーマに配列インデクス型カラムが含まれると判定された場合、Ｊｏｉｎオペレータ最適化部２０６は、Ｊｏｉｎオペレータにおける結合条件が配列インデクス型カラムに関する結合条件であるか否かを判定する（ステップＳ７０２）。具体的には、以下のような処理が実行される。
【０１７４】
Ｊｏｉｎオペレータ最適化部２０６は、Ｐａｒｔｉｔｉｏｎウィンドウ管理情報４２０から検索されたエントリのＡｒｒａｙ  Ｉｎｄｅｘカラム４２４と、Ｊｏｉｎオペレータ管理情報４３０から検索されたエントリのＪｏｉｎカラム４３３とを参照する。
【０１７５】
Ｊｏｉｎオペレータ最適化部２０６は、Ｊｏｉｎカラム４３３に格納される結合条件が配列インデクス型カラムに関する結合条件であるか否かを判定する。
【０１７６】
図４に示す例では、Ｊｏｉｎカラム４３３には、配列インデクス型カラムであるカラム「Ａ．ｊ」とカラム「Ｂ．ｉ」に関する結合条件が格納される。したがって、Ｊｏｉｎオペレータ最適化部２０６は、Ｊｏｉｎオペレータにおける結合条件が配列インデクス型カラムに関する結合条件であると判定する。
【０１７７】
以上がステップＳ７０２の処理の説明である。
【０１７８】
Ｊｏｉｎオペレータにおける結合条件が配列インデクス型カラムに関する結合条件でないと判定された場合、Ｊｏｉｎオペレータ最適化部２０６は、データ格納領域の設定情報が必要ない旨を処理結果として、クエリ最適化部２０４に出力し（ステップＳ７０４）、処理を終了する。
【０１７９】
Ｊｏｉｎオペレータにおける結合条件が配列インデクス型カラムに関する結合条件であると判定された場合、Ｊｏｉｎオペレータ最適化部２０６は、データ格納領域におけるデータ構造を決定する（ステップＳ７０３）。その後、Ｊｏｉｎオペレータ最適化部２０６は、決定されたデータ格納領域におけるデータ構造の情報を処理結果として出力し（ステップＳ７０４）、処理を終了する。
【０１８０】
具体的には、Ｊｏｉｎオペレータ最適化部２０６は、配列インデクス型カラムの数と同数の次元の配列としてタプルを保持するように決定する。
【０１８１】
図４に示す例では、ストリームデータＡのＡｒｒａｙ  Ｉｎｄｅｘカラム４２４には、カラム「ｉ」、「ｊ」の二つのカラムの識別情報が格納される。したがって、Ｊｏｉｎオペレータ最適化部２０６は、２次元配列として入力ストリームＡに含まれるタプルを保持するように決定する。ストリームデータＢについても同様である。
【０１８２】
図８は、本発明の実施例１のＧｒｏｕｐＢｙオペレータ最適化部２０７が実行する処理を説明するフローチャートである。
【０１８３】
ＧｒｏｕｐＢｙオペレータ最適化部２０７は、クエリ最適化部２０４から呼び出されると以下で説明する処理を開始する。このとき、クエリ最適化部２０４は、処理対象のオペレータの識別情報（オペレータＩＤ）を出力する。
【０１８４】
ＧｒｏｕｐＢｙオペレータ最適化部２０７は、クエリグラフ構成情報２０２に含まれるＧｒｏｕｐＢｙオペレータ管理情報４４０を参照し、グループ分け対象のカラムに配列インデクス型カラムが含まれるか否かを判定する（ステップＳ８０１）。具体的には、以下のような処理が実行される。
【０１８５】
ＧｒｏｕｐＢｙオペレータ最適化部２０７は、ＧｒｏｕｐＢｙオペレータ管理情報４４０を参照し、オペレータＩＤ４４１が入力されたオペレータの識別情報と一致するエントリを検索する。
【０１８６】
ＧｒｏｕｐＢｙオペレータ最適化部２０７は、検索されたエントリのＧｒｏｕｐｉｎｇカラム４４３とＡｒｒａｙ  Ｉｎｄｅｘカラム４４４とを比較し、Ｇｒｏｕｐｉｎｇカラム４４３に格納されるカラムと一致するカラムがＡｒｒａｙ  Ｉｎｄｅｘカラム４４４に一つ以上存在するか否かを判定する。
【０１８７】
Ｇｒｏｕｐｉｎｇカラム４４３に格納されるカラムと一致するカラムが一つ以上存在する場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、グループ分け対象のカラムに配列インデクス型カラムが含まれると判定する。
【０１８８】
以上がステップＳ８０１の処理の説明である。
【０１８９】
グループ分け対象のカラムに配列インデクス型カラムが含まれないと判定された場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、データ格納領域の設定情報が必要ない旨を処理結果として、クエリ最適化部２０４に出力し（ステップＳ８０６）、処理を終了する。
【０１９０】
グループ分け対象のカラムに配列インデクス型カラムが含まれると判定された場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、ＧｒｏｕｐＢｙオペレータ管理情報４４０に基づいて、グループ分け対象のカラムを配列インデクス型カラムと通常型カラムとに分類する（ステップＳ８０２）。
【０１９１】
ＧｒｏｕｐＢｙオペレータ最適化部２０７は、分類結果に基づいて、グループ分け対象のカラムの中に通常型カラムが含まれるか否かを判定する（ステップＳ８０３）。
【０１９２】
例えば、Ｇｒｏｕｐｉｎｇカラム４４３に格納される全てのカラムの識別情報が、Ａｒｒａｙ  Ｉｎｄｅｘカラム４４４に格納される場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、グループ分け対象のカラムの中に、通常型カラムが含まれないと判定する。
【０１９３】
図４に示す例では、Ａｒｒａｙ  Ｉｎｄｅｘカラム４４４に、Ｇｒｏｕｐｉｎｇカラム４４３に格納される全てのカラム「Ａ．ｉ」、カラム「Ｂ．ｊ」が格納されるため、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、グループ分け対象のカラムの中に、通常型カラムが含まれないと判定する。
【０１９４】
グループ分け対象のカラムの中に通常型カラムが含まれないと判定された場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、データ格納領域におけるデータ構造を決定する（ステップＳ８０４）。その後、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、決定されたデータ格納領域におけるデータ構造の情報を処理結果として出力し（ステップＳ８０６）、処理を終了する。
【０１９５】
具体的には、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、配列インデクス型カラム、かつ、グループ分け対象のカラムであるカラムの数と同数の次元の配列として集計値を保持するように決定する。
【０１９６】
図４に示す例では、Ａｒｒａｙ  Ｉｎｄｅｘカラム４４４には、カラム「Ａ．ｉ」、カラム「Ａ．ｊ」、カラム「Ｂ．ｉ」、及びカラム「Ｂ．ｊ」が格納され、Ｇｒｏｕｐｉｎｇカラム４４３には、カラム「Ａ．ｉ」、及びカラム「Ｂ．ｊ」が格納される。そのため、配列インデクス型カラム、かつ、Ｇｒｏｕｐｉｎｇカラムであるカラムの数は「２」となる。したがって、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、２次元配列として集計値を保持するように決定する。
【０１９７】
グループ分け対象のカラムの中に通常型カラムが含まれると判定された場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、データ格納領域におけるデータ構造を決定する（ステップＳ８０５）。その後、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、決定されたデータ格納領域におけるデータ構造の情報を処理結果として出力し（ステップＳ８０６）、処理を終了する。
【０１９８】
具体的には、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、通常型カラムをキーとし、配列インデクス型カラム、かつ、グループ分け対象の数と同数の次元の配列を値とするハッシュマップとしてタプルを保持するように決定する。
【０１９９】
例えば、配列インデクス型カラム「Ａ．ｉ」、「Ｂ．ｊ」、通常型カラム「Ａ．ｋ」を含むタプルの場合、ＧｒｏｕｐＢｙオペレータ最適化部２０７は、通常型カラム「Ａ．ｋ」をキーとし、２次元配列を値とするハッシュマップとして集計値を保持するように決定する。
【０２００】
以上が、各最適化部が実行する処理の説明である。本実施例では、各最適化部が、配列インデクス型カラム等の情報に基づいて、処理に最適なデータ構造を決定する。また、クエリ構築部２０３は、図６から図８を用いて説明した処理結果に基づいて、オペレータのデータ格納領域の設定情報を生成する。これによって、オペレータ実行部２１１は、クエリの実行時に、当該データ格納領域の設定情報に基づいて、処理に最適なデータ構造のデータを管理できる。
【０２０１】
多次元配列のデータを管理することによって、各オペレータにおける処理の効率を向上させることが可能となる。また、多次元配列として管理する必要がない場合には、通常のタプルとして扱う。これによって、不要なメモリの消費を低減することができる。すなわち、メモリの利用効率を向上させることができる。
【０２０２】
これは、全てのタプルを多次元配列として保持すると、不必要なインデクスが生成されることによって、メモリの消費量が増大する可能性があるためである。そのため、本実施例では、クエリ最適化部２０４が、クエリグラフの解析結果に基づいて、検索処理の効率化、及びメモリ消費量の削減が可能なデータの管理方法を決定する。
【０２０３】
ここで、クエリ実行時におけるデータの取り扱いの一例を説明する。
【０２０４】
なお、以下の説明では、クエリ実行部２１０にクエリグラフに含まれる全てのオペレータのオペレータ実行部２１１が登録されているものとする。
【０２０５】
図９は、本発明の実施例１のオペレータ間のデータの流れを示す説明図である。
【０２０６】
図９に示すクエリグラフは、図３に示す分析シナリオ１３２に対応するクエリグラフである。図９に示すクエリグラフには、Ｐａｒｔｉｔｉｏｎウィンドウ９０１−１、９０１−２、Ｊｏｉｎオペレータ９０２、ＧｒｏｕｐＢｙオペレータ９０３の四つのオペレータが含まれる。したがって、クエリ実行部２１０には、四つのオペレータ実行部２１１が登録される。
【０２０７】
以下の説明では、Ｐａｒｔｉｔｉｏｎウィンドウ９０１−１に対応するオペレータ実行部２１１を第１のオペレータ実行部と記載し、Ｐａｒｔｉｔｉｏｎウィンドウ９０１−２に対応するオペレータ実行部２１１を第２のオペレータ実行部と記載し、Ｊｏｉｎオペレータ９０２に対応するオペレータ実行部２１１を第３のオペレータ実行部と記載し、ＧｒｏｕｐＢｙオペレータ９０３に対応するオペレータ実行部２１１を第４のオペレータ実行部と記載する。
【０２０８】
Ｐａｒｔｉｔｉｏｎウィンドウ９０１−１には、カラム「ｉ」、カラム「ｊ」、カラム「ｖ」を含む入力タプル９２１、９２２、９２３が入力される。
【０２０９】
このとき、第１のオペレータ実行部は、入力タプルを２次元配列として保持するように設定されているため、入力タプル９２１、９２２、９２３を、２次元配列としてデータ格納領域９１１−１に保持する。
【０２１０】
また、第１のオペレータ実行部は、カラム「ｉ」、カラム「ｊ」の組合せ毎に１つの値を抽出し、カラム「ｉ」、カラム「ｊ」及び抽出された値のカラムから構成されるタプル９３１、９３２、９３３をＪｏｉｎオペレータ９０２に出力する。
【０２１１】
第２のオペレータ実行部も同様に、入力タプル９２４、９２５、９２６を２次元配列としてデータ格納領域９１１−２に保持する。
【０２１２】
第３のオペレータ実行部は、Ｐａｒｔｉｔｉｏｎウィンドウ９０１−１及びＰａｒｔｉｔｉｏｎウィンドウ９０１−２のそれぞれから出力されるタプルを２次元配列として保持するように設定されている。したがって、第３のオペレータ実行部は、タプル９３１、９３２、９３３を２次元配列としてデータ格納領域９１２に保持し、また、タプル９３４、９３５、９３６を２次元配列としてデータ格納領域９１２に保持する。
【０２１３】
第３のオペレータ実行部は、カラム「Ａ．ｊ」とカラム「Ｂ．ｊ」とが一致するタプルを結合するために、入力ストリームＡの列の位置と、入力ストリームＢの行の位置とが同一となる要素を結合する。
【０２１４】
第３のオペレータ実行部は、入力ストリームＡの要素の位置をカラム「Ａ．ｉ」、カラム「Ａ．ｊ」とし、入力ストリームＢの要素の位置をカラム「Ｂ．ｉ」、カラム「Ｂ．ｊ」とし、さらに、結合された入力ストリームＡの要素をカラム「Ａ．ｖ」、結合された入力ストリームＢの要素をカラム「Ｂ．ｖ」とするタプル９４１、９４２、９４３を出力する。
【０２１５】
本実施例では、１８個のタプルが出力されることとなる。
【０２１６】
第４のオペレータ実行部は、カラム「Ａ．ｉ」とカラム［Ｂ．ｊ］とに基づいて、Ｊｏｉｎオペレータ９０２から出力されたタプルを複数のグループに分ける。また、第４のオペレータ実行部は、グループ毎に、タプルの要素の積を算出し、さらに、各タプルの積の合計値を算出する。
【０２１７】
第４のオペレータ実行部は、集計結果を２次元配列として保持するように設定されているため、各グループの合計値を２次元配列としてデータ格納領域９１３に保持する。
【０２１８】
また、第４のオペレータ実行部は、合計値が格納される位置をカラム「Ａ．ｉ」、カラム「Ｂ．ｊ」とし、合計値をカラム「ｖ」とするタプル９５１、９５２、９５３を処理結果として出力する。
【０２１９】
以上で説明したように、多次元配列としてデータを管理することによってオペレータの処理効率を向上することができる。また、各オペレータのデータ格納領域に最適なデータ形式が決定されるため、メモリ消費量を低減することができる。
【０２２０】
図１０は、本発明の実施例１におけるオペレータ間のデータの流れを示す説明図である。
【０２２１】
図１０は、一つのタプルの値の更新に伴った、データの流れを示す。
【０２２２】
Ｐａｒｔｉｔｉｏｎウィンドウ９０１−２に新たなタプル１００１が入力された場合、第２のオペレータ実行部は、ストリームデータＢの２次元配列の位置に基づいて、入力されたタプルに含まれるインデクスに一致するデータを検索する。
【０２２３】
Ｐａｒｔｉｔｉｏｎウィンドウ９０１−２では、カラム「ｉ」、「ｊ」の組合せに対して、一つの値しか存在することができないため、検索されたデータが削除されることとなる。したがって、第２のオペレータ実行部は、削除されるデータのタプル１００２、更新されるデータのタプル１００３をＪｏｉｎオペレータ９０２に出力する。
【０２２４】
第３のオペレータ実行部は、削除されるデータに関連するタプルを結合し、結合結果をタプル１００４、１００６、１００８として出力し、また、更新されるデータに関連するタプルを結合し、結合結果をタプル１００５、１００７、１００９として出力する。
【０２２５】
第４のオペレータ実行部は、Ｊｏｉｎオペレータから入力されたタプルに含まれるカラム「Ａ．ｉ」、カラム「Ｂ．ｊ」を参照し、更新される集計値の位置を特定する。第４のオペレータ実行部は、特定された集計値の位置から値を読み出し、また、特定された集計値に関する集計処理を実行する。
【０２２６】
さらに、第４のオペレータ実行部は、削除される集計値のタプル１０１０、１０１２、１０１４を出力し、更新される集計値のタプル１０１１、１０１３、１０１５を出力する。
【０２２７】
本実施例では、多次元配列でデータを管理することによって、一部の要素の更新時に伴った処理を高速に実行することができる。
【０２２８】
本実施例では、一つのストリームデータ処理サーバ１００がストリームデータの処理を実行したが本発明はこれに限定されない。
【０２２９】
例えば、複数のサーバから構成される計算機システムであってもよい。この場合、複数のサーバの各々が、ストリームデータ処理部１１０を備える形態が考えられる。また、ストリームデータ処理部１１０の各機能部を複数のサーバに分散して配置してもよい。
【０２３０】
また、一つのサーバ上に複数の仮想サーバを生成し、当該仮想サーバを用いて同様の構成を実現してもよい。
【０２３１】
以上で説明したように、実施例１によれば、クエリグラフの解析に基づいて、オペレータのデータ格納領域における最適なデータ構造を決定することができる。これによって、検索処理の高速化、及びメモリ使用量の低減が可能となる。また、行列の演算において、特殊な組込関数を定義する必要がないため、ユーザの開発効率を改善することができる。
【０２３２】
なお、本実施例で例示した種々のソフトウェアは、電磁的、電子的及び光学式等の種々の記録媒体（例えば、非一時的な記憶媒体）に格納可能であり、インターネット等の通信網を通じて、コンピュータにダウンロード可能である。
【０２３３】
さらに、本実施例では、ソフトウェアによる制御を用いた例について説明したが、その一部をハードウェアによって実現することも可能である。
【０２３４】
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
【符号の説明】
【０２３５】
１００  ストリームデータ処理サーバ
１０１  プロセッサ
１０２  メモリ
１０３  バス
１０４  ネットワークインタフェース
１０５  ストレージ装置
１１０  ストリームデータ処理部
１２０  ホスト計算機
１２１  入力タプル
１３０  ホスト計算機
１３１  クエリ登録インタフェース
１３２  分析シナリオ
１４０  ホスト計算機
１４１  出力タプル
１５０  ネットワーク
２０１  クエリパーサ
２０２  クエリグラフ構成情報
２０３  クエリ構築部
２０４  クエリ最適化部
２０５  Ｐａｒｔｉｔｉｏｎウィンドウ最適化部
２０６  Ｊｏｉｎオペレータ最適化部
２０７  ＧｒｏｕｐＢｙオペレータ最適化部
２１０  クエリ実行部
２１１  オペレータ実行部
２２１  タプル入力部
２２２  タプル出力部
４１０  オペレータ管理情報
４２０  Ｐａｒｔｉｔｉｏｎウィンドウ管理情報
４３０  Ｊｏｉｎオペレータ管理情報
４４０  ＧｒｏｕｐＢｙオペレータ管理情報
９０１  Ｐａｒｔｉｔｉｏｎウィンドウ
９０２  Ｊｏｉｎオペレータ
９０３  ＧｒｏｕｐＢｙオペレータ
９１１、９１２、９１３  データ格納領域
【図１】
2015011484.tif 000003
【図２】
2015011484.tif 000004
【図３】
2015011484.tif 000005
【図４】
2015011484.tif 000006
【図５】
2015011484.tif 000007
【図６】
2015011484.tif 000008
【図７】
2015011484.tif 000009
【図８】
2015011484.tif 000010
【図９】
2015011484.tif 000011
【図１０】
2015011484.tif 000012
【図１１】
2015011484.tif 000013
【図１２】
2015011484.tif 000014