(57)【特許請求の範囲】
【請求項１】
クエリ処理要求と結果受信を行うクライアントに対して、１つ以上のデータソースを利用してクエリ処理を行うデータ仮想化装置であって、
データ仮想化対象となる前記データソースの論理的な結合データモデルを記憶する仮想スキーマ情報部と、
前記各データソース及び前記データ仮想化装置のリソース容量、及び、前記データソースに保管された各データに関するデータサイズ、データ属性、データ範囲を含むデータ仮想化装置が処理するデータのサイズ推定に利用可能な統計情報を記憶する統計情報部と、
前記データソースに保管された各データに対する処理を提供するエンジンのインタフェース仕様を含む前記エンジン接続に関するインタフェース情報を記憶するインタフェース情報部と、
前記統合データモデルを利用してユーザが投稿したクエリを実行するためのクエリプランを生成するクエリ評価部と、
前記クエリプランと前記統計情報を利用して前記リソース容量で処理可能となるクエリプランに再構築するクエリ分割部と、
再構築したクエリプランと前記インタフェース情報を基に前記データソースに投稿する投稿クエリ及びデータ仮想化装置上で実行するクエリプランを生成するクエリ生成部と、
前記再構築したクエリプランに従って前記投稿クエリ及びデータ仮想化装置上で実行する処理を順序通りに実行するための制御を行うクエリ実行制御部と、
を備えることを特徴とするデータ仮想化装置。
【請求項２】
前記データソースに前記投稿クエリを投稿するクエリ投稿部と、
前記投稿クエリの結果を受信するデータ受信部と、
前記データ仮想化装置上で実行する処理で生成される中間データを一時的に保存する一時ストレージと、
前記データ受信部が受信したデータや前記一時ストレージに保存された中間データを利用して、前記クエリ実行制御部より指示された処理を実行し、その結果を前記一時ストレージ又は前記クライアントに送信するデータ処理部と、
を備えた請求項１に記載のデータ仮想化装置。
【請求項３】
前記クエリ分割部は、
前記統計情報部の各データソースの統計情報から、前記クエリ評価部で生成したクエリプランのうち、各データソースがデータ仮想化装置に対して出力するデータサイズを計算する機能と、
データ仮想化装置上での処理毎に必要な中間データサイズを計算する機能と、
前記計算の結果から、処理対象データの統計情報を利用して、前記リソース容量で実行可能なデータサイズとするためのクエリ分割数と、分割のための条件を前記クエリプランに追加する機能と、
を含む請求項１に記載のデータ仮想化装置。
【請求項４】
前記クエリ生成部は、
前記クエリ分割部で生成した前記クエリプランを利用して、処理毎に実行するためのクエリを抽出する機能と、
前記クエリプラン上から前記リソース容量での処理が不可であることを発見した場合に、当該処理の演算種別及び利用リソース容量に応じて分割数及び分割条件を決定し分割した、データ仮想化装置上で実行するクエリプラン及び前記投稿クエリを生成する機能と、
当該処理の入力データがデータソースの場合は、分割数、分割条件及びインタフェース情報を利用して、対象のデータソース用のクエリを生成する機能と、
を含む請求項１に記載のデータ仮想化装置。
【請求項５】
前記クエリ実行制御部は、
前記クエリプランの各処理について、前記データソース上へのクエリ投稿、又は、前記一時ストレージから入力データを取得して実行する機能と、
前記処理を実行した後に、未実行の処理がある場合、前記処理の結果を前記一時ストレージに維持する機能と、
を含む請求項２に記載のデータ仮想化装置。
【請求項６】
請求項１乃至請求項４のいずれか１項に記載の各部をコンピュータ上に構築し、データ仮想化装置で実行可能となるように大規模データに対するクエリを分割して処理する大規模データ処理プログラム。
【請求項７】
前記クエリ生成部におけるデータ仮想化装置上で実行するクエリプラン及び投稿クエリを生成する機能は、
分割対象となるデータが二項演算である場合、
同一範囲を含む二つの分割データを対象としたクエリのみを生成する機能
を含む請求項４に記載のデータ仮想化装置。
【請求項８】
二つの分割データを対象としたクエリの生成は、
分割基準の属性と分割範囲を基に、一方の分割データからブロックを取得し、他方の分割データからブロックを取得して、ブロック間で演算処理を実施する一方、
前記一方の分割データの分割範囲の上限が、他方の分割データの分割範囲の上限より大きい場合に、他方のブロックを破棄し、次の分割範囲のブロックを取得し、一方の分割データの元のブロックと演算処理を実施し、
前記一方の分割データの分割範囲の上限が、他方の分割データの分割範囲の上限より小さい場合、一方のブロックを破棄し、次の分割範囲のブロックを取得して、他方の分割データの元のブロックと演算処理を実施し、
両分割データの分割範囲の上限が一致する場合は、両分割データの両ブロックを破棄して、両分割データで次のブロックを取得する
ことで行う請求項７に記載のデータ仮想化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のデータソースの論理的な統合データモデルを提供するデータ仮想化システムにおいて、限られたリソースの環境下で、大規模データに対するクエリを確実に実行可能とするデータ仮想化装置及び大規模データ処理プログラムに関する。
【背景技術】
【０００２】
データ仮想化システム（又はマルチデータベースシステム）は、インタフェースやデータ管理方式が異なる複数のデータソースを仮想的に一つのデータベースシステムに見せるために、各データソースが持つデータを論理的に統合して管理し、ユーザのクエリに対応するデータソースにクエリを投稿する。
代表的なデータ仮想化システムは、例えば特許文献１に示されるように、複数の階層的なデータベースシステムを、データマッピングにより仮想スキーマ（実際の物理テーブルをユーザに提供する論理テーブルに変換する処理を定義したもの）に統合し、クエリ実行時において処理対象となるデータを保持するデータベースシステムにクエリを分配するよう構成されている。各データベースシステムで実行されたクエリの結果は中央に収集され、仮想スキーマに従って一つに統合して結果を出力するシステムとなっている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０７−１４１３９９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１のように、複数のデータソースを跨がるクエリの統合処理は、データ仮想化システム上で実行する必要がある。このとき、一つ以上のデータベースシステムから得られるデータと処理後の結果データサイズが、物理メモリサイズを超えるほど大規模であった場合、実行できずにエラー終了してしまう可能性がある。
このような場合、ＯＳのスワップ機構によって対応可能であると考えられるが、クエリ処理に最適化されておらず、遅延は非常に大きい。また、サイズがスワップ領域を超えてしまった場合にも、同様にエラー終了してしまうという問題がある。
【０００５】
データ仮想化システムは、対象の複数のデータソースが持つデータの規模や想定されるクエリの種類から、適切な物理メモリサイズを想定することで構築される。しかし事業環境の変化などから生成されるデータ量やクエリの種類が変化することで、想定した物理メモリサイズを超えるメモリが必要となる場合がある。そのような変化に対応するためにリソースを増設することは、多くの時間を必要とし、事業分析等のスピードが要求される用途で利用するユーザであったとしても、増設が完了するまで必要なクエリを実行することができない。
【０００６】
本発明は上記実情に鑑みて提案されたものであり、データ仮想化システムにおいて、限られたリソース環境においても確実にクエリを実行できるデータ仮想化装置及び大規模データ処理プログラムを提供することを目的としている。
【課題を解決するための手段】
【０００７】
上記目的を達成するため本発明は、データ仮想化装置において、限られたリソースの範囲内で実行可能なデータサイズとなるようにクエリ処理を分割して実行することで、大規模データに対するクエリ処理を確実に実行する。
【０００８】
すなわち、請求項１のデータ仮想化装置は、クエリ処理要求と結果受信を行うクライアントに対して、１つ以上のデータソースを利用してクエリ処理を行うデータ仮想化装置であって、
データ仮想化対象となる前記データソースの論理的な結合データモデルを記憶する仮想スキーマ情報部と、
前記各データソース及び前記データ仮想化装置のリソース情報、及び、前記データソースに保管された各データに関するデータサイズ、データ属性、データ範囲を含むデータ仮想化装置が処理するデータのサイズ推定に利用可能な統計情報を記憶する統計情報部と、
前記データソースに保管された各データに対する処理を提供するエンジンのインタフェース仕様を含む前記エンジン接続に関するインタフェース仕様を含むインタフェース情報を記憶するインタフェース情報部と、
前記統合データモデルを利用してユーザが投稿したクエリを実行するためのクエリプランを生成するクエリ評価部と、
前記クエリプランと前記統計情報を利用して前記リソース容量で処理可能となるクエリプランに再構築するクエリ分割部と、
再構築したクエリプランと前記インタフェース情報を基に前記データソースに投稿する投稿クエリ及びデータ仮想化装置上で実行するクエリプランを生成するクエリ生成部と、
前記再構築したクエリプランに従って前記投稿クエリ及びデータ仮想化装置上で実行する処理を順序通りに実行するための制御を行うクエリ実行制御部と、
を備えることを特徴としている。
【０００９】
請求項２は、請求項１のデータ仮想化装置において、
前記データソースに前記投稿クエリを投稿するクエリ投稿部と、
前記投稿クエリの結果を受信するデータ受信部と、
前記データ仮想化装置上で実行する処理で生成される中間データを一時的に保存する一時ストレージと、
前記データ受信部が受信したデータや前記一時ストレージに保存された中間データを利用して、前記クエリ実行制御部より指示された処理を実行し、その結果を前記一時ストレージ又は前記クライアントに送信するデータ処理部と、
を備えることを特徴としている。
【００１０】
請求項３は、請求項１のデータ仮想化装置において、
前記クエリ分割部は、
前記統計情報部の各データソースの統計情報から、前記クエリ評価部で生成したクエリプランのうち、各データソースがデータ仮想化装置に対して出力するデータサイズを計算する機能と、
データ仮想化装置上での処理毎に必要な中間データサイズを計算する機能と、
前記計算の結果から、処理対象データの統計情報を利用して、前記リソース容量で実行可能なデータサイズとするためのクエリ分割数と、分割のための条件を前記クエリプランに追加する機能と、を含むことを特徴としている。
【００１１】
請求項４は、請求項１のデータ仮想化装置において、
前記クエリ生成部は、
前記クエリ分割部で生成した前記クエリプランを利用して、処理毎に実行するためのクエリを抽出する機能と、
前記クエリプラン上から前記リソース容量での処理が不可であることを発見した場合に、当該処理の演算種別及び利用リソース容量に応じて分割数及び分割条件を決定し分割した、データ仮想化装置上で実行するクエリプラン及び前記投稿クエリを生成する機能と、
当該処理の入力データがデータソースの場合は、分割数、分割条件及びインタフェース情報を利用して、対象のデータソース用のクエリを生成する機能と、を含むことを特徴としている。
【００１２】
請求項５は、請求項２のデータ仮想化装置において、
前記クエリ実行制御部は、
前記クエリプランの各処理について、前記データソース上へのクエリ投稿、又は、前記一時ストレージから入力データを取得して実行する機能と、
前記処理を実行した後に、未実行の処理がある場合、前記処理の結果を前記一時ストレージに維持する機能と、を含むことを特徴としている。
【００１３】
請求項６の大規模データ処理プログラムは、請求項１乃至請求項４のいずれか１項に記載の各部をコンピュータ上に構築し、データ仮想化装置で実行可能となるように大規模データに対するクエリを分割して処理することを特徴としている。
【００１４】
請求項７は、請求項４のデータ仮想化装置において、
前記クエリ生成部におけるデータ仮想化装置上で実行するクエリプラン及び投稿クエリを生成する機能は、
分割対象となるデータが二項演算である場合、
同一範囲を含む二つの分割データを対象としたクエリのみを生成する機能を含むことを特徴としている。
【００１５】
請求項８は、請求項７のデータ仮想化装置において、
二つの分割データを対象としたクエリの生成は、
分割基準の属性と分割範囲を基に、一方の分割データからブロックを取得し、他方の分割データからブロックを取得して、ブロック間で演算処理を実施する一方、
前記一方の分割データの分割範囲の上限が、他方の分割データの分割範囲の上限より大きい場合に、他方のブロックを破棄し、次の分割範囲のブロックを取得し、一方の分割データの元のブロックと演算処理を実施し、
前記一方の分割データの分割範囲の上限が、他方の分割データの分割範囲の上限より小さい場合、一方のブロックを破棄し、次の分割範囲のブロックを取得して、他方の分割データの元のブロックと演算処理を実施し、
両分割データの分割範囲の上限が一致する場合は、両分割データの両ブロックを破棄して、両分割データで次のブロックを取得することで行うことを特徴としている。
【発明の効果】
【００１６】
本発明によれば、データ仮想化装置が保持するリソース容量で実行可能なデータサイズとなるようにクエリ分割部でクエリを分割し、分割クエリが実行されるので、データ仮想化装置において、一つのクエリで利用するデータ仮想化装置上のリソース量を制限することが可能となるとともに、分割処理することで、リソース容量を超える大規模データ処理に対応するクエリ処理を可能とすることができる。
【００１７】
また、二項演算である場合に、同一範囲を含む二つの分割データを対象としたクエリのみを生成し、結果を発生させない余計なクエリを排除することで、データ仮想化システムにおける大規模データ処理の高速化を実現することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明のデータ仮想化装置の構成を示すブロック図である。
【図２】クエリ分割部における処理手順を示すフローチャート図である。
【図３】クエリ生成部における処理手順を示すフローチャート図である。
【図４】クエリ実行制御部及びデータ処理部における処理手順を示すフローチャート図である。
【図５】クエリ実行制御部における単項演算によるクエリ実行の処理手順を示すフローチャート図である。
【図６】クエリ実行制御部における二項演算によるクエリ実行の処理手順を示すフローチャート図である。
【図７】投稿されるサンプルクエリの例である。
【図８】サンプルクエリのクエリプランを示すモデル図である。
【図９】テーブルに関する統計情報を示す表である。
【図１０】サンプルクエリにおける出力データサイズの計算結果が示されたモデル図である。
【図１１】サンプルクエリにおける実行不可マークと分割情報が示されたモデル図である。
【図１２】サンプルクエリの最終的なクエリプランを示すモデル図である。
【図１３】クエリ生成部における他の処理手順を示すフローチャート図である。
【図１４】図１３におけるマージ型の二項演算処理方式のフローチャート図である。
【発明を実施するための形態】
【００１９】
本発明のデータ仮想化装置の実施形態について、図１を参照して説明する。
本発明のデータ仮想化装置は、データ仮想化システムにおいて、限られたリソースの範囲内で実行可能なデータサイズとなるようにクエリ処理を分割して実行することで、大規模データに対するクエリ処理を確実に実行するシステムであり、図１に示すように、システムを利用するクライアント１と、データ仮想化装置２と、データ仮想化装置２が利用する１つ以上のデータソース３から構成されている。クライアント１、データ仮想化装置２及びデータソース３は、ネットワークを介して接続されている。
【００２０】
クライアント１、データ仮想化装置２及び各データソース３は、それぞれ、基本プログラムや各種の基本デバイスが記憶されたＲＯＭと、各種のプログラムやデータが記憶されるハードディスクドライブ装置（ＨＤＤ）と、ＣＲ−ＲＯＭやＤＶＤ等の記憶媒体からプログラムやデータを読み出すメディアドライブ装置と、プログラムを実行するＣＰＵと、このＣＰＵにワークエリアを提供するＲＡＭと、外部装置と通信するパラレル／シリアルＩ／Ｆとを主要部分とする一般的な構成を備えたコンピュータ上に構築されている。
例えば、上述した構成を有する各コンピュータにおいて、クエリ処理を実行するための大規模データ処理プログラムがメディアドライブ装置を介してＨＤＤにインストールされることでデータ仮想化装置が構築される。
【００２１】
クライアント１は、データ仮想化装置２が提供する統合データモデルを利用したクエリを投稿することで、透過的に複数のデータソース３に対するクエリ処理結果を取得する。
【００２２】
データソース３は、実際にデータを保管するストレージ３２と、データに対する処理を提供するエンジン３１からなり、エンジン３１が持つインタフェース経由でストレージ３２上のデータに対する処理を提供する。
【００２３】
データ仮想化装置２は、仮想スキーマ情報を管理する仮想スキーマ情報部２１と、データソース３に保管されたデータに関する統計情報を記憶する統計情報部２２と、データソース３のエンジン３１に関するインタフェース情報を記憶するインタフェース情報部２３と、クエリプランを生成するクエリ評価部２４と、リソース容量に応じたクエリプランを再構築するクエリ分割部２５と、各クエリを生成するクエリ生成部２６と、各クエリ処理を実行するクエリ実行制御部２７と、データソース３へクエリを投稿するクエリ投稿部２８と、データソース３からクエリ結果を受信するデータ受信部２９と、クエリ処理の結果を一時的に保存する一時ストレージ３０と、処理結果を出力するデータ処理部４０とを備えて構成されている。
【００２４】
仮想スキーマ情報部２１は、接続されたデータ仮想化対象のデータソース３の論理的な統合データモデルを記憶し、クライアント１から投稿されるクエリに対して、どのデータソース３上のテーブル情報を使用するかについての仮想スキーマ情報が管理されている。
【００２５】
統計情報部２２は、データソース３に保管された各データに関するデータサイズ、データ属性、データ範囲を含む前記データのサイズ推定に利用可能な統計情報を記憶する。統計情報には、属性ごとに出現するデータの種類の数（ヒストグラム）や、各属性の平均や分散値等の属性の特徴を表示する値が含まれる。また、統計情報部２２には、各データソース３及びデータ仮想化装置２のリソース容量が記憶されている。
これらの統計情報は、後述するクエリの中間データサイズの計算や、クエリ分割に際して必要な情報となる。
【００２６】
インタフェース情報部２３は、データソース３に保管された各データに対する処理を提供するエンジン３１のインタフェース仕様を含むエンジン接続に関するインタフェース情報を記憶する。インタフェース仕様は、クエリの生成方法（ＳＱＬ等）や、アクセス方法（ＪＤＢＣ等）を示す。また、インタフェース情報には、上記以外のエンジン接続に関わる情報として、エンジンが出力するデータ形式や、エンジンの制限（実行不可の処理等）等が含まれる。インタフェース情報は、各データソース３が実行可能なクエリを生成するために必要な情報となる。
【００２７】
クエリ評価部２４はクエリを受け取り、クエリの処理対象となるテーブルに対応する仮想スキーマ情報を仮想スキーマ情報部２１から呼び出し、ユーザが投稿したクエリに仮想スキーマの処理を適用した形でクエリプランを生成する。
クエリ分割部２５は、クエリ評価部２４が生成したクエリプランと統計情報部２２の統計情報を利用してデータ仮想化装置２が実行可能となるクエリプランに再構築する。
【００２８】
クエリ生成部２６は、再構築したクエリプランを基に実際にデータソース３に投稿する投稿クエリ及びデータ仮想化装置２上で実行する処理に関するクエリプランを生成する。投稿クエリは、インタフェース情報部２３のインタフェース情報を基に、投稿するデータソース３のエンジン３１のインタフェース仕様に合わせて生成される。
クエリ実行制御部２７は、再構築されたクエリプランに従って生成した投稿クエリ及びデータ仮想化装置２の処理を順序通りに実行するための制御を行う。
【００２９】
クエリ投稿部２８は、実際にデータソース３に投稿クエリを投稿する。
データ受信部２９は、クエリ投稿部２８が投稿した投稿クエリの結果を待ち、その結果を受信する。
一時ストレージ３０は、データ仮想化装置２上の処理で生成される中間データを一時的に保存する。
データ処理部４０は、データ受信部２９が受信したデータや一時ストレージ３０に保存されたデータを利用して、クエリ実行制御部２７より指示された処理を実行し、結果を一時ストレージ３０又はクライアント１に送信する。
【００３０】
次に、クエリ分割部２５における処理フローについて、図２を参照して説明する。
クエリ分割部２５では、限られたリソースの範囲内で実行可能なデータサイズとなるように処理を分割するための情報を付与する。
先ず、統計情報部２２に記憶された各データソース３の統計情報から、クエリ評価部２４で生成したクエリプランのうち、各データソース３がデータ仮想化装置２に対して出力するデータサイズを計算する（ステップ１０１）。
同様にして、データ仮想化装置２上での処理について、それぞれの処理の中間データサイズを計算する（ステップ１０２）。
【００３１】
これらの計算結果とデータ仮想化装置２のリソース情報から、処理毎にデータ仮想化装置２上で処理可能かどうかを判断し（ステップ１０３）、処理可能でないと判断した場合には（ステップ１０４）、実行不可マークをつける（ステップ１０５）。
このとき、処理対象データの統計情報を利用して、実行可能なデータサイズとなるためのクエリ分割数と、分割のための条件（分割条件）をクエリプランに追加し（ステップ１０６）、クエリ分割処理を完了する（ステップ１０７）。この分割条件には、分割の対象となる属性（分割基準の属性）と、分割数分の属性の範囲（分割範囲）が指定される。
【００３２】
クエリ生成部２６における処理フローについて、図３を参照して説明する。
クエリ生成部２６では、クエリ分割部２５で生成した分割条件付きのクエリプランを利用して、分割したクエリプランとデータソースに投稿するためのクエリが生成される。
クエリプラン上をツリー探索で各処理の抽出を行う（ステップ２０１）。
クエリプラン上の各処理から実行不可マークの有無を検知する（ステップ２０２）。
クエリプラン上の各処理に実行不可マークが無ければ、分割することなく対象処理のクエリを生成する（ステップ２０３）。
【００３３】
実行不可マークのついた処理を発見した場合、当該処理の演算種別に応じて（ステップ２０４）、分割数及び分割条件を利用した単項演算のクエリ処理方式（ステップ２０５）、又は、二項演算のクエリ処理方式（ステップ２０６）により分割したクエリプランを生成する。
続いて、クエリ処理の入力データがデータ仮想装置にあるのかデータソース３にあるのかを判断する（ステップ２０７）。
当該処理の入力データがデータソース３の場合は、分割数、分割条件及びインタフェース情報を利用して、対象のデータソース用のクエリ（投稿クエリ）を生成する（ステップ２０８）。
以上の処理をクエリプラン上の全処理分行うことで（ステップ２０９）、クエリ生成は完了する（ステップ２１０）。
【００３４】
クエリ実行制御部２７及びデータ処理部４０における処理フローについて、図４を参照して説明する。
クエリ生成部２６で生成した分割したクエリプランとデータソースに投稿するためのクエリを利用して、クエリ間の依存関係を考慮したクエリ実行を行うために、まずクエリプラン上において、未実行、かつデータ仮想化装置２上の処理で最も深い処理を抽出する（ステップ３０１）。
続いて、当該処理を処理方式に従って、入力データを取得し、処理を実行する（ステップ３０２）。入力データの取得は、データソース３上へのクエリ投稿、もしくはデータ仮想化装置上の一時ストレージ３０から取得する。
【００３５】
これをクエリプランにおけるデータ仮想化装置２上の全処理で行う。すなわち、クエリプランにおける未実行処理の有無を検出し（ステップ３０３）、未実行処理が有る場合は、結果を中間データとして一時ストレージ３０に維持し（ステップ３０４）、ステップ３０１からの処理を繰り返す。
ステップ３０３において、未実行処理が無い場合は、データ処理部４０が最終結果を一時ストレージ３０から取得し、クライアント１に送信する（ステップ３０５）。
その後、利用した一時ストレージ３０上の中間データと最終結果を削除してクエリ実行は終了となる（ステップ３０６）。
【００３６】
次に、クエリ生成部２６における単項演算による分割クエリの実行方式（図３のステップ２０５における処理）について、図５を参照して説明する。
単項演算は、選択処理（WHERE, HAVING, ON）、射影処理（SELECT）、集約処理（GROUP BY）、並び替え処理（ORDER BY）を含み、単体のテーブルデータに対する演算を表す。単体のテーブルデータに対して予め決められた分割条件を元に、ブロック単位に分割して処理を行う。
【００３７】
先ず、対象のテーブルＡの分割数Ｎ及び分割条件を決定し（ステップ４０１）、テーブルＡのブロックＡｉを取得する（ステップ４０２）。このｉは０≦ｉ＜Ｎとなり、ブロックは０から順に取得する。また、ここでブロックを取得する先は、データソース３又は一時ストレージ３０となる。
各データにおける分割基準の属性は、例えば、処理毎のキー属性が設定される。
次に、取得したブロックＡｉに対して単項演算を実行し（ステップ４０３）、結果を一時ストレージ３０に退避する（ステップ４０４）。
その後、テーブルＡの残りのブロックを確認し（ステップ４０５）、ブロックがあれば（ｉ＜Ｎ−１）、当該ブロックを破棄し（ステップ４０６）、次のブロックを選択し（ステップ４０７）、ステップ４０２からの処理を繰り返す。
ステップ４０５においてブロックがなければ、最終結果を出力する（ステップ４０８）。
【００３８】
続いて、クエリ生成部２６における二項演算による分割クエリの実行方式（図３のステップ２０６における処理）について、図６を参照して説明する。
二項演算は、結合処理（JOIN）と集合処理(UNION, MINUS, INTERSECT)を含み、二つのテーブルデータに対する演算を表す。この処理においては、予め決められた分割条件を基に、各テーブルデータをブロック単位に分割して処理を行う。
【００３９】
先ず、対象のテーブルＡ，Ｂの分割数Ｎ及び分割条件を決定し（ステップ５０１）、二つのテーブルのうち、テーブルサイズの小さいテーブルＡのブロックＡｉを取得する（ステップ５０２）。次に、テーブルサイズの大きい方のテーブルＢのブロックＢｊを取得する（ステップ５０３）。ここで、ｉ及びｊは０≦ｉ，ｊ＜Ｎとなり、各ブロックは０から順に取得される。また、ここでブロックを取得する先は、データソース３又は一時ストレージ３０となる。
【００４０】
次に、取得した二つのブロックＡｉ及びブロックＢｊに対して二項演算を実行し（ステップ５０４）、結果を一時ストレージ３０に退避する（ステップ５０５）。
その後、テーブルＢの残りのブロックを確認し（ステップ５０６）、ブロックがあれば（ｊ＜Ｎ−１）、現在のブロックを一時ストレージ３０に退避し（ステップ５０７）、次のブロックを選択し（ステップ５０８）、ステップ５０３からの処理を繰り返す。
【００４１】
ステップ５０６においてブロックがない場合（ｊ＝Ｎ−１）は、同様にテーブルＡの残りのブロックを確認する（ステップ５０９）。テーブルＡの残ブロックがある場合（ｉ＜Ｎ−１）、ブロックＡｉを破棄し（ステップ５１０）、ブロックＢｊを一時ストレージ３０に退避し（ステップ５１１）、テーブルＢの残りのブロックをリセット（Ｊ=０）し（ステップ５１２）、再度テーブルＡのブロックの選択から実行する（ステップ５０２）。
なお、テーブルＢのブロックの一時ストレージ３０への退避は、当該ブロックの取得元がデータソース３だった場合に限られ、一時ストレージ３０から取得した場合は当該ブロックを破棄する。
クエリ生成部２６においては、これらの二つの実行方式を実現するためのクエリ又はクエリプランを生成し、クエリ実行制御部２７はこれらに従って処理を実行する。
【００４２】
次に、データ仮想化装置２における具体的なクエリ処理の流れについて、図７のSQLクエリをクライアントが投稿した場合を例に説明する。
なお、テーブルuserはデータソース（DB1）３に、テーブルlogはデータソース（DB2）３に保存されているとし、DB1及びDB2のインタフェースはSQLとする。また、データ仮想化装置２の物理メモリは６４ＧＢを上限とする。つまり、１回に処理できるサイズは、入力データサイズと出力データサイズの合計が６４ＧＢ以下の場合のみとなる。
【００４３】
クライアント１が図７のSQLクエリをデータ仮想化装置２に投稿すると、クエリ評価部２４は、図８に示すクエリプランを生成する。点線で囲まれている範囲が、それぞれ各データソース３及びデータ仮想化装置２上で実行される範囲を示している。すなわち、データ仮想化装置２では、並び替え処理（ORDER BY）、Π（user.age,COUNT(*)）、集約処理（GROUP BY）、結合処理（JOIN）の４つのクエリ処理が、データソース（DB1）３に対してΠ（user_id,age）の１つのクエリ処理が、データソース（DB2）３に対してΠ（user_id）の１つのクエリ処理が行われるクエリプランとなっている。
【００４４】
クエリ分割部２５は、図８のクエリプランと図９に示すテーブルの統計情報から図１０で示すような中間データサイズを計算する。ここでは、事前に統計情報として図１０のように処理毎の入出力の中間データサイズが計算されていたものとしている。すなわち、図１０の例では、ORDER BY処理に対して入力１０ＫＢ及び出力１０ＫＢ、Π処理に対して入力５０ＫＢ及び出力１０ＫＢ、GROUP BY処理に対して入力１５０ＧＢ及び出力５０ＫＢ、JOIN処理に対して入力１００ＭＢ、１００ＧＢ及び出力１５０ＧＢとなっている。
【００４５】
次に、図１０の中間データサイズを利用して、物理メモリを超えていて実行できない処理を抽出し、図１１のように実行不可マークを付与する。図１１では、GROUPBY処理とJOIN処理について、複数のクエリに分割する必要がある。実行不可マークが付与された処理では、図９の統計情報のうちテーブルごとのkeyとなる属性と、その最大・最小値を利用して、分割数及び分割条件を付与する。
【００４６】
具体的には、図１１では、実行不可マークがつけられたGROUPBY処理を属性log_idの値を条件に３個に分割し、JOIN処理を属性log_idの値を条件に４個に分割する。
すなわち、GROUPBY処理では、入力１５０ＧＢ、出力５０ＫＢなので、メモリ容量の６４ＧＢで割ると（（１５０ＧＢ＋５０ＫＢ）／６４ＧＢ）、３分割が必要となる。
同様に、JOIN処理では、入力１００ＭＢ、１００ＧＢ、出力１５０ＧＢなので、メモリ容量の６４ＧＢで割ると（（１００ＭＢ＋１００ＧＢ＋１５０ＧＢ）／６４ＧＢ）、４分割が必要となる。
分割は、各処理の入力側で行われ、入力が二つある時には、どちらか又は両方を分割する。
【００４７】
クエリ生成部２６は、図１１の分割情報付きのクエリプランを利用して、図１２のようにデータ仮想化装置２上で実行するクエリプランと、データソース（DB1）３及びデータソース（DB2）３に投稿するSQLクエリを生成する。
クエリ実行制御部２７では、図１２のクエリプランに従ってデータソース３にSQLクエリを投稿し、データ仮想化装置２上で順々に処理を実行していく。
【００４８】
上述したデータ仮想化装置及び大規模データ処理プログラムによれば、クエリ分割部２５においてクエリを分割してクエリプランを再構築し、クエリ実行制御部２７において分割クエリを順次実行する制御を行うことで、一つのクエリで利用するデータ仮想化装置２上のリソース量を制限することが可能となるので、データ仮想化装置２のリソース容量を超える大規模データ処理に対応することができる。
【００４９】
なお、上述したデータ仮想化装置では、二項演算において、処理対象の二つのデータをそれぞれ分割したデータ（分割データ）のうち、どの組み合わせの処理において結果が出力されるかを考慮していない。そのため、分割データの全組み合わせで処理を実行するクエリ分割実行方式をとっている。
しかし実際には、例えば内部結合処理（Inner Join）のように、ある特定の分割データ同士の処理でのみ結果を出力する処理がある。このような場合、上述の実行方式では、本来であれば不要である分割データの転送及び処理が何度も行われ、効率が悪くなる場合がある。
【００５０】
一方、データ仮想化システムにおいては、従来のデータベースシステムがHDD等のストレージに直接アクセスし、ストレージのアクセス方式（ページ等）に従ったデータアクセスを行うのに対して、SQLクエリを前提としていることから、実際の値の範囲を基にデータを取得することが容易にできる。
【００５１】
この点を活用し、クエリ生成部２６における処理について、図１３及び図１４に示した処理フローでは、データ仮想化システムで生成したクエリプラン及び処理データサイズに応じて生成した分割条件を基に、実際に実行する分割クエリを生成することで、クエリ処理の効率を上げるようにしている。
図１３中、図３と同じ符号を付したステップは、図３と同一の処理を行うことを意味する。以下、図１〜図３のデータ仮想化装置と異なる処理フローを中心に説明する。
【００５２】
先ず、図１のデータ仮想化装置と同様に、クエリ生成部２６において、クエリ分割部２５で作成した分割条件付きのクエリプランを利用して、処理毎に実行するためのクエリを生成する。
クエリプラン上から実行不可マークのついた処理を発見した場合（ステップ２０２）、当該処理の演算種別に応じて（ステップ２０４）、分割数及び分割条件を利用して分割したクエリプランを生成する（ステップ２０５、ステップ２１１、ステップ２１２）。
【００５３】
単項演算の場合は、図３の処理と同様に、単項演算処理方式を基に分割したクエリプランを生成する（ステップ２０５）。
また、二項演算のうち、直積処理（Cross Join）に関しては、図３のステップ２０６と同様の二項演算処理方式（総当り型二項演算処理方式）を基に分割したクエリプランを生成する（ステップ２１１）。
【００５４】
一方で、直積処理以外の二項演算（内部結合処理（Inner Join）、外部結合処理（Outer Join）、集合処理(Union, Minus, Intersection)）に関しては、マージ型二項演算処理方式を基に分割したクエリプランを生成する（ステップ２１２）。マージ型二項演算処理方式の詳細については後述する。
【００５５】
続いて、クエリ処理の入力データがデータ仮想装置にあるのかデータソース３にあるのかを判断する（ステップ２０７）。
当該処理の入力データがデータソース３の場合は、分割数、分割条件及びインタフェース情報を利用して、対象のデータソース用のクエリ（投稿クエリ）を生成する（ステップ２０８）。
以上の処理をクエリプラン上の全処理分行うことで（ステップ２０９）、クエリ生成は完了する（ステップ２１０）。
【００５６】
図１４は、マージ型二項演算処理方式（図１３のステップ２１２）の処理フローを示し、クエリ生成部２６においては、この処理方式を実現するためのクエリ又はクエリプランを生成し、クエリ実行制御部２７はこれに従って処理を実行する。
先ず、各入力データA,Bの分割数AN,BN,分割基準の属性attrA,attrB,分割範囲conda[AN],condB[BN]について、図１のクエリ分割部２５で再構築したクエリプランにより取得し、AのブロックA[i]及びBのブロックB[j]を初期化（i=0,j=0）する（ステップ６０１）。
【００５７】
次に、分割基準の属性と分割範囲を基に、片方のデータＡからブロックA[i]を取得する（ステップ６０２）。
同様に、もう一方のデータBからブロックB[j]を取得する（ステップ６０３）。
これらのブロック間で演算処理joinを実施し（ステップ６０４）、演算結果を一時的に記憶する（ステップ６０５）。
【００５８】
次に、Aの分割範囲の上限が、Bの分割範囲の上限より大きかった場合（ステップ６０６）、データＡには演算処理が可能な範囲が残っていることから、BのブロックB[j]を破棄し（ステップ６０７）、Bの次の分割範囲のブロックB[j]を取得し（ステップ６０３）、元からあるAのブロックA[i]と演算処理を実施する（ステップ６０４）。
【００５９】
一方で、Aの分割範囲の上限が、Bの分割範囲の上限より小さかった場合（ステップ６０８）、AのブロックA[i]を破棄し（ステップ６０９）、Aの次の分割範囲のブロックA[i]を取得し（ステップ６１０）、元からあるBのブロックB[j]と演算処理を実施する（ステップ６０４）。
また、AのブロックA[i]が終了し（i＜AN）、且つ、BのブロックB[j]も終了（j=BN-1）している場合も、AのブロックA[i]を破棄し（ステップ６０９）、Aの次の分割範囲のブロックA[i]を取得し（ステップ６１０）、元からあるBのブロックB[j]と演算処理を実施する（ステップ６０４）。
【００６０】
なお、AとBの分割範囲の上限が一致する場合は（ステップ６０８）、AとBの両ブロックを破棄して（ステップ６１１）、両方共に次のブロックA[i],B[j]を取得する（ステップ６０２、６０３）。
なお、AのブロックA[i]が終了（i≧AN）し、且つBのブロックB[j]が終了（j≧BN）した場合（AとBの両方の分割範囲がなくなった時点）（ステップ６１２）、全てのjoin結果を結合して出力する（ステップ６１３）。
【００６１】
上述した方式によれば、クエリの分割範囲を利用して、出力結果が生成されないブロック間での演算処理を行わない。そのために、レコード間である属性の値が一致しない場合には、必ず特定の結果が生成されるという特徴を利用している。
結合処理（内部結合、外部結合）の場合、このような属性はJoinキーであり、結果が出力されないか、もしくは当該レコードを１レコードのみ出力する、という動作となる。したがって、結合処理（内部結合、外部結合）の場合、分割基準の属性にJoinキーを選択する必要がある。
一方、集合処理に関しては、一つでも一致しない属性があれば、出力結果が特定されるため、分割基準の属性を指定する必要がない。また、分割範囲を順番に一致させるために、分割範囲は同一順序（昇順又は降順）でソートされている必要がある。
【００６２】
上述したクエリ分割（二項演算の一部処理方式において、処理の特徴を考慮したクエリ分割）の処理フローを実行することで、余計な通信及び処理を省くことができ、二項演算の処理性能を向上させること（データ仮想化システムにおけるクエリ分割実行処理の高速化）が可能となる。
【符号の説明】
【００６３】
１…クライアント、  ２…データ仮想化装置、  ３…データソース、  ２１…仮想スキーマ情報部、  ２２…統計情報部、  ２３…インタフェース情報部、  ２４…クエリ評価部、  ２５…クエリ分割部、  ２６…クエリ生成部、  ２７…クエリ実行制御部、  ２８…クエリ投稿部、  ２９…データ受信部、  ３０…一時ストレージ、  ３１…エンジン、  ３２…ストレージ、  ４０…データ処理部。
【図１】
0006393193.tif 000002
【図２】
0006393193.tif 000003
【図３】
0006393193.tif 000004
【図４】
0006393193.tif 000005
【図５】
0006393193.tif 000006
【図６】
0006393193.tif 000007
【図７】
0006393193.tif 000008
【図８】
0006393193.tif 000009
【図９】
0006393193.tif 000010
【図１０】
0006393193.tif 000011
【図１１】
0006393193.tif 000012
【図１２】
0006393193.tif 000013
【図１３】
0006393193.tif 000014
【図１４】
0006393193.tif 000015