(57)【特許請求の範囲】
【請求項１】
少なくとも１つの要素を含む構造化文書を記憶するデータベースを各々有する複数の分散されたデータベースサーバに接続されたデータベース処理装置であって、
前記構造化文書に関する処理を要求する処理要求を受信する要求受信手段と、
前記処理要求によって要求された前記処理を行うために、実行単位毎の処理命令を含む処理プランを生成するプラン生成手段と、
前記処理プランに含まれる各前記処理命令を実行することにより、前記処理プランを実行するプラン実行手段と、
各前記処理命令の実行結果をレコード単位で記憶する記憶手段と、
前記記憶手段に記憶された前記実行結果を用いて、前記処理要求に応じた第１構造化文書を生成する結果生成手段と、
当該第１構造化文書を送信する結果送信手段とを備え、
前記プラン生成手段は、
前記処理要求に基づいて、処理対象の構造化文書に含まれる全部又は一部の要素を取得する少なくとも１つの第１処理命令を生成する第１生成手段と、
前記第１処理命令に従って取得される前記要素を含む結果データを用いて自然結合を行う第２処理命令を生成する第２生成手段と、
前記結果データを用いて直積結合を行う第３処理命令を生成する第３生成手段と、
前記第２処理命令を実行して行われる自然結合の実行結果と、前記第３処理命令を実行して行われる直積結合の実行結果とを用いて、各実行結果間の対応関係を更新する第４処理命令を生成する第４生成手段と、
前記第１処理命令乃至第４処理命令を結合することにより、前記処理プランを生成する結合手段と、
前記処理プランに含まれる前記第１処理命令について、前記全部又は一部の要素の取得を要求する少なくとも１つの取得要求を複数の前記データベースサーバに送信し、前記取得要求に従い取得された前記要素を含む結果データを複数の前記データベースサーバから各々受信する第５処理命令に変換する変換手段とを有する
ことを特徴とするデータベース処理装置。
【請求項２】
前記処理要求は、所定の規則により構造化された構文によって表現され、
前記プラン生成手段は、前記処理要求の表現される構文が入れ子構造を含む場合に、当該入れ子構造部分の構文について、前記第２処理命令乃至前記第４処理命令を生成する
ことを特徴とする請求項１に記載のデータベース処理装置。
【請求項３】
前記プラン実行手段は、
前記処理プランに含まれる前記第５処理命令を実行して、前記結果データを複数の前記データベースサーバから受信する第１実行手段と、
前記第２処理命令を実行して、前記結果データを用いて自然結合を行う第２実行手段と、
前記第３処理命令を実行して、前記結果データを用いて直積結合を行う第３実行手段と、
前記第４処理命令を実行して、前記第２処理命令の実行結果と前記第３処理命令の実行結果とを用いて前記実行結果間の対応関係を更新する第４実行手段とを有する
ことを特徴とする請求項１又は２に記載のデータベース処理装置。
【請求項４】
前記第１生成手段は、前記処理要求に基づいて、前記処理対象の構造化文書に含まれる全部又は一部要素を取得する取得要求と、前記取得要求を特定するための制御データとを含む前記第１処理命令を生成し、
前記変換手段は、前記第１処理命令について、前記取得要求及び前記制御データを前記複数のデータベースサーバに送信し、前記制御データに対応する前記取得要求に応じて送信される前記結果データと当該結果データを送信する前記データベースサーバとの対応関係を特定するヘッダが付加された前記結果データを複数の前記データベースサーバから各々受信する第５処理命令に変換し、
前記第１実行手段は、前記第５処理命令を実行して、前記結果データを複数の前記データベースサーバから受信し、これをレコード単位で集約すると共に、前記結果データに付加された前記ヘッダを用いて、前記取得要求に対応する前記結果データ及び当該結果データを送信する前記データベースサーバを一意に識別して、前記結果データの各レコードに対して当該各レコードを各前記データベースサーバにおいて一意に識別可能な識別子を付加して当該各レコードを当前記第５処理命令の実行結果として前記記憶手段に記憶させる
ことを特徴とする請求項３に記載のデータベース処理装置。
【請求項５】
前記第２実行手段は、前記第２処理命令を実行して、前記記憶手段に記憶された前記結果データの各レコードを用いて、自然結合を行って、その実行結果を前記記憶手段に記憶させ、
前記第３実行手段は、前記第３処理命令を実行して、前記記憶手段に記憶された前記結果データの各レコードを用いて、直積結合を行って、その実行結果を前記記憶手段に記憶させる
ことを特徴とする請求項４に記載のデータベース処理装置。
【請求項６】
前記第４実行手段は、前記第４処理命令を実行して、前記記憶手段に記憶された前記第２処理命令の前記実行結果及び前記第３処理命令の前記実行結果のそれぞれについて、当該実行結果の各レコードに含まれる複数の前記識別子を統合し、当該識別子に代えて、当該各レコードに対して当該レコードを一意に識別可能な新たな識別子を付加して当該各レコードを前記記憶手段に各々記憶させる
ことを特徴とする請求項５に記載のデータベース処理装置。
【請求項７】
前記処理要求によって要求された前記処理は、所定の演算を含み、
前記プラン生成手段は、前記第４処理命令を実行して対応関係が更新された各前記実行結果に対して、前記所定の演算を行う第７処理命令を生成する第６生成手段を有し、
前記結合手段は、前記１処理命令乃至第７処理命令を結合することにより、前記処理プランを生成し、
前記プラン実行手段は、前記処理プランに含まれる前記第７処理命令を実行して、前記記憶手段に記憶された前記第２処理命令の前記実行結果に含まれる各レコード及び前記第３処理命令の前記実行結果に含まれる各レコードに対して付加された前記新たな識別子によって前者の実行結果のレコード及び後者の実行結果のレコードの対応関係を識別して、これらの各レコードを用いて、前記所定の演算を行い、その実行結果を前記記憶手段に記憶させる第５実行手段を有し、
前記結果生成手段は、前記第５実行手段によって前記記憶手段に記憶された前記実行結果を用いて、前記第１構造化文書を生成する
ことを特徴とする請求項６に記載のデータベース処理装置。
【請求項８】
前記要求受信手段は、ＸＭＬ形式の前記構造化文書に対して、XQuery形式の前記処理要求を受信し、
前記結果生成手段は、前記処理要求に応じたＸＭＬ形式の前記第１構造化文書を生成する
ことを特徴とする請求項１乃至７のいずれか一項に記載のデータベース処理装置。
【請求項９】
要求受信手段と、プラン生成手段と、プラン実行手段と、各前記処理命令の実行結果をレコード単位で記憶する記憶手段と、結果生成手段と、結果送信手段とを備え、少なくとも１つの要素を含む構造化文書を記憶するデータベースを各々有する複数の分散されたデータベースサーバに接続されたデータベース処理装置において実現される情報処理方法であって、
前記要求受信手段が、前記構造化文書に関する処理を要求する処理要求を受信する要求受信ステップと、
前記プラン生成手段が、前記処理要求によって要求された前記処理を行うために、実行単位毎の処理命令を含む処理プランを生成するプラン生成ステップと、
前記プラン実行手段が、前記処理プランに含まれる各前記処理命令を実行することにより、前記処理プランを実行するプラン実行ステップと、
前記結果生成手段が、前記記憶手段に記憶された前記実行結果を用いて、前記処理要求に応じた第１構造化文書を生成する結果生成ステップと、
前記結果送信手段が、当該第１構造化文書を送信する結果送信ステップとを含み、
前記プラン生成手段が、
前記処理要求に基づいて、処理対象の構造化文書に含まれる全部又は一部の要素を取得する少なくとも１つの第１処理命令を生成する第１生成ステップと、
前記第１処理命令に従って取得される前記要素を含む結果データを用いて自然結合を行う第２処理命令を生成する第２生成ステップと、
前記結果データを用いて直積結合を行う第３処理命令を生成する第３生成ステップと、
前記第２処理命令を実行して行われる自然結合の実行結果と、前記第３処理命令を実行して行われる直積結合の実行結果とを用いて、各実行結果間の対応関係を更新する第４処理命令を生成する第４生成ステップと、
前記第１処理命令乃至第４処理命令を結合することにより、前記処理プランを生成する結合ステップと、
前記処理プランに含まれる前記第１処理命令について、前記全部又は一部の要素の取得を要求する少なくとも１つの取得要求を複数の前記データベースサーバに送信し、前記取得要求に従い取得された前記要素を含む結果データを複数の前記データベースサーバから各々受信する第５処理命令に変換する変換ステップと
を含むことを特徴とする情報処理方法。
【請求項１０】
請求項９に記載された方法をコンピュータで実行させることを特徴とする情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、階層構造を有する構造化文書を記憶するデータベースが複数に分散された分散データベースにおいて、構造化文書に対して処理を行うデータベース処理装置、情報処理方法及びプログラムに関するものである。
【背景技術】
【０００２】
近年、ＸＭＬ等の構造化文書の普及に伴い、構造化文書を記憶するデータベース（例えばＸＭＬデータベース）も利用される傾向になる。そして、このようなデータベースに対して問い合わせを行うための言語として、XQuery等が提案されている。XQueryは、ＸＭＬデータベースに対する問い合わせのための関数型言語であり、FLWR構文が特徴となっている。このFLWR構文は、for節、let節、where節、return節からなる構文をいう。このXQueryを用いた処理は、例えば非特許文献１に記載されている。 
【０００３】
そして、XQueryのFLWR構文において、for節はシーケンス内の各項目を変数にバインドする。これに対して、let節はシーケンスをまるごと変数にバインドする。このfor節とlet節を組み合わせることで、ＸＭＬに相応しい高度な問い合わせが行える(なお、XML再構成や集計はlet節無しでは表現できない)。 
【０００４】
XQueryの処理結果はシーケンスであり、入れ子問い合わせもlet節を使って呼び出せるため、これを入れ子節と呼ぶこともできる。このようにlet節はXQueryの根幹をなす構文であるが、実現方式については十分な検討がなされてこなかった。実際、let節をfor節と同様に扱ってしまうと、“シーケンス要素の欠損”や“結果件数の不足”などの問題が発生して処理が難しい。論文でもFWRのサンプルを使った処理方式に言及されているのみで、let節についての詳細な処理方式は不明である。
【０００５】
また、現在のデータベース製品では、let節は関数系言語の処理系に準じた実装をしていることが多い。関数系言語の処理系に準じた実装では、上述したような入れ子構造で問い合わせを行った場合、入れ子構造のうち外側のXQueryと、内側のXQueryとの間に入出力関係があるとみなされる。このため、外側のXQueryの処理が終了した後に、当該処理結果を、それぞれ変数として内側のXQueryに渡して処理が行われることになる。 
【０００６】
【非特許文献１】A Complete and Efficient Algebraic Compi
【発明の開示】
【発明が解決しようとする課題】
【０００７】
XQueryの高度な問い合わせを行うには、let節、あるいは入れ子節は不可欠である。一方、数少ない処理方式は、関数型言語の処理系に準じたものである。この処理方式によると、以下のような問題が発生する。特に２重以上のfor節と入れ子節とを含むXQueryでは計算量が増大するという問題である。このようなXQueryでは、外側の多重ループを処理してから内側を処理することになる。つまり、多重ループの回数だけ入れ子処理を呼び出す。入れ子処理の順序制約が発生している。実際の処理システムでは、XQueryやプログラムの書き換えなどで対処している。
【０００８】
また、ＸＭＬデータが複数のデータベースサーバに分散されコーディネータサーバがこれらと接続される分散ＸＭＬデータベースにおいては、新たな問題も発生する。上位for節でデータベースサーバから全てのＸＭＬデータを取り出さないと、下位の入れ子節を処理できないという問題である。そして、データベースサーバにある該当のＸＭＬ要素以下のデータを全てコーディネータサーバが受信しなければならない。データベースにあるＸＭＬ要素の件数が多ければ、あるいはサイズが大きければ、その転送コストは膨大なものになる。
【０００９】
このように、分散XMLデータベースでは、入れ子構造で問い合わせを行った場合、処理が複雑化して、転送するデータの量及び計算量が増大して、性能が劇的に劣化する恐れがある。
【００１０】
本発明は、上記に鑑みてなされたものであって、構造化文書を記憶するデータベースが複数に分散された分散データベースにおいて、構造化文書に対して処理を行う際に、転送するデータの量及び計算量を抑制可能なデータベース処理装置、情報処理方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するために、本発明は、少なくとも１つの要素を含む構造化文書を記憶するデータベースを各々有する複数の分散されたデータベースサーバに接続されたデータベース処理装置であって、前記構造化文書に関する処理を要求する処理要求を受信する要求受信手段と、前記処理要求によって要求された前記処理を行うために、実行単位毎の処理命令を含む処理プランを生成するプラン生成手段と、前記処理プランに含まれる各前記処理命令を実行することにより、前記処理プランを実行するプラン実行手段と、各前記処理命令の実行結果をレコード単位で記憶する記憶手段と、前記記憶手段に記憶された前記実行結果を用いて、前記処理要求に応じた第１構造化文書を生成する結果生成手段と、当該第１構造化文書を送信する結果送信手段とを備え、前記プラン生成手段は、前記処理要求に基づいて、処理対象の構造化文書に含まれる全部又は一部の要素を取得する少なくとも１つの第１処理命令を生成する第１生成手段と、前記第１処理命令に従って取得される前記要素を含む結果データを用いて自然結合を行う第２処理命令を生成する第２生成手段と、前記結果データを用いて直積結合を行う第３処理命令を生成する第３生成手段と、前記第２処理命令を実行して行われる自然結合の実行結果と、前記第３処理命令を実行して行われる直積結合の実行結果とを用いて、各実行結果間の対応関係を更新する第４処理命令を生成する第４生成手段と、前記第１処理命令乃至第４処理命令を結合することにより、前記処理プランを生成する結合手段と、前記処理プランに含まれる前記第１処理命令について、前記全部又は一部の要素の取得を要求する少なくとも１つの取得要求を複数の前記データベースサーバに送信し、前記取得要求に従い取得された前記要素を含む結果データを複数の前記データベースサーバから各々受信する第５処理命令に変換する変換手段とを有することを特徴とする。
【００１２】
また、本発明は、要求受信手段と、プラン生成手段と、プラン実行手段と、各前記処理命令の実行結果をレコード単位で記憶する記憶手段と、結果生成手段と、結果送信手段とを備え、少なくとも１つの要素を含む構造化文書を記憶するデータベースを各々有する複数の分散されたデータベースサーバに接続されたデータベース処理装置において実現される情報処理方法であって、前記要求受信手段が、前記構造化文書に関する処理を要求する処理要求を受信する要求受信ステップと、前記プラン生成手段が、前記処理要求によって要求された前記処理を行うために、実行単位毎の処理命令を含む処理プランを生成するプラン生成ステップと、前記プラン実行手段が、前記処理プランに含まれる各前記処理命令を実行することにより、前記処理プランを実行するプラン実行ステップと、前記結果生成手段が、前記記憶手段に記憶された前記実行結果を用いて、前記処理要求に応じた第１構造化文書を生成する結果生成ステップと、前記結果送信手段が、当該第１構造化文書を送信する結果送信ステップとを含み、前記プラン生成手段が、前記処理要求に基づいて、処理対象の構造化文書に含まれる全部又は一部の要素を取得する少なくとも１つの第１処理命令を生成する第１生成ステップと、前記第１処理命令に従って取得される前記要素を含む結果データを用いて自然結合を行う第２処理命令を生成する第２生成ステップと、前記結果データを用いて直積結合を行う第３処理命令を生成する第３生成ステップと、前記第２処理命令を実行して行われる自然結合の実行結果と、前記第３処理命令を実行して行われる直積結合の実行結果とを用いて、各実行結果間の対応関係を更新する第４処理命令を生成する第４生成ステップと、前記第１処理命令乃至第４処理命令を結合することにより、前記処理プランを生成する結合ステップと、前記処理プランに含まれる前記第１処理命令について、前記全部又は一部の要素の取得を要求する少なくとも１つの取得要求を複数の前記データベースサーバに送信し、前記取得要求に従い取得された前記要素を含む結果データを複数の前記データベースサーバから各々受信する第５処理命令に変換する変換ステップとを含むことを特徴とする。
【００１３】
また、本発明は、情報処理プログラムであって、上記の方法をコンピュータで実行させることを特徴とする。
【発明の効果】
【００１４】
本発明によれば、構造化文書を記憶するデータベースが複数に分散された分散データベースにおいて、構造化文書に対して処理を行う際に、転送するデータの量及び計算量を抑制することができる。
【発明を実施するための最良の形態】
【００１５】
以下に添付図面を参照して、この発明にかかるデータベース処理装置、情報処理方法及びプログラムの最良な実施の形態を詳細に説明する。
【００１６】
[第１の実施の形態]
（１）構成
図１は、本実施の形態にかかる分散ＸＭＬデータベースシステムの構成を例示する図である。分散ＸＭＬデータベースシステムは、アプリケーションプログラムが実行されるクライアントコンピュータ（以下、クライアントという）５０と、分散ＸＭＬデータベース５１とを有し、これらがネットワーク５２を介して接続されて構成される。分散ＸＭＬデータベース５１は１台のコーディネータサーバ６０と複数台のＤＢサーバ７０Ａ〜７０Ｃとを有する。ネットワーク５２は、例えば、ＬＡＮ（Local Area Network）、イントラネット、イーサネット（登録商標）又はインターネットなどである。
【００１７】
コーディネータサーバ６０は、クライアント５０と複数のＤＢサーバ７０Ａ〜７０Ｃと接続される。コーディネータサーバ６０は、処理を要求する処理要求をクライアント５０から受信し、当該処理要求に応じた処理を行い、その処理結果をクライアント５０に送信する。尚、ここでは、クライアント５０から受信される処理要求は、XQueryにより表現されたものとする。また、コーディネータサーバ６０は、クライアント５０から受信した処理要求に応じた処理を行う際に、後述のクエリフラグメントを含むプランを生成し、プランの実行時に、クエリフラグメントをＤＢサーバ７０Ａ〜７０Ｃに対して送信し、当該クエリフラグメントの実行結果をＤＢサーバ７０Ａ〜７０Ｃから受信し、当該実行結果を用いて処理を実行して処理結果データを生成してクライアント５０に送信する。
【００１８】
ＤＢサーバ７０Ａは、階層構造を有する構造化文書としてＸＭＬデータを記憶するＤＢ７００Ａを有し、コーディネータサーバ６０から送信されたクエリフラグメントを実行してＤＢ７００Ａから該当のＸＭＬデータを適宜取得し、取得したＸＭＬデータを含む結果データを実行結果としてコーディネータサーバ６０に送信する。ＤＢサーバ７０Ｂは、ＸＭＬデータを記憶するＤＢ７００Ｂを有し、ＤＢサーバ７０Ａと同様の機能を実現させる。ＤＢサーバ７０Ｃは、ＸＭＬデータを記憶するＤＢ７００Ｃを有し、ＤＢサーバ７０Ａと同様の機能を実現させる。尚、これらのＤＢサーバ７０Ａ〜７０Ｃには、各々を識別可能なＤＢサーバ番号が付与されているものとする。ここでは各ＤＢサーバ７０Ａ〜７０Ｃに付与されたＤＢサーバ番号は順に“db1”〜“db3”とする。尚、以降、ＤＢサーバ７０Ａ〜７０Ｃを各々区別しない場合には、単にＤＢサーバ７０と記載し、ＤＢ７００Ａ〜７００Ｃを各々区別しない場合には、単にＤＢ７００と記載する。
【００１９】
尚、クライアント５０、コーディネータサーバ６０及びＤＢサーバ７０は各々、装置全体の制御を行うＣＰＵ（Central Processing Unit）等の制御装置と、各種データや各種プログラムを記憶するＲＯＭ（Read Only Memory）やＲＡＭ（Random Access Memory）等の記憶装置と、各種データや各種プログラムを記憶するＨＤＤ（Hard Disk Drive）やＣＤ（Compact Disk）ドライブ装置等の外部記憶装置と、情報を表示するディスプレイ装置等の表示装置と、ユーザが各種処理要求を入力するためのキーボードやマウス等の入力装置と、ネットワーク５２を介して外部のコンピュータと通信を行う通信制御装置と、これらを接続するバスとを備えており、通常のコンピュータを利用したハードウェア構成となっている。このような構成において、ＤＢ７００は、ＤＢサーバ７０の有する外部記憶装置に格納されている。但し、ＤＢ７００は、ＤＢサーバ７０の有するＲＡＭなどの記憶装置に格納されていても良い。
【００２０】
このようなハードウェア構成において、コーディネータサーバ６０が、記憶装置や外部記憶装置に記憶された各種プログラムを実行することにより実現される各種機能について説明する。以下に、コーディネータサーバ６０において実現される各種機能の実体となる各部について説明する。コーディネータサーバ６０は、クエリ受信部６００と、プラン生成部６０１と、プラン実行部６０２と、結果データ送信部６０３とを有する。
【００２１】
クエリ受信部６００は、クライアント５０から送信された処理要求（XQuery）を受信する。プラン生成部６０１は、クエリ受信部６００が受信したXQueryを解析し、解析結果に応じて、クエリフラグメントを含むプランを生成する。プラン実行部６０２は、プラン生成部６０１が生成したプランを実行して、クライアント５０から送信されたXQueryに応じたＸＭＬデータを処理結果データとして生成する。尚、プラン実行部６０２は、プランの実行時に、クエリフラグメントをＤＢサーバ７０Ａ〜７０Ｃに対して送信し、当該クエリフラグメントの実行結果をＤＢサーバ７０Ａ〜７０Ｃから受信し、当該実行結果を用いて処理を実行して処理結果データを生成する。結果データ送信部６０３は、プラン実行部６０２が生成した処理結果データとしてクライアント５０に送信する。
【００２２】
尚、ＸＭＬデータは、少なくとも１つの要素を含み各要素が階層付けられた文書構造をなしており、個々の要素(エレメント：Element)がタグ(Tag)を用いて記述された構造化文書である。図２は、ＸＭＬデータを例示する図である。同図に示されるように、ＸＭＬデータにおいては、要素の始まりを示すタグ(開始タグ)と、終わりを示すタグ(終了タグ)との２つのタグでデータが挟み込まれて、１つの要素が表現される。同図に示されるＸＭＬデータでは、筆頭筆者を示すデータが<author>というタグで挟み込まれ、タイトルを示すデータが<title>というタグで挟み込まれ、文書本体を示すデータが<body>というタグで挟み込まれている。なお、開始タグと終了タグとで挟み込まれたテキストデータは、当該開始タグと終了タグで表された１つの要素に含まれるテキスト要素(テキストノード)である。
【００２３】
次に、XQueryについて説明する。XQueryは、ＸＭＬデータを記憶するデータベース（ＸＭＬデータベース）に対する問い合わせのための関数型言語であり、for節、let節、where節及びreturn節を用いたFLWOR(for-let-where-return)構文が特徴になっている。ＲＤＢでの問い合わせ言語はSQLであるが、SQLは宣言的な言語であるのに対して、XQueryは関数型言語としての特徴を多く持つ。
【００２４】
以下に、XQueryの言語仕様を手続き的な観点で説明する。for節の構文は、「for 変数 in 式」である。for節の構文は、式を満足するものを変数に代入してループするという意味を持つ。let節の構文は、「let 変数 ：＝ 式」である。let節の構文は、式を満足するものを集約してシーケンスとして変数に代入するという意味を持つ。シーケンスとは、フラットなリストである。where節は、Fで繰り返されるループを制限するものである。where節の構文は、「where 式」である。where節の構文は、式を満足するものだけループをまわし、そうでないものはループをスキップするという意味を持つ。return節は、XQueryを処理した結果をフォーマット化するものである。return節の構文は、「return 式」である。return節の構文は、変数を含む任意のＸＭＬデータを記述することができる。変数の構文は、「＄文字列」である。入れ子問い合わせなどで２重宣言された場合を除き、同じ文字列を持つ変数は同一のものと見なされる。
【００２５】
ＸＭＬデータの要素間の階層条件を指定するパス演算子(PATH)として、XQueryでは以下のようなものがある。
・“/”       ：要素間は親子関係であることを示すパス演算子
・“//”：要素間は先祖子孫関係であることを示すパス演算子
・“.”：任意の要素
【００２６】
図３は、XQueryの一例を示す図である。同図に示されるXQueryは、「データベースのルートの子孫にある本(book：$x)とルートの子孫にある本(book：$y)の組合せを生成する。各組合せについて、筆頭筆者同士(author[0]：$x0、author[0]：$y0)が等しければ(=)、筆頭筆者を返し(return $x0)、その件数をカウントする(count：$z)。最終的に、タイトルの組(title1,title2)とカウント($z)を出力する」ということを要求している。
【００２７】
次に、上述したプラン生成部６０１と、プラン実行部６０２とについて詳細な構成を図４を用いて説明する。プラン生成部６０１は、クエリフラグメント抽出部６０１０と、結合プラン生成部６０１１と、分散プラン変換部６０１２とを有する。クエリフラグメント抽出部６０１０は、XQueryから、ＤＢサーバ７０に対する問い合せの部分である断片的なクエリ（断片クエリ）を抽出する。断片クエリとは、XQueryを表す文字列のクエリのデータであり、ＸＭＬデータに含まれる全部又は一部の要素の取得を要求する取得要求を示すデータである。尚、クエリフラグメント抽出部６０１０は、一つのXQueryから複数個の断片クエリを抽出して複数のクエリフラグメントを生成することもある。即ち、クエリフラグメント抽出部６０１０は、ＸＭＬデータに含まれる全部又は一部の要素を取得する取得要求と、後述の制御データとを含む少なくとも１つ以上の処理命令をクエリフラグメントとして生成する。この断片クエリを抽出する方法については後述の動作欄で詳述する。そして、クエリフラグメント抽出部６０１０は、抽出した断片クエリに対して、XQueryのreturn節で指定された結果データの送受信に関する制御データを付加してクエリフラグメントを生成する。
【００２８】
制御データは、クエリフラグメントの実行結果である結果データをＤＢサーバ７０からコーディネータサーバ６０が受信した後結果データを正しく処理できるように、ＤＢサーバ７０に対して後述の階層テーブルの割当指定を行うためのデータである。クエリフラグメント抽出部６０１０は、具体的には例えば、図５に示される断片クエリに対し、図６に示されるように、「$x/title」に対して“HT0”を割り当てるという制御データを付加し、「$x0」に対して“HT1”を割り当てるという制御データを付加して、クエリフラグメントを生成する。即ち、制御データで指示された”HT0”,”HT1”という階層テーブル名により、各クエリフラグメントの実行結果を示す結果データがコーディネータサーバ６０においてどこに格納されるのかが特定される。一方、このようなクエリフラグメントを実行したＤＢサーバ７０は、その実行の結果得られた要素を含む結果データと当該結果データを送信するＤＢサーバ７０との対応関係を特定するヘッダを付加して当該結果データをコーディネータサーバ６０に送信する。上述の例では、ＤＢサーバ７０は「$x/title」に対応して返す結果データに対して“HT0[ＤＢサーバ番号]”というヘッダを付加し、「$x0」に対応して返す結果データに対して“HT1[ＤＢサーバ番号]”というヘッダを付加してコーディネータサーバ６０に送信する。このようなヘッダにより、コーディネータサーバ６０は、各結果データがいずれのクエリフラグメントに対応してＤＢサーバ７０Ａ〜７０Ｃのいずれから送信れたか、どの階層テーブルに格納すべきなのかを各々識別することができる。
【００２９】
また、クエリフラグメント抽出部６０１０は、クエリフラグメント同士をつなぐ情報も結合情報として抽出する。この結合情報もクエリフラグメント抽出部６０１０は一つのXQueryから複数個抽出することがある。
【００３０】
結合プラン生成部６０１１は、クエリフラグメント抽出部６０１０が抽出して生成したクエリフラグメント及びクエリフラグメント抽出部６０１０が抽出した結合情報からプラン（結合プラン）を生成する。
【００３１】
プランとは、オペレータの系列であり、入れ子を含む場合を除き、通常、オペレータをノードとする有向の逆木グラフをなす。オペレータとは、基本機能を持った命令である。オペレータには、例えば、直積結合オペレータ、自然結合オペレータ、リンク更新オペレータ、テストオペレータ、結果受信オペレータ、関数オペレータ及び結果生成オペレータなどがある。これらの詳細については後述する。
【００３２】
分散プラン変換部６０１２は、ＤＢサーバ７０に一部のオペレータを実行させるために結合プランを変換して、分散プランを生成する。具体的には分散プラン変換部６０１２は、結合プランに含まれるクエリフラグメントに対して結果受信オペレータを設定することにより、分散プランを生成する。
【００３３】
プラン実行部６０２は、オペレータ実行部６０２０と、オペレータ部６０２１と、階層テーブル管理部６０２２とを有する。
【００３４】
階層テーブル管理部６０２２は、ＤＢサーバ７０により送信された結果データに基づいた複数の階層テーブルを記憶する。階層テーブルは、テーブル同士の上下関係を基本とする階層性を表現するのにリンク情報を用いた特別なテーブルである。テーブルはＲＤＢにおけるリレーションと等価である。階層テーブルには、レコード単位でデータが記憶され、各レコードは少なくとも１つのカラムを有する。カラムとは、データ項目を示すものである。例えば図２に示したようなＸＭＬデータに対応するレコードであれば、各レコードは、タイトル、筆頭筆者などのカラムを有する。また、各階層テーブルに記憶される各レコードには、各レコードを一意に識別可能なリンク情報が付加される。リンク情報は、ＤＢサーバ番号と、レコード番号とを含む。レコード番号とは、階層テーブル内に記憶されるレコードを一意に識別可能な番号である。このリンク情報は、後述するリンク更新に用いられる。尚、階層テーブル管理部６０２２は、上述した外部記憶装置に記憶されるものとするが、ＲＡＭなどの記憶装置に一時的に記憶されるものであっても良い。
【００３５】
オペレータ実行部６０２０は、分散プラン変換部６０１２が生成した分散プランに従ってオペレータ部６０２１の有する各種オペレータを呼び出して実行し、階層テーブル管理部６０２２に記憶された階層テーブルを更新する。このとき、オペレータ実行部６０２０は、階層テーブルに記憶される各レコードに対して上述のリンク情報を付加する。オペレータ間の入出力は、階層テーブルのポインタやリンク情報などを用いて行われる。その結果、オペレータ実行部６０２０は、クライアント５０から送信されたXQueryに応じたＸＭＬデータを出力する。
【００３６】
オペレータ部６０２１は、上述した直積結合オペレータ、自然結合オペレータ、リンク更新オペレータ、テストオペレータ、結果受信オペレータ、関数オペレータ及び結果生成オペレータなどの各種オペレータを有する。
【００３７】
直積結合オペレータは、階層テーブル間の直積結合演算を行う命令である。この演算は、ＲＤＢにおける直積結合演算と等価であり、階層テーブル間のデータの組み合わせを求める演算である。自然結合オペレータは、階層テーブル間の自然結合演算を行う命令である。この演算は、ＲＤＢにおける自然結合演算と等価であり、階層テーブル間で対象カラムの値が同じものをマージする演算である。リンク更新オペレータは、上下関係が指定された２つの階層テーブル同士に対する演算であり、各階層テーブルに含まれる２つのリンク情報を用いて、各リンク情報を更新する処理を行う命令である。テストオペレータは、等号や不等号など比較演算を行う命令である。ＲＤＢにおける選択演算と等価である。結果受信オペレータは、クエリフラグメントを各ＤＢサーバ７０Ａ〜７０Ｃに送信し、クエリフラグメントの実行結果を示す結果データを各々受信して、これらのユニオン(集合和)をとる命令である。関数オペレータは、階層テーブルに記憶されるレコードのあるカラムに対して関数演算を行う命令である。結果生成オペレータは、関数オペレータによって関数演算が行われた結果のデータをＸＭＬ形式のデータに成形することにより、クライアント５０から送信されたXQueryに応じたＸＭＬデータを生成する命令である。
【００３８】
次に、本実施の形態の分散ＸＭＬデータベースにおいて、プラン生成部６０１が生成する分散プランについて説明する。ここで、ＤＢ７００Ａ〜７００Ｃには、例えば図７に示されるＸＭＬデータが各々記憶されているものとする。同図に示されるように、ＤＢ７００Ａには１件のＸＭＬデータ、ＤＢ７００Ｂには２件のＸＭＬデータ、ＤＢ７００Ｃには１件のＸＭＬデータが記憶されている。
【００３９】
図８は、図７に示したＸＭＬデータのＤＢ７００Ａにおける物理的な記憶状態を模式的に示す図である。ＤＢ７００は、上述したようにＨＤＤなどの外部記憶装置に格納されるものとしたが、メモリに常駐する形で存在することもある。同図に示されるように、XMLデータは、DOM(Document Object Model)に似た形式でオブジェクトとリンクで表現される。<ROOT>オブジェクトの直下には１件の<book>オブジェクトが存在し、<ROOT>オブジェクトから親子関係を示すリンクでつながれている。オブジェクトの最下層には、テキストデータを示すテキストオブジェクトが存在している。
【００４０】
図９は、本実施の形態にかかるプラン生成部６０１が生成する分散プランによる処理イメージを例示する図である。同図に示されるように、分散プランは、結果受信オペレータによってＤＢサーバ７０Ａ〜７０Ｃに送信されるクエリフラグメントを含んでいる。このクエリフラグメントは、断片クエリ「for $x in //book let $x0 := $x/author return $x/title/text(), $x0」に応じた要素のみ含む限定されたＸＭＬデータの取得を要求するものになっている。このクエリフラグメントが結果受信オペレータによりＤＢサーバ７０Ａ〜７０Ｃに送信され、ＤＢサーバ７０Ａ〜７０Ｃに実行され、その実行の結果取得されたＸＭＬデータを含む結果データがＤＢサーバ７０Ａ〜７０Ｃから送信されて結果受信オペレータにより受信される。この結果、“XMLDB”、”<author>服部</author>”といった要素のみ含む限定されたＸＭＬデータをオペレータ実行部６０２０は得ることができる。この結果データは、上述したヘッダに基づいてリンク情報が付加されて、階層テーブルとして階層テーブル管理部６０２２に記憶される。また、同図に示される分散プランにより、ＤＢサーバ７０Ａ〜７０Ｃから得られた結果データに基づいて記憶された階層テーブルに対して直積結合オペレータと自然結合オペレータとで別々に実行され、それぞれの出力である２つの階層テーブル同士がリンク更新オペレータで関連付けられる。つまり、上位の階層テーブル同士が直積結合されて新たな階層テーブルが出力され、下位の階層テーブル同士が自然結合されて新たな階層テーブルが出力されると、新たに出力される各階層テーブルはリンク情報を各々２つ有することになる。このため、出力された各階層テーブルに含まれる２つのリンク情報を用いて各々のリンク情報を更新する処理が行われる。
【００４１】
（２）動作
次に、本実施の形態にかかる分散ＸＭＬデータベース５１が行う全体的な処理の手順について図１０を用いて説明する。まず、コーディネータサーバ６０のクエリ受信部６００が、クライアント５０から送信された処理要求（XQuery）を受信する（ステップＳ１）。次いで、プラン生成部６０１は、ステップＳ１で受信されたXQueryを解析し、解析結果に応じて、クエリフラグメントを含む分散プランを生成する（ステップＳ２）。プラン実行部６０２は、ステップＳ２で生成された分散プランを実行して、ステップＳ１で受信されたXQueryに応じたＸＭＬデータを処理結果データとして生成する（ステップＳ３）。尚、プラン実行部６０２は、プランの実行時に、クエリフラグメントをＤＢサーバ７０Ａ〜７０Ｃに対して送信し、当該クエリフラグメントの実行結果をＤＢサーバ７０Ａ〜７０Ｃから受信し、当該実行結果を用いて処理を実行して処理結果データを生成する。結果データ送信部６０３は、ステップＳ３で生成された処理結果データをクライアント５０に送信する（ステップＳ４）。
【００４２】
次に、ステップＳ２でプラン生成部６０１が行う処理の詳細について説明する。図１１は、プラン生成部６０１のクエリフラグメント抽出部６０１０が行う処理の手順を示すフローチャートである。クエリフラグメント抽出部６０１０は、ステップＳ１で受信されたXQueryを解析し、DBROOT、すなわち「/」の部分の集合を生成する（ステップＳ１０）。次いで、クエリフラグメント抽出部６０１０は、全てのDBROOTに対して以下の処理を行う（ステップＳ１１：ＮＯ）。クエリフラグメント抽出部６０１０は、DBROOTから変数（$xなど）を経由してPATH表現でたどれる部分に印を付ける（ステップＳ１２）。そして、クエリフラグメント抽出部６０１０は、印が付いた部分から断片的なクエリ（断片クエリ）を抽出し、当該断片クエリに対して上述した制御データを付加したクエリフラグメントを生成する。入れ子構造になっていれば、クエリフラグメント抽出部６０１０は、let節で括りだす（ステップＳ１３）（図９参照）。クエリフラグメント抽出部６０１０が全てのDBROOTに対してステップＳ１２〜Ｓ１３の処理を行うと、ステップＳ１１の判定結果が肯定的となり、次いで、印がついていない部分を結合情報として抽出する（ステップＳ１４）。この結果、ステップＳ１で受信されたXQueryからクエリフラグメントが生成されると共に結合情報が抽出される。
【００４３】
次に、プラン生成部６０１の結合プラン生成部６０１１が行う処理の手順について図１２を用いて説明する。結合プラン生成部６０１１は、上述のステップＳ１４で抽出された結合情報の集合を生成する（ステップＳ２０）。次いで、結合プラン生成部６０１１は、全ての結合情報に対して以下の処理を行う。結合プラン生成部６０１１は、結合情報に基づいて、クエリフラグメント抽出部６０１０が生成したクエリフラグメント同士を結合するプランを生成する（ステップＳ２２）。具体的には、結合プラン生成部６０１１は、結合情報が「=」であれば、自然結合オペレータを設定する。これにより、自然結合を行う処理命令が生成される。また、結合プラン生成部６０１１は、入れ子同士を結合する結合情報であれば（ステップＳ２３：ＹＥＳ）、上位階層の結果のデータ同士の直積結合オペレータを設定する（ステップＳ２４）。これにより、直積結合を行う処理命令が生成される。必要であれば、上位方向に伝播する。次いで、結合プラン生成部６０１１は、自然結合の結果のデータと直積結合の結果のデータとをリンク更新するリンク更新オペレータを設定する（ステップＳ２５）。これにより、リンク更新を行う処理命令が生成される。そして、結合プラン生成部６０１１は、ステップＳ２１に戻り、次の処理対象の結合情報を処理する。尚、入れ子同士を結合する結合情報でない場合（ステップＳ２３：ＮＯ）も同様に、結合プラン生成部６０１１は、ステップＳ２１に戻る。そして、全ての結合情報に対する処理が終了すると（ステップＳ２１：ＹＥＳ）、結合プラン生成部６０１１が行う処理は終了する。尚、図示は省略したが、プラン生成部６０１は、この他、関数オペレータを適宜設定することにより関数演算を行う処理命令を生成し、関数演算が行われた結果のデータに対して結果生成オペレータを設定することにより当該データをＸＭＬ形式に成形して処理結果データとしてクライアント５０に送信する処理を行う処理命令を生成する。この結果、結合プランが生成される。
【００４４】
その後、分散プラン変換部６０１２が、結合プラン生成部６０１１が生成した結合プランに含まれるクエリフラグメントに対して結果受信オペレータを設定して、分散プランを生成する。これでステップＳ２でプラン生成部６０１が行う処理は終了する。
【００４５】
次に、ステップＳ３でプラン実行部６０２が、ステップＳ２で生成された分散プランを実行する場合の入出力イメージについて説明する。ここでは、図９に示した分散プランが生成されるものとする。図１３は、オペレータ実行部６０２０が分散プランを実行して、結果受信オペレータを最初に実行する際に入出力イメージを例示する図である。オペレータ実行部６０２０は結果受信オペレータの実行により、クエリフラグメントを各ＤＢサーバ７０Ａ〜７０Ｃに送信し、その実行結果を示すと共にヘッダが付加された結果データを各ＤＢサーバ７０Ａ〜７０Ｃから受信して、ユニオン(集合和)をとる。具体的には、オペレータ実行部６０２０は、“HT0[db1]”というヘッダが付加された１件の結果データを結果受信オペレータによりＤＢサーバ７０Ａから受信し、これにリンク情報”db1,0”を付加して階層テーブルHT0[db1]として階層テーブル管理部６０２２に記憶する。同様に、オペレータ実行部６０２０は、“HT0[db2]”というヘッダが付加された２件の結果データを結果受信オペレータによりＤＢサーバ７０Ｂから受信し、これらに各リンク情報”db2,0”,”db2,1”を各々付加して階層テーブルHT0[db2]として階層テーブル管理部６０２２に記憶する。また、オペレータ実行部６０２０は、“HT0[db3]”というヘッダが付加された結果データを結果受信オペレータによりＤＢサーバ７０Ｃから受信し、これにリンク情報”db3,0”を付加して階層テーブルHT0[db3]として階層テーブル管理部６０２２に記憶する。そして、オペレータ実行部６０２０は、階層テーブルHT0[db1]〜HT0[db3]のユニオンをとって階層テーブルHT2として階層テーブル管理部６０２２に出力する。同様に、オペレータ実行部６０２０は、“HT1[db1]”〜“HT1[db3]”というヘッダが各々付加された各結果データを各ＤＢサーバ７０Ａ〜７０Ｃから受信してこれらに各リンク情報を付加して各々階層テーブルHT1[db1]〜HT1[db3]として階層テーブル管理部６０２２に記憶し、それらのユニオンをとって階層テーブルHT3として階層テーブル管理部６０２２に出力する。
【００４６】
図１４は、オペレータ実行部６０２０が結果受信オペレータを２回目に実行する際の入出力イメージを例示する図である。上述と同様にして、オペレータ実行部６０２０は、“HT4[db1]”〜“HT4[db3]”というヘッダが各々付加された各結果データを各ＤＢサーバ７０Ａ〜７０Ｃから受信してこれらに各リンク情報を付加して各々階層テーブルHT4[db1]〜HT4[db3]として階層テーブル管理部６０２２に記憶し、それらのユニオンをとって階層テーブルHT6として階層テーブル管理部６０２２に出力する。また、オペレータ実行部６０２０は、“HT5[db1]”〜“HT5[db3]”というヘッダが各々付加された各結果データを各ＤＢサーバ７０Ａ〜７０Ｃから受信してこれらに各リンク情報を付加して各々階層テーブルHT4[db1]〜HT5[db3]として階層テーブル管理部６０２２に記憶し、それらのユニオンをとって階層テーブルHT7として階層テーブル管理部６０２２に出力する。
【００４７】
図１５は、オペレータ実行部６０２０が自然結合オペレータを実行する際の入出力イメージを例示する図である。オペレータ実行部６０２０は自然結合オペレータの実行により、「$x0=$y0」に対応する処理として、階層テーブルHT3と階層テーブルHT7とを入力として自然結合を行い、その結果を階層テーブルHT8として階層テーブル管理部６０２２に出力する。
【００４８】
図１６は、オペレータ実行部６０２０が直積結合オペレータを実行する際の入出力イメージを例示する図である。オペレータ実行部６０２０は直積結合オペレータの実行により、階層テーブルHT2と階層テーブルHT6とを入力として直積結合を行い、その結果を階層テーブルHT9として階層テーブル管理部６０２２に出力する。
【００４９】
図１７は、オペレータ実行部６０２０がリンク更新オペレータを実行する際の入出力イメージを例示する図である。オペレータ実行部６０２０はリンク更新オペレータの実行により、各階層テーブルHT8〜HT9に含まれる２つのリンク情報を用いて、各々のリンク情報を更新し、新たな階層テーブルを出力する。具体的には、オペレータ実行部６０２０は以下の処理を行う。階層テーブルHT9の第２カラム（リンク情報）と第４カラム（リンク情報）とは直積結合の結果得られた複数カラム(複合リンクとする)である。オペレータ実行部６０２０は、階層テーブルHT9の複合リンクカラムを統合して単一のカラム(単一リンクとする)に更新して、更新した階層テーブルを階層テーブルHT11として階層テーブル管理部６０２２に出力する。ここでは、オペレータ実行部６０２０は、単一リンクの値として、コーディネータサーバ６０を一意に識別可能なサーバ番号（例えば、”cs”）と階層テーブルHT9内でデータを一意に識別可能なレコード番号 (例えば、1,2,3,..といった昇順に並んだ自然数)の組を割り当てる。
【００５０】
また、階層テーブルHT8の第１カラム（リンク情報）と第３カラム（リンク情報）とは自然結合の結果得られた複合リンクである。このため、オペレータ実行部６０２０は、更新したリンク情報を用いて、自然結合の結果得られた階層テーブルHT8の複合リンクカラムを統合して単一リンクに更新して、更新した階層テーブルを階層テーブルHT10として階層テーブル管理部６０２２に出力する。ここでも、オペレータ実行部６０２０は、単一リンクの値として、上述のサーバ番号及び階層テーブルHT8内でデータを一意に識別可能なレコード番号の組を割り当てる。このようなリンク更新オペレータはハッシュテーブルなど高速にアクセスできるメモリデータ構造を用いることで実装できる。
【００５１】
ここで、オペレータ実行部６０２０がリンク更新オペレータの実行によりリンク更新する処理の手順を図１８を用いて説明する。オペレータ実行部６０２０はリンク更新オペレータの実行により、上位の階層テーブルの全てのレコードについて全てスキャンしたか否か判断する（ステップＳ３０）。スキャンしていないと判断した場合（ステップＳ３０：ＮＯ）、オペレータ実行部６０２０は、スキャンしていないレコードにおける複合リンクカラムに格納されているＤＢサーバ番号及びレコード番号の組合せに対して、ユニークなリンク情報を割り当てることにより、リンク情報を更新する（ステップＳ３１）。具体的には、オペレータ実行部６０２０は、上述したコーディネータサーバ６０のサーバ番号と階層テーブルHT9でレコードを一意に識別可能なレコード番号の組を新たなリンク情報として割り当てる。そして、オペレータ実行部６０２０は、更新したリンク情報をハッシュテーブルに保存する（ステップＳ３４）。 
【００５２】
一方、オペレータ実行部６０２０は、上位の階層テーブルの全てのレコードについて全てスキャンしたと判断した場合（ステップＳ３０：ＹＥＳ）、下位結合テーブルの全てのレコードに対してスキャンしたか否か判断する（ステップＳ３３）。全てのレコードに対してスキャンしていないと判断した場合（ステップＳ３３：ＮＯ）、ハッシュテーブルを参照して、スキャンしていないレコードにおける複合リンクカラムに格納されているＤＢサーバ番号及びレコード番号の組合せに対して、ユニークなリンク情報を割り当てることにより、リンク情報を更新する（ステップＳ３４）。全てのレコードに対してスキャンしたと判断した場合（ステップＳ３３：ＹＥＳ）、処理を終了する。 
【００５３】
このようにして、上位の階層テーブルのレコードと、下位の階層テーブルのレコードとの間で対応付けを行うことができる。
【００５４】
図１９は、オペレータ実行部６０２０が関数オペレータを実行する際の入出力イメージを例示する図である。ここでは、階層テーブルHT11と階層テーブルHT10とのリンク関係をリンク情報により参照することで、階層テーブルHT11の各レコードの下位階層のレコード集合がわかる。オペレータ実行部６０２０は関数オペレータ「count」の実行により、そのレコードの件数を算出してその値(ex. 1,0,1,0,0,...)を階層テーブルHT11の第３カラムにセットして、階層テーブルHT12として階層テーブル管理部６０２２に出力する。
【００５５】
そしてこの階層テーブルHT12を用いて、オペレータ実行部６０２０が結果生成オペレータの実行により、ＸＭＬ形式のデータに成形したＸＭＬデータを生成する。この結果、クライアント５０から送信されたXQueryに応じたＸＭＬデータが生成される。これによりステップＳ３でオペレータ実行部６０２０が行う処理は終了する。その後、ステップＳ３で生成されたＸＭＬデータが処理結果データとしてステップＳ４でクライアント５０に送信されることにより、全体の処理が終了する。
【００５６】
ここで、本実施の形態において生成した分散プランと対比するために、分散ＸＭＬデータベースではなく、単体のＸＭＬデータベースにおいて、従来方法に基づいて生成される単体のプラン（単体プラン）について図２０を用いて説明する。図２０は、図３に示されるXQuery応じて生成される単体プランによる処理イメージを例示する図である。同図に示されるように、従来方法では、let節がある場合、外側のXQueryと内側のXQuery(つまり入れ子節)との間には入出力関係があると見なされ、外側のXQuery処理が終わったら入力変数の組がセットされ内側のXQueryに渡して処理される。同図においては、まず、外側のfor節に対応するデータ取得オペレータが実行され「//book」が取り出される。結果はテーブルに記録される。for節は２重なので、この処理が２回行われる。その後、入れ子節の処理が行われる。２つのテーブルを入力として直積結合オペレータが実行されて、1つのテーブルが生成される。その後、データ取得オペレータ「$x/author[0]」、データ取得オペレータ「$y/author[0]」が実行され、それぞれ「$x0」と「$y0」とを含むテーブルが生成される。テストオペレータでは「$x0=$y0」がチェックされ、テーブルからテストに成功したレコードだけに絞り込まれる。そして、入れ子のreturn節に対応する結果生成オペレータが実行される。さらに、関数オペレータ「count」が実行され、「$z」を含むテーブルが生成される。最後に、外側のreturn節に対応する結果生成オペレータが実行される。
【００５７】
図２１は、関数オペレータ「count」が実行される前のテーブルを例示する図である。入れ子はテーブル間のリンクで表現されている。そのため、テーブルT6からテーブルT5[0]からテーブルT5[5]にリンクがはられている。
【００５８】
次に、図２０に示される単体プランを分散ＸＭＬデータベース向けに拡張したプラン（拡張プラン）について図２２を用いて説明する。同図に示される拡張プランは、図２０に示した単体プランとほぼ同じ構造を持つプランになっているが、図２０に示したデータ取得オペレータが結果受信オペレータに変更されている。この結果受信オペレータにより、プラン「//book」が全て各ＤＢサーバ７０Ａ〜７０Ｃに送信され、その処理結果が受信されて、ユニオン(集合和)がとられる。すなわち、この結果受信オペレータによれば、ＤＢサーバ７０Ａ〜７０Ｃにある「//book」以下のデータを全てコーディネータサーバ６０が受信しなければならない。ＤＢサーバ７０Ａ〜７０Ｃにある「//book」の件数が多ければ、あるいはサイズが大きければ、その転送コストは膨大なものになる。また、直積結合を初めの段階で行っているため、「//book」の件数が多ければ、その組み合わせが増えて、結果としてデータ取得オペレータやテストオペレータなどの処理コストが増える。従って、単体プランを分散ＸＭＬデータベース向けに単に拡張するだけでは、分散ＸＭＬデータベースの性能を活かすことが困難である。
【００５９】
これに比べて、本実施の形態における分散プランによれば、リンク情報を用いて関係付けられた階層テーブルを用い、リンク情報を用いて階層テーブル同士を結合することで、順序制約から解放された入れ子処理を行うことができる。具体的には、Ｎ層の階層テーブル同士の場合、「Ｎ−１」回の直積結合、「Ｎ−１」回のリンク更新及び１回の自然結合を実行することで入れ子処理が完了する。従って、従来のように、上位の多重ループの回数だけ入れ子処理を繰り返し行う必要がない。オペレータの実行回数の差がそれを裏付けている。さらに上位の多重ループが大きなものになれば、従来との性能の差はより大きくなる。また、直積結合は自然結合と別に行っているため、「//book」の件数が多くても、自然結合オペレータの処理コストは抑えられる。即ち、本実施の形態の構成によって無駄な計算を排除することで、入れ子節を含むXQuery処理の高速化が可能であり、その計算量を多項式から線形へと低減させることができる。
【００６０】
また、コーディネータサーバ６０は、XQueryから抽出した断片的なクエリ「for $x in //book let $x0 := $x/author return $x/title/text(), $x0」に応じた限定的なＸＭＬデータだけの取得をクエリフラグメントによりＤＢサーバ７０に要求することで、上位for節で全てのＸＭＬデータをＤＢサーバ７０から受信する必要はなくなる。結果として、転送するデータ量は少量となり、転送コストを最小限に抑えられる。
【００６１】
[変形例]
なお、本発明は前記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、前記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。また、以下に例示するような種々の変形が可能である。
【００６２】
＜変形例１＞
上述した実施の形態において、コーディネータサーバ６０で実行される各種プログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。また、当該各種プログラムを、インストール可能な形式又は実行可能な形式のファイルでＣＤ−ＲＯＭ、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ、ＤＶＤ（Digital Versatile Disk）等のコンピュータで読み取り可能な記録媒体に記録して提供するように構成しても良い。
【００６３】
＜変形例２＞
上述した実施の形態において、階層テーブルに記憶される各レコードにリンク情報を付加するのは、オペレータ実行部６０２０であるとした。しかし、これに限らず、プラン実行部６０２が識別子付加部を別途備えるようにし、これが、各レコードにリンク情報を付加するようにしても良い。
【００６４】
＜変形例３＞
上述した実施の形態において、階層構造を有する構造化文書として、ＸＭＬデータを取り扱ったが、本実施の形態においてはこれに限らない。
【００６５】
＜変形例４＞
上述した実施の形態においては、クエリフラグメント抽出部６０１０が、制御データを含むクエリフラグメントを生成するようにしたが、これに限らず、分散プラン変換部６０１２が、クエリフラグメント抽出部６０１０が抽出した断片クエリに対して制御データを付加してクエリフラグメントを生成し、これに対して結果受信オペレータを設定するようにしても良い。
【図面の簡単な説明】
【００６６】
【図１】本実施の形態にかかる分散ＸＭＬデータベースシステムの構成を例示する図である。
【図２】ＸＭＬデータを例示する図である。
【図３】XQueryの一例を示す図である。
【図４】同実施の形態にかかるプラン実行部６０２の構成を例示する図である。
【図５】同実施の形態にかかる断片クエリを例示する図である。
【図６】図５に例示した断片クエリに付加される制御データを例示する図である。
【図７】同実施の形態にかかるＤＢ７００Ａ〜７００Ｃに各々記憶されるＸＭＬデータを例示する図である。
【図８】図７に示したＸＭＬデータのＤＢ７００Ａにおける物理的な記憶状態を模式的に示す図である。
【図９】同実施の形態にかかるプラン生成部６０１が生成する分散プランによる処理イメージを例示する図である。
【図１０】同実施の形態にかかる分散ＸＭＬデータベース５１が行う全体的な処理の手順を示すフローチャートである。
【図１１】同実施の形態にかかるプラン生成部６０１のクエリフラグメント抽出部６０１０が行う処理の手順を示すフローチャートである。
【図１２】同実施の形態にかかるプラン生成部６０１の結合プラン生成部６０１１が行う処理の手順を示すフローチャートである。
【図１３】同実施の形態にかかるオペレータ実行部６０２０が分散プランを実行して、結果受信オペレータを最初に実行する際に入出力イメージを例示する図である。
【図１４】同実施の形態にかかるオペレータ実行部６０２０が結果受信オペレータを２回目に実行する際の入出力イメージを例示する図である。
【図１５】同実施の形態にかかるオペレータ実行部６０２０が自然結合オペレータを実行する際の入出力イメージを例示する図である。
【図１６】同実施の形態にかかるオペレータ実行部６０２０が直積結合オペレータを実行する際の入出力イメージを例示する図である。
【図１７】同実施の形態にかかるオペレータ実行部６０２０がリンク更新オペレータを実行する際の入出力イメージを例示する図である。
【図１８】同実施の形態にかかるオペレータ実行部６０２０がリンク更新オペレータの実行によりリンク更新する処理の手順を示すフローチャートである。
【図１９】同実施の形態にかかるオペレータ実行部６０２０が関数オペレータを実行する際の入出力イメージを例示する図である。
【図２０】同実施の形態にかかる図３に示されるXQuery応じて生成される単体プランによる処理イメージを例示する図である。
【図２１】同実施の形態にかかる関数オペレータ「count」が実行される前のテーブルを例示する図である。
【図２２】同実施の形態にかかる図２０に示される単体プランを分散ＸＭＬデータベース向けに拡張したプラン（拡張プラン）による処理イメージを例示する図である。
【符号の説明】
【００６７】
５０  クライアント
５１  分散ＸＭＬデータベース
５２  ネットワーク
６０  コーディネータサーバ
７０Ａ，７０Ｂ，７０Ｃ，７０  ＤＢサーバ
６００  クエリ受信部
６０１  プラン生成部
６０２  プラン実行部
６０３  結果データ送信部
７００Ａ，７００Ｂ，７００Ｃ，７００  ＤＢ
６０１０  クエリフラグメント抽出部
６０１１  結合プラン生成部
６０１２  分散プラン変換部
６０２０  オペレータ実行部
６０２１  オペレータ部
６０２２  階層テーブル管理部
【図１】
0005060345.tif 000002
【図２】
0005060345.tif 000003
【図３】
0005060345.tif 000004
【図４】
0005060345.tif 000005
【図５】
0005060345.tif 000006
【図６】
0005060345.tif 000007
【図７】
0005060345.tif 000008
【図８】
0005060345.tif 000009
【図９】
0005060345.tif 000010
【図１０】
0005060345.tif 000011
【図１１】
0005060345.tif 000012
【図１２】
0005060345.tif 000013
【図１３】
0005060345.tif 000014
【図１４】
0005060345.tif 000015
【図１５】
0005060345.tif 000016
【図１６】
0005060345.tif 000017
【図１７】
0005060345.tif 000018
【図１８】
0005060345.tif 000019
【図１９】
0005060345.tif 000020
【図２０】
0005060345.tif 000021
【図２１】
0005060345.tif 000022
【図２２】
0005060345.tif 000023