【文献】
大西 元、他,“データベースの多様な応用分野を対象とする並列処理システムSMASH−メモリ資源割り当ての計算方式の実現−”,第38回(平成元年前期)全国大会講演論文集(II),社団法人情報処理学会,1989年 3月17日,pp.966−967
(58)【調査した分野】(Int.Cl.,DB名)
クライアントが投稿したクエリに対してストレージから必要なデータを取得し前記クエリの演算をバッファ上で処理して生成した演算結果をユーザに返すクエリ処理装置と、
前記クエリの演算処理に際して利用するメモリ上のバッファ領域を管理して前記バッファのサイズを指定するバッファ管理装置と、を備え、
前記バッファ管理装置は、
前記クエリ処理装置から実行するクエリの実行計画を取得して、事前設定された利用可能なメモリサイズとクエリ処理装置の演算の実装情報から演算毎のバッファの初期設定サイズを確保したバッファ情報を作成するバッファ計画部と、
前記クエリ処理装置から演算指定でバッファ情報の提供依頼を受け、前記バッファ情報を提供するとともに、前記クエリ処理装置から演算指定でバッファ増量依頼を受け、バッファ情報における当該バッファの利用状況に応じて終了した演算のバッファ領域を移行することでバッファのサイズを変更するバッファ制御部と、
前記クエリ処理装置から演算処理によって変化したバッファの利用状況を取得してバッファ情報を更新するバッファ利用量収集部と
を含むことを特徴とするクエリ処理制御装置。
クライアントが投稿したクエリに対してストレージから必要なデータを取得し前記クエリの演算をバッファ上で処理して生成した演算結果をユーザに返すクエリ処理において、
前記クエリを解釈して生成したツリー構造の最下位の演算から順に処理する実体化型クエリ処理方式によるクエリ演算の実行計画を生成する手順と、
事前設定された利用可能なメモリサイズと演算の実装情報から前記クエリの演算毎のバッファサイズを指定する手順と、
演算結果が格納されたバッファが上限であり且つ下位の出力バッファにデータがある場合にバッファサイズの増量依頼を受け、バッファの利用状況に応じて終了した演算のバッファ領域を空き領域として検索して出力バッファまたは制御バッファのいずれかの対象バッファに付与する手順と、を備えることで、
クエリ実行時に、前記演算毎に利用するバッファサイズを動的に制御することで、ストレージ利用と演算切り換えの回数を削減する
ことを特徴とするクエリ処理制御方法。
クライアントが投稿したクエリに対してストレージから必要なデータを取得し前記クエリの演算をバッファ上で処理して生成した演算結果をユーザに返すクエリ処理において、
前記クエリを解釈して生成したツリー構造の最上位から順に下位の演算にデータ生成を依頼して処理する要求駆動型クエリ処理方式によるクエリ演算の実行計画を生成する手順と、
事前設定された利用可能なメモリサイズと前記クエリ演算の実装情報から演算毎のバッファサイズを指定する手順と、
制御バッファが上限であり且つ下位の出力バッファにデータがある場合に制御バッファのバッファサイズの増量依頼を受けるとともに、演算結果が格納されたバッファ(出力バッファもしくは制御バッファ)が上限に達しておらず且つ直下の演算が終了していない場合に出力バッファのバッファサイズの増量依頼を受け、バッファの利用状況に応じて終了した演算のバッファ領域を空き領域として検索して出力バッファまたは制御バッファのいずれかの対象バッファに付与する手順と、を備えることで、
クエリ実行時に、前記演算毎に利用するバッファサイズを動的に制御することで、ストレージ利用と演算切り換えの回数を削減する
ことを特徴とするクエリ処理制御方法。
演算に対してバッファサイズの増量依頼を受けた際に、増量対象が出力バッファである場合、当該演算の制御バッファを前記空き領域とする請求項7又は請求項8に記載のクエリ処理制御方法。
演算に対してバッファサイズの増量依頼を受けた際に、増量対象が制御バッファである場合、上限値が設定された当該演算の出力バッファを前記空き領域とする請求項7又は請求項8に記載のクエリ処理制御方法。
演算に対してバッファサイズの増量依頼を受けた際に、前記演算以外の他の演算の入力が完了している制御バッファを前記空き領域とする請求項7又は請求項8に記載のクエリ処理制御方法。
【背景技術】
【0002】
データベースシステムにおけるクエリ処理装置は、ユーザが投稿したクエリを解釈し、必要なデータをストレージから取得してクエリを処理する。多くのデータベースシステムではSQLと呼ばれるクエリ言語を利用しており、クエリ処理装置はSQLクエリを解釈することで、関係代数に沿った演算を抽出し、各演算の処理順序を決めることができる。この処理順序は、関係代数式としてツリー構造をしたクエリ実行計画で表現される。
演算はデータに対する加工処理を表現している。選択演算や射影演算などはデータから不要な部分を削減するが、一方で結合演算や集合演算のように複数のデータを組み合せる演算や、集計演算を多数行う場合など、元のデータよりサイズを大きくする演算が存在する。
【0003】
クエリ処理装置は、クエリ処理を装置のメモリ上で行う必要がある。以降、クエリ処理において演算が利用するメモリ領域をバッファと呼ぶ。メモリは有限であり、また多数のクエリを同時に実行する場合など、バッファに利用できる物理メモリが小さく制限される場合がある。元のデータが大規模である場合や、前述のようにデータサイズを大きくする演算によって、このようなバッファに利用可能なメモリサイズを超えるデータが発生する場合、OSのスワップ機構の利用によって大幅な遅延が発生する、又は、クエリ実行に失敗する事態が発生する。
【0004】
クエリ処理方式としては、実体化型クエリ処理方式(Materialized model又はBulk processing model)と、要求駆動型クエリ処理方式(Volcano model又はPipeline model)が提案されている。
実体化型クエリ処理方式は、非特許文献1に示されるように、クエリ実行計画におけるツリー構造の最下位の演算から順に処理する。演算は、入力される全てのデータを処理完了すると、次の上位の演算に処理を移行する。
本方式では、演算が利用するバッファのサイズに制限がないため、演算の処理中に対象のデータサイズが利用可能なメモリサイズを超える場合がある。それによって処理の大幅な遅延やクエリ実行失敗が発生する。
【0005】
要求駆動型クエリ処理方式は、非特許文献2に示されるように、クエリ実行計画におけるツリー構造の最上位から順に下位の演算にデータ生成を依頼する。依頼された演算は、データを生成するために演算に必要なデータを同様に下位の演算に依頼する。入力データが得られた演算は、演算処理によって要求されたデータを生成できた段階で上位の演算に処理を移行する。
この要求単位は、1レコードもしくはストレージのディスクブロックなどの固定サイズであり、利用可能なメモリサイズを超える事象は発生しない。
【0006】
しかし、大規模なデータを対象とする処理において、演算の切り替えが頻繁に発生し、性能が劣化する。また、仮に要求単位を大きく設定した場合、演算毎に所持するデータの規模が膨らみ、同時実行のクエリが増えた場合や、演算の数が多いクエリが実行された場合において、実体化型クエリ処理方式と同様に演算が利用するバッファの制御をしないため、利用可能なメモリサイズを超える現象が発生する。
更には、全データの蓄積を必要とする演算(整列演算等)や、二項演算(結合演算等)における片方のデータの蓄積が必要な実装(ハッシュ結合等)においては、実体化型クエリ処理方式と同様に、その蓄積データが利用可能なメモリサイズを超える現象が発生する。
【0007】
本発明者は、実体化型クエリ処理方式をベースに、大規模データにおいても確実にクエリ処理を完了する分割実行型クエリ処理方式の提案を行った(特許文献1)。
この方式は、利用可能なメモリサイズを超えた場合に、OSのスワップ機構とは別の仕組みでストレージを活用することで、確実にクエリ処理を完了する。更に、ストレージの読み込み回数を最小化する演算処理手法を導入することで、性能劣化を抑止している。
【発明の概要】
【発明が解決しようとする課題】
【0010】
しかしながら、特許文献1に記載の実体化型クエリ処理方式を利用した処理によれば、データサイズを削減するような演算においても、入力データが利用可能メモリサイズを超える場合、要求駆動型クエリ処理方式のように上位の演算に処理後のデータを渡すことをせず、処理後の少量データであっても一時的にストレージに格納するため、無駄なストレージ利用が発生し性能が悪化する可能性があった。
【0011】
本発明は上記実情に鑑みて提案されたもので、要求駆動型クエリ処理方式及び実体化型クエリ処理方式のクエリ処理制御装置において、ストレージの利用回数と演算の切り替え回数を最小化して高速なクエリ処理を実現することで、大規模データを対象とするクエリ処理を確実に実行可能とするクエリ処理制御装置、制御方法及び制御プログラムを提供することを目的としている。
【課題を解決するための手段】
【0012】
上記目的を達成するため本発明は、演算単位のバッファの利用量が上限に達した段階で次の演算に処理を推移させてストレージの利用回数を削減し、更にバッファサイズをクエリ実行時に動的に制御して演算の切り替えを最小限にすることで、確実にクエリ処理を完了しつつ性能の向上を図っている。
【0013】
すなわち、請求項1のクエリ処理制御装置は、
クライアントが投稿したクエリに対してストレージから必要なデータを取得し前記クエリの演算をバッファ上で処理して生成した演算結果をユーザに返すクエリ処理装置と、
前記クエリの演算処理に際して利用するメモリ上のバッファ領域を管理して前記バッファのサイズを指定するバッファ管理装置と、を備え、
前記バッファ管理装置は、
前記クエリ処理装置から実行するクエリの実行計画を取得して、事前設定された利用可能なメモリサイズとクエリ処理装置の演算の実装情報から演算毎のバッファの初期設定サイズを確保したバッファ情報を作成するバッファ計画部と、
前記クエリ処理装置から演算指定でバッファ情報の提供依頼を受け、前記バッファ情報を提供するとともに、前記クエリ処理装置から演算指定でバッファ増量依頼を受け、バッファ情報における当該バッファの利用状況に応じて終了した演算のバッファ領域を移行することでバッファのサイズを変更するバッファ制御部と、
前記クエリ処理装置から演算処理によって変化したバッファの利用状況を取得してバッファ情報を更新するバッファ利用量収集部とを含むことを特徴としている。
【0014】
請求項2は、請求項1のクエリ処理制御装置において、
前記クエリ処理装置は、クエリ計画部とクエリ実行制御部と演算処理部を備え、
前記クエリ計画部は、クライアントが投稿したクエリを解釈し、クエリの実行計画を生成して前記バッファ計画部及びクエリ実行制御部に実行計画を渡し、
前記クエリ実行制御部は、前記実行計画を基に前記バッファ制御部からバッファ情報を取得して演算が利用するバッファサイズを指定し、クエリ処理方式に沿って前記演算処理部に演算処理を依頼し、必要に応じて前記バッファ制御部にバッファの増量依頼し、
前記演算処理部は、前記クエリ実行制御部から依頼された演算を処理し、バッファの利用量の変化を前記バッファ利用量収集部に渡すことを特徴としている。
【0015】
請求項3は、請求項1又は請求項2のクエリ処理制御装置において、
前記バッファ制御部は、
前記クエリ処理装置から演算指定でバッファ増量依頼を受けた際に、増量対象が出力バッファである場合、当該演算の制御バッファを当該演算の出力バッファ領域に移行することを特徴としている。
【0016】
請求項4は、請求項1又は請求項2のクエリ処理制御装置において、
前記バッファ制御部は、
前記クエリ処理装置から演算指定でバッファ増量依頼を受けた際に、増量対象が制御バッファである場合、上限値が設定された当該演算の出力バッファを当該演算の制御バッファ領域に移行することを特徴としている。
【0017】
請求項5は、請求項1又は請求項2のクエリ処理制御装置において、
前記バッファ制御部は、
前記クエリ処理装置から演算指定でバッファ増量依頼を受けた際に、前記演算以外の他の演算の入力が完了している制御バッファを増量対象の演算のバッファ領域に移行することを特徴としている。
【0018】
請求項6は、請求項1又は請求項2のクエリ処理制御装置において、
前記バッファ制御部は、
前記クエリ処理装置から演算指定でバッファ増量依頼を受けた際に、上限値が設定された空きのバッファを増量対象の演算のバッファ領域に移行することを特徴としている。
【0019】
請求項7のクエリ処理制御方法は、
クライアントが投稿したクエリに対してストレージから必要なデータを取得し前記クエリの演算をバッファ上で処理して生成した演算結果をユーザに返すクエリ処理において、
前記クエリを解釈して生成したツリー構造の最下位の演算から順に処理する実体化型クエリ処理方式によるクエリ演算の実行計画を生成する手順と、
事前設定された利用可能なメモリサイズと演算の実装情報から前記クエリの演算毎のバッファサイズを指定する手順と、
演算結果が格納されたバッファが上限であり且つ下位の出力バッファにデータがある場合にバッファサイズの増量依頼を受け、バッファの利用状況に応じて終了した演算のバッファ領域を空き領域として検索して出力バッファまたは制御バッファのいずれかの対象バッファに付与する手順と、を備えることで、
クエリ実行時に、前記演算毎に利用するバッファサイズを動的に制御することで、ストレージ利用と演算切り換えの回数を削減することを特徴としている。
【0020】
請求項8のクエリ処理制御方法は、
クライアントが投稿したクエリに対してストレージから必要なデータを取得し前記クエリの演算をバッファ上で処理して生成した演算結果をユーザに返すクエリ処理において、
前記クエリを解釈して生成したツリー構造の最上位から順に下位の演算にデータ生成を依頼して処理する要求駆動型クエリ処理方式によるクエリ演算の実行計画を生成する手順と、
事前設定された利用可能なメモリサイズと前記クエリ演算の実装情報から演算毎のバッファサイズを指定する手順と、
制御バッファが上限であり且つ下位の出力バッファにデータがある場合に制御バッファのバッファサイズの増量依頼を受けるとともに、演算結果が格納されたバッファ(出力バッファもしくは制御バッファ)が上限に達しておらず且つ直下の演算が終了していない場合に出力バッファのバッファサイズの増量依頼を受け、バッファの利用状況に応じて終了した演算のバッファ領域を空き領域として検索して出力バッファまたは制御バッファのいずれかの対象バッファに付与する手順と、を備えることで、
クエリ実行時に、前記演算毎に利用するバッファサイズを動的に制御することで、ストレージ利用と演算切り換えの回数を削減することを特徴としている。
【0021】
請求項9は、請求項7又は請求項8のクエリ処理制御方法において、
演算に対してバッファサイズの増量依頼を受けた際に、増量対象が出力バッファである場合、当該演算の制御バッファを前記空き領域とすることを特徴としている。
【0022】
請求項10は、請求項7又は請求項8のクエリ処理制御方法において、
演算に対してバッファサイズの増量依頼を受けた際に、増量対象が制御バッファである場合、上限値が設定された当該演算の出力バッファを前記空き領域とすることを特徴としている。
【0023】
請求項11は、請求項7又は請求項8のクエリ処理制御方法において、
演算に対してバッファサイズの増量依頼を受けた際に、前記演算以外の他の演算の入力が完了している制御バッファを前記空き領域とすることを特徴としている。
【0024】
請求項12は、請求項7又は請求項8のクエリ処理制御方法において、
演算に対してバッファサイズの増量依頼を受けた際に、上限値が設定された空きのバッファを前記空き領域とすることを特徴としている。
【0025】
請求項13のクエリ処理制御プログラムは、請求項7から請求項12のいずれか1項に記載の各手順をコンピュータに実行させることを特徴としている。
【発明の効果】
【0026】
請求項1のクエリ処理制御装置によれば、クエリ処理装置から演算指定でバッファ増量依頼を受け、バッファ情報における当該バッファの利用状況に応じて終了した演算のバッファ領域を移行することでバッファのサイズを変更するので、クエリ処理実行時に演算毎に利用するメモリサイズを制御することができる。その結果、演算が利用するバッファを動的に制御して、利用可能なメモリサイズを超えることを抑制し、ストレージの利用と演算の切り替えを最小限にすることで、大規模データの確実なクエリ処理実行及び処理の高速化を実現することができる。
【0027】
請求項2のクエリ処理制御装置によれば、クエリ実行制御部が実行計画を基にバッファ制御部からバッファ情報を取得して演算が利用するバッファサイズを指定し、クエリ処理方式に沿って演算処理部に演算処理を依頼し、必要に応じてバッファ制御部にバッファの増量依頼することで、バッファのサイズを変更することができる。
【0028】
請求項7のクエリ処理制御方法によれば、クエリを解釈して生成したツリー構造の最下位の演算から順に処理する実体化型クエリ処理方式により、クエリ演算の実行計画を生成することができる。
【0029】
請求項8のクエリ処理制御方法によれば、クエリを解釈して生成したツリー構造の最上位から順に下位の演算にデータ生成を依頼して処理する要求駆動型クエリ処理方式により、クエリ演算の実行計画を生成することができる。
【0030】
請求項3のクエリ処理制御装置及び請求項9のクエリ処理制御方法によれば、演算の増量対象が出力バッファである場合に、当該演算の制御バッファを当該演算のバッファ領域に移行することでバッファのサイズを変更することができる。
【0031】
請求項4のクエリ処理制御装置及び請求項10のクエリ処理制御方法によれば、演算の増量対象が制御バッファである場合に、上限値が設定された当該演算の出力バッファを当該演算のバッファ領域に移行することでバッファのサイズを変更することができる。
【0032】
請求項5のクエリ処理制御装置及び請求項11のクエリ処理制御方法によれば、他の演算の入力が完了している制御バッファを増量対象の演算のバッファ領域に移行することでバッファのサイズを変更することができる。
【0033】
請求項6のクエリ処理制御装置及び請求項12のクエリ処理制御方法によれば、上限値が設定された空きのバッファを増量対象の演算のバッファ領域に移行することでバッファのサイズを変更することができる。
【0034】
請求項13のクエリ処理制御プログラムによれば、コンピュータ上にクエリ処理制御装置を構築させることができる。
【発明を実施するための形態】
【0036】
本発明の一実施形態のクエリ処理制御装置について、
図1の構成ブロック図を参照しながら説明する。
クライアント1、ストレージ2、バッファ3、クエリ処理装置10及びバッファ管理装置20は、基本プログラムや各種の基本デバイスが記憶されたROMと、各種のプログラムやデータが記憶されるハードディスクドライブ装置(HDD)と、CR−ROMやDVD等の記憶媒体からプログラムやデータを読み出すメディアドライブ装置と、プログラムを実行するCPUと、このCPUにワークエリアを提供するRAMと、外部装置と通信するパラレル/シリアルI/Fとを主要部分とする一般的な構成を備えたコンピュータ上に構築されている。
例えば、上述した構成を有するコンピュータにおいて、クエリ処理を実行するためのクエリ処理制御プログラムがメディアドライブ装置を介してHDDにインストールされることでクエリ処理制御装置が構築される。
【0037】
クライアント1は、クエリ処理装置10に対してクエリを投稿し、処理結果を取得する。クエリ処理装置10は投稿クエリの処理結果を出力し、バッファ管理装置20はクエリの演算処理を行うバッファ(バッファ領域)3を管理する。
クエリ処理装置10は、クライアント1が投稿したクエリに対して、ストレージ2から必要なデータを取得して、バッファ管理装置20が指定するサイズのバッファ(バッファ領域)3上でクエリの演算を処理することで、処理結果を生成し、ユーザに処理結果を返す。
【0038】
ストレージ2は、クエリ処理装置10上及びネットワーク経由先の磁気ディスク、SSD(Solid State Drive)、フラッシュメモリ、物理メモリ、外部記憶媒体を含む装置であり、クエリ処理対象のデータを所持している。
【0039】
バッファ管理装置20は、バッファ3のサイズを決定するバッファ計画部21と、バッファ3の利用状況からサイズを変更するバッファ制御部22と、バッファ3の利用状況を取得するバッファ利用量収集部23から構成されている。
バッファ計画部21は、クエリ処理装置10から実行するクエリの実行計画を取得して、事前設定された利用可能なメモリサイズ(利用可能メモリ26)と、クエリ処理装置10の演算の実装情報(演算の実装情報25)から演算毎のバッファ3の初期設定サイズを決定し、バッファ情報27を作成する。
【0040】
バッファ制御部22は、クエリ処理装置10から演算指定でバッファ情報提供依頼を受け、バッファ情報27を提供するとともに、クエリ処理装置10から演算指定でバッファ増量依頼を受け、バッファ情報27における当該バッファの利用状況からバッファ3のサイズを変更する。バッファサイズを変更することで、演算が利用するバッファを動的に制御し、演算の切り替えを最小限にすることができる。また、バッファを増量することで、演算が利用可能なメモリサイズを超えることを抑制することができる。
【0041】
バッファ利用量収集部23は、クエリ処理装置
10から演算処理によって変化したバッファ3の利用状況を取得してバッファ情報27の更新を行うことで、演算処理で利用するメモリ上のバッファ 領域を管理することができる。
【0042】
次に、バッファ管理装置20においてバッファ情報27の作成及び変更を行う場合の処理について、
図2〜5を参照して説明する。
先ず、バッファ情報27の構成について、
図2を参照して説明する。op[i]はi番目の演算処理(演算を実際に処理する動作)を示し、B[i]は演算処理op[i]が利用するバッファを示す。
バッファBは、投稿クエリの演算単位に生成される。バッファは、処理結果を格納する出力バッファoutbufと、演算処理に必要な中間結果を格納する制御バッファctrlbufから構成される。
演算(処理の内容)には、「結合」「直積」「集計」「整列」「集合」「選択」「射影」等の関係代数で定義されているものが存在し、演算専用のバッファが用意される。演算で処理される入力データは、その演算の直下の演算の出力バッファと、自身専用の制御バッファから取得する。
【0043】
通常の実行計画では、最下位の演算はストレージ2からデータを取得するScan演算であり、最上位の演算はクライアント1に処理結果を返すOutput演算である。バッファ利用の例外として、Scan演算は入力先がストレージ2であり、Output演算は専用のバッファが存在しない。従って、演算毎のバッファの数は、演算の数−1となる。また、演算の実装アルゴリズムによって、制御バッファの有無が異なる。
例えば、結合演算のアルゴリズムがHash Joinの場合、片方の入力データから生成したハッシュテーブルを制御バッファに保管する必要がある。一方で、射影演算のように、一時的にデータを保存する必要のない演算の場合、制御バッファは不要となる。このために、クエリ処理装置10が処理可能な演算それぞれに対する制御バッファの有無を、演算の実装情報25に定義する。
【0044】
バッファ管理装置20のバッファ計画部21における処理手順について、
図3のフローチャート図を参照して説明する。
クエリ処理装置10側からクエリの実行計画を取得し(ステップ31)、演算の構成から、バッファ情報27の元となるツリー構造を生成する。
次に、事前に設定された利用可能なメモリサイズと、演算の実装情報を元に、バッファ情報の各演算にバッファのサイズを設定していく(ステップ32)。演算の実装情報には、実行計画で出現する演算の種類毎に、制御バッファの有無や、サイズの設定方法が設定されている。
【0045】
最も単純なバッファサイズの決定方法は、利用可能なメモリサイズをバッファの数で割った値をバッファサイズに設定する。制御バッファがあるバッファは、そのバッファサイズを半分にして出力バッファと制御バッファのサイズに設定する。
各演算のバッファをメモリ上に確保し、バッファ情報27を作成する(ステップ33)。
【0046】
バッファ制御部22におけるバッファ増量処理の処理手順について、
図4のフローチャート図を参照して説明する。
バッファ制御部22がクエリ処理装置10から演算のバッファの増量依頼を受けると(ステップ41)、バッファ情報27から空いているバッファを検索し(ステップ42)、バッファの空き領域の有無を判定する(ステップ43)。
ステップ43でバッファの空き領域を確保できた場合、対象のバッファに付与し(ステップ44)、かつ当該空き領域を開放する。これらの変更をバッファ情報27に適用する(ステップ45)。
【0047】
ステップ43で空き領域を確保できなかった場合、増量対象が制御バッファか出力バッファのどちらなのかを判断する(ステップ46)。
増量対象が制御バッファの場合は、ストレージ2の領域を付与して(ステップ47)、バッファ情報を更新する(ステップ45)。
増量対象が出力バッファの場合は、増量不可としてクエリ処理装置10に返す(ステップ48)。なお、出力バッファは拡張しないことで処理が止まることはないため、ストレージ2の領域を付与しない。そのため、ストレージ2のバッファ領域としての利用を最小限に抑えることができる。
【0048】
ステップ43におけるバッファの空き領域の有無の判定基準は複数存在し、以下に列挙する。これらは、それぞれ単体として利用可能であり、また組み合せて利用することも可能である。
・演算処理が終了しているバッファ(出力バッファ及び制御バッファ)の未使用領域を「空き」と判定する。
・増量依頼されたバッファが出力バッファの場合、当該演算の制御バッファの未使用領域を「空き」と判定する。ただし、制御バッファへの入力が完了していることを前提とする。
・増量依頼されたバッファの演算以外の入力が完了している制御バッファの未使用領域を「空き」と判定する。
・増量依頼されたバッファが制御バッファの場合、当該演算の出力バッファの未使用領域を「空き」と判定する。ただし、まだ利用される可能性があるため、全領域を取得されないために、空き領域として取得可能な上限サイズを出力バッファサイズの割合(例えば、50%まで等)で設定する必要がある。
・増量依頼されたバッファの演算以外のバッファの未使用領域を「空き」と判定する。ただし、まだ利用される可能性があるため、全領域を取得されないために、空き領域として取得可能な上限サイズを出力バッファサイズの割合(例えば、50%まで等)で設定する必要がある。
・増量依頼されたバッファが制御バッファの場合、外部記憶装置としてのストレージの空き領域を「空き」と判定してもよい。
【0049】
次に、バッファ利用量収集部23における処理手順について、
図5のフローチャート図を参照して説明する。
まず、クエリ処理装置10の演算処理におけるバッファの利用状況を取得する(ステップ51)。取得する利用状況の情報は、入力元のバッファ(直下の演算の出力バッファもしくは当該演算の制御バッファ)、入力データサイズ、出力先のバッファ(当該演算の出力バッファもしくは制御バッファ)、出力データサイズ、該当の演算の処理完了フラグ、制御バッファがある場合の制御バッファへの入力完了フラグを含む。
次に、取得した利用状況の情報から、バッファ情報における入力元のバッファのサイズと出力先のバッファの利用サイズ、空き領域、完了状況を更新する(ステップ52及びステップ53)。
【0050】
上述したクエリ処理制御装置によれば、クエリ処理装置10でのクエリ処理実行時において、バッファ管理装置20のバッファ情報27で利用状況を管理することで、クエリの演算毎に利用するバッファサイズを動的に制御し、利用可能なメモリサイズを超えることを抑制し、ストレージ2の利用と演算の切り替えを最小限にすることで、大規模データの確実なクエリ処理実行及び処理の高速化を実現することができる。
【0051】
続いて、クエリ処理装置10の実施形態として、実体化型クエリ処理方式と、要求駆動型クエリ処理方式に適用した場合の構成について、
図6を参照して説明する。
図6のクエリ処理制御装置のクエリ処理装置10は、クエリの実行計画(ツリー構造)を生成するクエリ計画部11と、バッファの増量依頼をするクエリ実行制御部12と、バッファの利用量の変化を把握する演算処理部13とを備えて構成されている。
【0052】
クエリ計画部11は、クライアント1が投稿したクエリを解釈し、クエリの実行計画を生成してバッファ計画部21及びクエリ実行制御部12に実行計画を渡す。
クエリ実行制御部12は、実行計画を基に、バッファ制御部22からバッファ情報を取得して演算が利用するバッファサイズを指定し、クエリ処理方式に沿って演算処理部13に演算処理を依頼し、必要に応じてバッファ制御部22にバッファの増量依頼をする。
演算処理部13は、クエリ実行制御部12から依頼された演算を処理し、バッファの利用量の変化をバッファ利用量収集部23に渡す。
【0053】
実体化型クエリ処理方式を採用した場合のクエリ処理制御装置におけるクエリ実行制御部12の処理手順について、
図7のフローチャート図を参照して説明する。
クエリ計画部11から実行計画を取得し(ステップ701)、ツリー構造の最下位の演算から処理を開始する(ステップ702)。通常、最下位の演算は、ストレージ2からデータを取得するScan演算であり、これを選択する。
ここで、選択された演算とその直下の演算のバッファ情報をバッファ制御部22から取得する(ステップ703)。なお、Scan演算の場合は直下の演算は存在しないため、直下の演算のバッファ情報は取得しない。同様にOutput演算も自身のバッファが存在しないため、取得しない。
【0054】
バッファ情報を基に対象演算の実行判定をする(ステップ704)。
実行可能である場合、演算処理部13に当該演算の実行を依頼する(ステップ705)。
実行完了後、その処理によるバッファ情報の変化を知るために、バッファ制御部22からバッファ情報を再度取得する(ステップ706)。
ここで、当該演算の増量判定を行い(ステップ707)、増量が必要な場合は、バッファ制御部22に増量を依頼する(ステップ708)。
増量ができた場合(ステップ709)、再度演算処理に戻る(ステップ705)。
増量ができなかった場合、対象の演算を直上の演算に変更し(ステップ710)、再度バッファ情報の取得(ステップ703)と実行判定(ステップ704)に戻る。
【0055】
ステップ707のバッファの増量判定において、増量が不要であった場合、当該演算の終了判定を行う(ステップ711)。
終了したと判定された場合、当該演算を終了設定する(ステップ712)。ここでもし実行計画における最上位の演算であった場合、クエリ処理完了となる。
【0056】
ステップ711で終了していないと判定された場合、次に処理する演算を判定(推移判定)し、対象の演算を直上の演算(ステップ710)又は直下の演算(ステップ714)に変更し、再度バッファ情報の取得(ステップ703)と実行判定(ステップ704)に戻る。
また、ステップ704の演算の実行判定において、実行しないと判定された場合は、推移判定(ステップ713)によって対象の演算を変更し(ステップ710又はステップ714)、再度バッファ情報の取得(ステップ703)と実行判定(ステップ704)に戻る。
【0057】
実体化型クエリ処理方式におけるクエリ実行制御部12の実行判定(ステップ704)は、以下の条件(1)及び(2)を全て満たす場合に「実行する」と判定される。全て満たさない場合は、「実行しない」と判定される。
(1)出力バッファが空である。
(2)下位の出力バッファにデータがある、または、入力データがストレージで読み込みデータの残りがある、または、制御バッファにデータがある。
【0058】
実体化型クエリ処理方式におけるクエリ実行制御部12の増量判定(ステップ707)は、以下の条件(1)及び(2)を全て満たす場合に増量すると判定される。満たさない場合は、増量しないと判定される。
(1)演算結果が格納されたバッファが上限である。
(2)下位の出力バッファにデータがある。
【0059】
実体化型クエリ処理方式におけるクエリ実行制御部12の終了判定(ステップ711)は、以下の条件(1)〜(3)を全て満たす場合に「終了する」と判定される。全て満たさない場合は、「終了しない」と判定される。
(1)下位の演算が終了している、または、入力がストレージである。
(2)下位の出力バッファが空である、または、ストレージの読み込みデータの残りがない。
(3)制御バッファがない、または、制御バッファが空である。
【0060】
実体化型クエリ処理方式におけるクエリ実行制御部12の演算推移判定(ステップ713)は、以下の条件(1)及び(2)を全て満たす場合に「直下の演算」に推移すると判定される。全て満たさない場合は、「直上の演算」に推移すると判定される。
(1)出力バッファが空である。
(2)直下の演算が未終了である。
【0061】
要求駆動型クエリ処理方式を採用した場合のクエリ処理制御装置におけるクエリ実行制御部12の処理手順について、
図8のフローチャート図を参照して説明する。
クエリ計画部11から実行計画を取得し(ステップ801)、ツリー構造の最上位の演算から処理を開始する(ステップ802)。通常、最上位の演算は、クライアントに処理結果を渡すOutput演算であり、これを選択する。
ここで、選択された演算とその直下の演算のバッファ情報をバッファ制御部22から取得する(ステップ803)。なお、Scan演算の場合は直下の演算は存在しないため、直下の演算のバッファ情報は取得しない。同様にOutput演算も自身のバッファが存在しないため、取得しない。
【0062】
バッファ情報を基に対象演算の実行判定をする(ステップ804)。
実行不可である場合、直下の演算を対象の演算とし(ステップ814)、出力バッファのサイズ分のデータ作成を依頼して、再度バッファ情報の取得(ステップ803)と実行判定(ステップ804)に戻る。
実行可能である場合、演算処理部13に当該演算の実行を依頼する(ステップ805)。
実行完了後、その処理によるバッファ情報の変化を知るために、バッファ制御部22からバッファ情報を再度取得する(ステップ806)。
【0063】
ここで、当該演算の制御バッファサイズと、直下の演算の出力バッファサイズ(作成要求するデータサイズ)の増量判定を行う(ステップ807)。
当該演算の制御バッファサイズに増量が必要な場合は、バッファ制御部22にこの増量を依頼する(ステップ808)。
ステップ809で制御バッファサイズの増量ができた場合は、再度演算処理に戻る(ステップ805)。制御バッファサイズの増量ができなかった場合は、対象の演算を直上の演算に変更し(ステップ810)、再度バッファ情報の取得(ステップ803)と実行判定(ステップ804)に戻る。
【0064】
ステップ807において直下の演算の出力バッファサイズの増量が必要な場合も、同様にバッファ制御部22にこの増量を依頼する(ステップ808)。
ステップ809で出力バッファサイズの増量できなかった場合は、同様に直上の演算に移行する(ステップ810)が、増量できた場合は、次に処理する演算を判定(推移判定)する(ステップ812)。
ステップ812で直上の演算と判断され場合は、対象の演算を変更して(ステップ810)、再度バッファ情報の取得(ステップ803)と実行判定(ステップ804)に戻る。
ステップ812で「直下の演算」と判断された場合は、「直下の演算」にデータ生成を依頼する(ステップ814)。
バッファの増量判定(ステップ807)において、増量が不要であった場合、当該演算の終了判定を行う(ステップ811)。
【0065】
終了したと判定された場合、当該演算を終了設定する(ステップ813)。ここでもし実行計画における最上位の演算であった場合、クエリ処理完了となる。
ステップ811で終了していないと判定された場合、次に処理する演算を判定(推移判定)し(ステップ812)、対象の演算を変更して(ステップ810、814)、再度バッファ情報の取得(ステップ803)と実行判定(ステップ804)に戻る。
【0066】
要求駆動型クエリ処理方式におけるクエリ実行制御部12の実行判定(ステップ804)は、以下の条件(1)及び(2)を全て満たす場合に「実行する」と判定される。全て満たさない場合は、「実行しない」と判定される。
(1)出力バッファが上限でない。
(2)下位の出力バッファにデータがある、または、入力データがストレージで読み込みデータの残りがある。
【0067】
要求駆動型クエリ処理方式におけるクエリ実行制御部12の増量判定(ステップ807)は、以下の条件を全て満たす場合に、対象の演算の制御バッファを「増量する」と判定される。全てを満たさない場合は、「増量しない」と判定される。
(1)制御バッファが上限である。
(2)下位の出力バッファにデータがある。
一方で、以下の条件を全て満たす場合に、直下の演算の出力バッファを「増量する」と判定される。
(1)演算結果が格納されたバッファ(出力バッファもしくは制御バッファ)が上限に達してない。
(2)直下の演算が終了していない。
【0068】
要求駆動型クエリ処理方式におけるクエリ実行制御部12の終了判定(ステップ811)は、以下の条件(1)〜(3)を全て満たす場合に「終了する」と判定される。全て満たさない場合は、「終了しない」と判定される。
(1)下位の演算が終了している、または、入力がストレージである。
(2)下位の出力バッファが空である、または、ストレージの読み込みデータの残りがない。
(3)制御バッファがない、または、制御バッファが空である。
【0069】
要求駆動型クエリ処理方式におけるクエリ実行制御部12の推移判定(ステップ812)は、以下の条件(1)及び(2)を全て満たす場合に直上に推移すると判定される。全て満たさない場合は、直下に推移すると判定される。
(1)出力バッファが上限に達する(要求量のデータ作成完了する)、または、下位の演算が終了する。
(2)出力バッファが上限に達する(要求量のデータ作成完了する)、または、出力バッファが空である。
【0070】
実体化型クエリ処理方式及び要求駆動型クエリ処理方式における演算処理部13の処理手順について、
図9のフローチャート図を参照して説明する。
クエリ実行制御部12から演算の実行依頼を受け(ステップ91)、演算の種類に応じて処理を開始する(ステップ92)。
処理開始後、出力先のバッファ(演算の出力バッファ、もしくは制御バッファ)が上限に達するか、入力先のバッファ(演算の制御バッファ、もしくは直下の演算の出力バッファ)が空になった場合、演算処理を終了する(ステップ93)。
その後、バッファ利用量収集部23に、バッファ利用量収集部23が収集している利用状況の情報を渡す(ステップ94)。