DBMSが稼動する計算機上で、先読み部を動作させる。当該先読み部は、DBMS主処理を行うデータ処理部と独立して先読み処理を行う。その際、データ処理部が設定するデータへのロックの影響を先読み部が受けないようにする。そして、データ処理部及び先読み部がデータを共有することによって、計算機のメモリの利用量を抑えながら高い先読み効果を得ることができる。また、計算機の動作状況又はDBMS主処理の動作状況等に応じて先読み部を外部から調整することによって、好適な先読み動作を実現する。
(第1の実施の形態)
第1の実施の形態では、一台の計算機上でDBMSが動作する。そして、当該計算機のメモリ上に割り当てられたバッファをデータ処理部及び先読み部が共有する。
また、第1の実施の形態では、先読み部は、DBMS中の一つの機能として実現される。
図1は、本発明の第1の実施の形態の計算機システムのブロック図である。
計算機システムは、DBサーバ42、APサーバ44及び記憶装置46を含む。
APサーバ44は、APプログラムを実行することによって、DBMS60に対して処理の要求を発行する計算機である。
DBサーバ42とAPサーバ44とは、ネットワーク24を経由して接続され、相互に通信可能である。また、DBサーバ42は、I/Oパス34を経由して一台以上の記憶装置46に接続される。
記憶装置46は、DBサーバ42にデータの記憶領域を提供する。記憶装置46は、例えば、複数のディスク装置(HDD)にデータを記憶する。
DBサーバ42は、DBMS60を実行する計算機である。また、DBサーバ42は、CPU12、メモリ14、HDD16、CD−ROMドライブ18、ネットワークI/F22及びI/OパスI/F32を備える。
CPU12、メモリ14、HDD16、CD−ROMドライブ18、ネットワークI/F22及びI/OパスI/F32は、内部バス20で接続される。
CPU12は、メモリ14上のプログラムを実行することによって各種処理を実行する。なお、なお、DBサーバ42は、本説明図においてCPU12を二つ備えているが、いくつ備えていてもよい。
メモリ14は、DBMS60、共有管理情報62、共有バッファ64及びOS52を記憶する。OS52は、DBサーバ42の全体を制御する。例えば、OS52は、プログラム実行制御、ハードウェア制御、計算機間の通信、HDD16の記憶領域の管理又は記憶装置46の記憶領域の管理等を行う。更に、本実施の形態においては、OS52は、CPU12の利用率を計測し、それを他のプログラムに提供する。また、OS52は、マルチスレッド実行モデルに対応したスレッド機能を有する。なお、本実施の形態は、スレッド機能の代りに、OS52等が提供するマルチプロセス機能を利用してもよい。
DBMS60は、データベース(DB)に関する処理を実施するプログラムである。なお、DBサーバ42は、複数のDBMS60を実行してもよい。DBMS60が管理するDBのデータは、記憶装置46に格納される。
共有管理情報62は、図2で詳細を説明するが、DBMS60の処理に関する情報である。
共有バッファ64は、高頻度で利用されるデータを記憶する領域である。
なお、OS52及びDBMS60等は、これらを記憶している可搬記憶媒体(CD−ROM等)からCD−ROMドライブ18を用いて読み出され、HDD16又は記憶装置46にインストールされる。
ネットワークI/F22は、ネットワーク24を介して、APサーバ44と接続するインタフェースである。I/OパスI/F32は、I/Oパス34を介して、記憶装置46と接続するインタフェースである。
APサーバ44は、CPU82、メモリ84、HDD86及びネットワークI/F85を備える。
CPU82、メモリ84、HDD86及びネットワークI/F85は、内部バス80で接続される。
CPU82は、メモリ84上のプログラムを実行することによって各種処理を実行する。なお、なお、APサーバ44は、本説明図においてCPU82を二つ備えているが、いくつ備えていてもよい。
メモリ84は、APプログラム70及びOS89を記憶する。
OD89は、APサーバ44の全体を制御する。
APプログラム70は、業務を実施するプログラムである。APプログラム70は、DBMS60に対してDBに関する処理要求(クエリ)を発行する。
なお、本説明図では、APプログラム70は、APサーバ44上で動作しているが、DBサーバ42上で動作してもよい。また、APサーバ44は、複数のAPプログラム70を実行してもよい。
また、本説明図では、APサーバ44は、一台を図示しているが、複数台備えられていてもよい。また、その上で複数のAPプログラム70が動作する場合も本実施例を適用可能である。
以下、本発明の実施の形態のDBMS60の処理を説明する。
図2は、本発明の第1の実施の形態のDBMS60の機能の説明図である。
共有管理情報62は、スキーマ300、処理管理情報400、共有DBデータ管理情報450及び先読み処理情報500を含む。
スキーマ300は、DBMS60が管理するDBの定義等の情報であり、表定義情報、索引定義情報、オブジェクト管理情報及びファイル管理情報を含む。
表定義情報は、図5Aで後述するが、DBMS60が管理するDBで定義されている表の定義情報である。索引定義情報は、図5Bで後述するが、DBMS60が管理するDBで定義されている索引の定義情報である。オブジェクト管理情報は、図5Cで後述するが、オブジェクトの記憶領域に関する情報である。ファイル管理情報は、図5Dで後述するが、DBMS60が管理するDBのデータを記憶装置46に格納する際に利用するファイルに関する情報である。
処理管理情報400は、クエリ管理情報、トランザクション管理情報及びクエリプランを含む。
クエリ管理情報は、図6Aで後述するが、DBMS60が実行するクエリの管理情報である。トランザクション管理情報は、図6Bで後述するが、APプログラム70からのクエリによるトランザクションの状態を管理する情報である。クエリプランは、図7で後述するが、クライアント処理部202が作成したクエリに対応する処理の実行計画に関する情報である。
共有DBデータ管理情報450は、共有バッファ定義情報、バッファブロック管理情報、バッファグループ管理情報、ロック管理情報及びI/O待ち管理情報を含む。
共有バッファ定義情報は、図8Aで後述するが、共有バッファ64の記憶領域に関する情報である。バッファブロック管理情報は、図8Bで後述するが、共有バッファ64内のブロックを管理する情報である。なお、ブロックは、共有バッファ64の記憶領域の管理単位である。バッファグループ管理情報は、図8Cで後述するが、共有バッファ64を分割するためにグループ化されたブロックの各グループを管理する情報である。ロック管理情報は、図8Dで後述するが、ページのロックを管理する情報である。I/O待ち管理情報は、図8Eで後述するが、I/O完了待ちのクエリを管理する情報である。
先読み処理情報500は、総先読み数管理情報、先読み管理情報及び先読み要求管理情報を含む。
総先読み数管理情報は、図9Aで後述するが、先読み処理で利用するスレッドの数を管理する情報及び先読み処理によって読み出したページを保持するブロックの数を管理する情報である。先読み管理情報は、図9Bで後述するが、クエリに対応して実行する先読み処理の管理情報である。先読み要求管理情報は、図9Cで後述するが、先読みI/Oを発行する処理を実行するスレッドを管理する情報である。
DBMS60は、クライアント処理部202、実行管理部204、データ処理部206、先読み部208及び共有DBデータ管理部210を有する。
また、本説明図には、それぞれの構成部が共有するデータに関するインタフェースの概略が記載されている。なお、すべての構成部は、必要に応じてスキーマ300を参照する。
クライアント処理部202は、APプログラム70からクエリを取得する。次に、取得したクエリに対応するクエリプラン(クエリの実行計画)を作成する。次に、作成したクエリプランを処理管理情報400に保存する。次に、クエリの実行を実行管理部204に要求する。
クエリが実行されると、クライアント処理部202は、データ処理部206から処理結果を受領し、受領した処理結果をAPプログラム70に送る。そして、クライアント処理部202は、実行管理部204にクエリの終了を通知し、当該クエリにクエリプランを処理管理情報400から削除する。
実行管理部は204は、クライアント処理部202からクエリの実行要求を受ける。実行管理部204は、クエリの実行要求を受けると、先読み処理情報500に必要な情報を設定する。次に、実行管理部204は、データ処理部206にクエリプランに従った処理の実行を要求する。更に、実行管理部204は、先読み管理部208に先読み処理の実行を要求する。そして、実行管理部204は、クライアント処理部202からクエリの処理の完了の通知をクライアント処理部202から受けると、当該クエリに対応する先読み処理の情報を先読み処理情報500から削除する。
また、実行管理部204は、処理の実行状態及び/又はDBサーバ42のCPU利用率等を監視する。そして、実行管理部204は、監視している処理の実行状態及び/又はDBサーバ42のCPU利用率に応じて、実行パラメータを先読み処理情報500に設定することによって、先読み部208の先読み処理を制御する。
データ処理部206は、処理の要求を実行管理部204から受けると、処理管理情報400に含まれるクエリプランに従って処理を実行する。そして、データ処理部206は、処理を終了すると、処理結果をクライアント処理部202に送る。
データ処理部206は、データ取得要求を共有DBデータ管理部210に送信することによって、処理を実行する際に必要なデータを取得する。このとき、データ処理部206は、要求したデータに対して設定すべきロックに関する情報も、共有DBデータ管理部210に送信する。
また、データ処理部206は、取得したデータの利用が完了すると、データ利用完了報告を共有DBデータ管理部210に送信する。つまり、データ処理部206は、共有バッファ64から当該データを破棄できることを共有DBデータ管理部210に報告する。
また、データ処理部206は、処理を完了すると、ロックの解除を共有DBデータ管理部210に指示する。更に、データ処理部206は、先読み処理情報500を適宜参照し、先読みする必要があるか否かを判定する。そして、先読みが必要であれば、先読み部208に先読み要求を送信する。
先読み部208は、実行管理部204又はデータ処理部206から先読み要求を受けると、先読み処理を実行する。なお、先読み部208は、高いI/O並列性を引き出すために、マルチスレッド型の実行モデルを用いて先読み処理を実行する。また、先読み部208は、先読み処理情報500に基づいて、先読み処理を実行する。
先読み部208は、データ処理部206が実行する処理(クエリに対応する処理)から高い独立性を持って、先読み処理を実行する。なぜなら、先読み処理は、データを更新しないからである。また、先読みの効果は、I/O並列性を高めることによって、高めることができる。
先読み部208は、共有DBデータ管理部210にデータ参照要求を送信することによって、必要なデータを取得する。なお、先読み部が送信するデータ参照要求は、データ処理部206が送信するデータ取得要求と異なる。
先読み部208は、取得したデータの利用を完了すると、データ参照完了報告を共有DBデータ管理部210に送信する。
共用DBデータ管理部210は、データ処理部206からデータ取得要求を受けると、共有バッファ64内のデータへロックを設定する。そして、要求データが記憶されている領域の先頭アドレスをデータ処理部206に通知する。なお、要求データが共有バッファ64に記憶されていない場合、共用DBデータ管理部210は、共有バッファ64に当該データを読み出す。
また、共用DBデータ管理部210は、データ利用完了報告をデータ処理部206から受ける。このとき、共用DBデータ管理部210は、データが更新されたか否かに関する情報を取得する。
また、共用DBデータ管理部210は、ロックの解除指示をデータ処理部206から受けると、設定していたロックを解放する。そして、ロックの解放待ちをしていた処理に対して、ロックを与える。
共用DBデータ管理部210は、データ参照要求を先読み部208から受けると、要求データが記憶される領域の先頭アドレスを先読み部208に通知する。この場合、共用DBデータ管理部210は、データのロックを確認しない。
また、共用DBデータ管理部210は、データ参照完了報告を先読み部206から受けつける。また、共用DBデータ管理部210は、共有DBデータ管理情報450を適宜更新する。
以下、本実施の形態におけるDBMS60のデータ記憶管理方法を説明する。
DBMS60は、オブジェクトを「ページ」と呼ぶ単位に分割して記憶領域を管理する。なお、オブジェクトは、表又は索引である。本実施の形態では、ページの大きさは、ページを記憶するファイル毎に一定であるとする。
ファイルは、ページの大きさで分割される。そして、それぞれのページには、ページIDが付加される。なお、ページIDは、ページの一意な識別子であり、そのページが記憶されるファイルの識別子及び当該ファイル中での通番から構成する。つまり、データが記憶されているファイル及びデータの記憶位置は、ページIDによって一意に特定できる。
B−Tree形式索引でリーフページ内の表データへのポインタは、同様に、ページID及びページ内のデータ通番で構成されるとする。
データ処理部206及び先読み部208は、共有バッファ64に記憶されているデータを利用する。共用DBデータ管理部210は、共有バッファ64の領域を「ブロック」と呼ぶ固定長の領域に細分化し、ブロックを単位として管理する。各ブロックには、ブロックの一意な識別子であるブロックIDが付加される。なお、ブロックIDは、例えば、ブロックの大きさを単位とし、共有バッファ64の領域の先頭からのオフセットとする。これによって、メモリ14上のアドレスが、ブロックIDによって特定できる。
ブロックは、複数のグループに分割される。そして、オブジェクトごとに利用するグループを定める。ブロックのグループには、グループIDが付加される。グループIDは、グループの一意な識別子である。
各グループでは、以下で説明するように、LRU置換アルゴリズムに基づいて、ブロックを管理する。
図3は、本発明の第1の実施の形態のグループにおけるブロック管理に利用するLRU管理リストの説明図である。
本実施の形態のLRU管理リストは、上位LRU管理リスト642と、下位LRU管理リスト644とで分割されている。
上位LRU管理リスト642は、一般的なLRU置換アルゴリズムで利用されるLRU管理リストである。また、上位LRU管理リスト642は、MRU(Most Recently Used)端側の領域を用いる。
下位LRU管理リスト644は、LRU(Least Recently Used)端側の領域を用いる。
データ処理部206からのデータ取得要求又は先読み部208からのデータ参照要求によって要求されたページを記憶するブロックが共有バッファ64に存在する場合には、共用DBデータ管理部210は、当該ブロックを利用する。一方、要求ページを記憶するブロックが共有バッファ64に存在しない場合には、共用DBデータ管理部210は、下位LRU管理リスト644のLRU端に接続されたエントリによって管理されるブロックに、要求ページを新たに記憶する。
また、共用DBデータ管理部210は、データ処理部206からデータ取得要求を受けると、要求ページを記憶するブロックの管理情報を上位LRU管理リスト642のMRU端に繋ぎ直す。
一方、共用DBデータ管理部210は、先読み部208からデータ参照要求を受けると、以下の処理を行う。まず、共用DBデータ管理部210は、要求ページを記憶するブロックの管理情報が上位LRU管理リスト642又は下位LRU管理リスト644のいずれに存在するかを判定する。なお、共用DBデータ管理部210は、要求ページを記憶するブロックの管理情報が上位LRU管理リスト642及び下位LRU管理リスト644のいずれにも存在しない場合、下位LRU管理リスト644に存在したと判定する。
管理情報が上位LRU管理リスト642に存在する場合、共用DBデータ管理部210は、LRU管理リストを変更しない。一方、管理情報が下位LRU管理リスト644に存在する場合、共用DBデータ管理部210は、要求ページを記憶するブロックの管理情報を下位LRU管理リスト644のMRU端に繋ぎ直す。
これによって、共用DBデータ管理部210は、先読み部208が参照するデータを共有バッファ64に過度に記憶することを防ぐ。
次に、クエリプラン及び先読み処理の概略を説明する。
図4は、本発明の第1の実施の形態のDBMS60におけるクエリプランの説明図である。
クライアント処理部202は、APプログラム70からクエリ622を受信する。すると、受信したクエリ622から、木構造のクエリプラン624を作成する。
クエリプラン624は、ノード626A〜626I及び枝から構成される。ノード626A〜626Iは、クエリプラン624における処理ステップを示す。枝は、処理ステップ及びデータの依存関係を示す。
それぞれのノード626A〜626Iでは、索引参照、索引による表データアクセス、表データスキャン、フィルタ処理、結合演算、ソート、集計演算又は集合演算等が実行される。なお、フィルタ処理は、取得した表データを、条件で絞り込む処理である。
データ処理部206は、事前に与えられたルールに従ってクエリプランを解釈し、ノード626A〜626Iに対応する処理ステップを実行する。本実施の形態では、データ処理部206は、それぞれの処理ステップをデータ単位ごとに実行する。なお、データ単位は、実行する処理ステップの内容によって決まる。また、データ処理部206は、必要であれば複数の処理ステップを交互に実施してもよい。
本実施の形態では、B−Tree索引参照処理(ノード622A及びノード626D)及びその処理に続く索引による表データアクセス処理(ノード626B及び626E)を先読みの対象とする。
このとき、先読み部208は、クエリプランに含まれる検索条件、データ処理部206からの先読み要求で指示されたデータ値及び/又は過去の先読み処理によって把握したデータ値等から、索引の検索キー値を把握する。そして、索引の検索キー値を把握できた場合、把握した検索キー値に対応する索引データや表データを先読みする。
図5Aは、本発明の第1の実施の形態のスキーマ300に含まれる表定義情報310の構成図である。
表定義情報310は、オブジェクトID312及び表定義314を含む。
オブジェクトID312は、DBMS60が管理するDBで定義されている表の一意な識別子である。表定義314は、当該表の定義情報である。
図5Bは、本発明の第1の実施の形態のスキーマ300に含まれる索引定義情報320の構成図である。
オブジェクト管理情報330は、オブジェクトID322及び索引定義324を含む。
オブジェクトID322は、DBMS60が管理するDBで定義されている索引の一意な識別子である。索引定義324は、当該索引の定義情報である。
図5Cは、本発明の第1の実施の形態のスキーマ300に含まれるオブジェクト管理情報330の構成図である。
オブジェクト管理情報330は、オブジェクトID332、グループID334、対応ページID338及び索引ルートページID342を含む。
オブジェクトID332は、オブジェクトの一意な識別子である。グループID334は、当該オブジェクトを記憶しているブロックが属するグループの一意な識別子である。対応ページID338は、当該オブジェクトを記憶しているページの一意な識別子である。
索引ルートページ342は、当該オブジェクトのルートデータを記憶しているページの一意な識別子である。なお、索引ルートページ342は、当該オブジェクトがB−Tree形式索引である場合にのみ値が格納される。
図5Dは、本発明の第1の実施の形態のスキーマ300に含まれるファイル管理情報350の構成図である。
ファイル管理情報350は、ファイルID352、ページサイズ354、ページ数356及びファイルパス358を含む。
ファイルID352は、DBMS60がファイルを一意に識別する識別子である。ページサイズ354は、当該ファイルに記憶されるページの大きさである。ページ数356は、当該ファイルに記憶されるページの数である。ファイルパス358は、OS52が当該ファイルを一意に識別する識別子である。
図6Aは、本発明の第1の実施の形態の処理管理情報400に含まれるクエリ管理情報410の構成図である。
クエリ管理情報410は、クエリID412、トランザクションID414、処理優先度416、処理ステータス418、対象リソース422及びクエリプラン424を含む。
クエリID412は、クエリの一意な識別子である。本説明図では、クエリID412は、クライアントID及びAPプログラムがクエリに付加した通番で構成される。クライアントIDは、DBMS60がAPプログラム70を一意に識別する識別子である。
トランザクションID414は、当該クエリが属するトランザクションの識別子である。処理優先度416は、当該クエリを実行する際の処理の優先度を示す。
処理ステータス418は、当該クエリの現在の実行状態を示す。
処理ステータス418に「ロック設定待ち」が格納されている場合、対象リソース422には、値が格納される。対象リソース422は、ロック設定待ちの対象となるリソースを示す。
クエリプラン424は、当該クエリに対応するクエリプランを示す。
図6Bは、本発明の第1の実施の形態の処理管理情報400に含まれるトランザクション管理情報430の構成図である。
トランザクション管理情報430は、クライアントID432及びトランザクションID434を含む。
クライアントID432は、APプログラム70の一意な識別子である。トランザクションID434は、当該APプログラム70からのクエリによるトランザクションの一意な識別子である。なお、トランザクションが進行中の場合のみ、トランザクションID434には値が格納される。よって、トランザクションが進行中でない場合には、トランザクションID434には値が格納されない。
図7は、本発明の第1の実施の形態の処理管理情報400に含まれるクエリプラン600の構成図である。
クエリプラン600は、処理開始ステップID602、処理終了ステップID604、ステップID606、親ステップID608、子ステップID612、処理種別614及び処理詳細616を含む。
処理開始ステップID602は、クエリプランにおいて最初に実行される処理ステップの一意な識別子である。処理終了ステップID604は、クエリプランにおいて最後に実行される処理ステップの一意な識別子である。
ステップID606は、処理ステップの一意な識別子である。
親ステップID608は、当該処理ステップの親ステップの識別子である。なお、親ステップは、処理ステップ(子ステップ)の処理結果を利用する処理ステップである。子ステップID612は、当該処理ステップの子ステップの識別子である。
処理種別614は、当該処理ステップで実行される処理の内容を示す。
処理詳細616は、当該処理ステップで実行される処理の詳細を示す。なお、処理種別614に「索引参照」が格納されている場合、処理詳細616には、参照する索引のオブジェクトID及び索引の参照条件が格納される。また、処理種別614に「索引による表データアクセス」が格納されている場合、処理詳細616には、アクセス先の表のオブジェクトIDが格納される。また、処理種別614に「ネストループ結合」が格納されている場合、処理詳細616には、結合条件が格納される。
図8Aは、本発明の第1の実施の形態の共有DBデータ管理情報450に含まれる共有バッファ定義情報451の構成図である。
共有バッファ定義情報451は、バッファ領域情報452及びバッファブロックサイズ454を含む。
バッファ領域情報452は、メモリ14上の共有バッファ64の記憶領域に関する情報である。バッファ領域情報452は、共有バッファ64の先頭アドレス及び共有バッファ64のサイズを含む。バッファブロックサイズ454は、共有バッファ64内のブロックのサイズである。
図8Bは、本発明の第1の実施の形態の共有DBデータ管理情報450に含まれるバッファブロック管理情報460の構成図である。
バッファブロック管理情報460は、ブロックID462、ページID463、状態464、リンク情報466、利用数468及び先読み対応クエリID469を含む。
ブロックID462は、ブロックの一意な識別子である。ページID463は、当該ブロックに現在記憶されているページの一意な識別子である。
状態464は、当該ブロックに記憶されているデータの状態である。例えば、当該ブロックに記憶されているデータと記憶装置46に記憶されているデータとが一致している場合、状態464には「Clean」が格納される。また、当該ブロックに記憶されているデータと記憶装置46に記憶されているデータとが一致していない場合、状態464には「Dirty」が格納される。また、当該ブロックに記憶装置46からデータを読み出し中である場合、状態464には「Reading」が格納される。また、当該ブロックに有効データが記憶されていない場合、状態464には「Invalid」が格納される。
リンク情報466は、管理リスト及びポインタを含む。管理リストは、当該ブロックが属する管理リストの一意な識別子である。ポインタは、当該ブロックの管理リスト中での位置を示す。例えば、ポインタは、管理リストにおいて当該ブロックの直前及び直後に位置するブロックの一意な識別子である。
利用数468は、当該ブロックに記憶されているページを利用している処理の数である。
先読み対応クエリID469は、当該ブロックに記憶されているデータに関する先読み処理に対応するクエリの一意な識別子である。なお、先読み対応クエリID469には、当該ブロックに記憶されているデータが先読み処理によって読み出された場合にのみ値が格納される。
図8Cは、本発明の第1の実施の形態の共有DBデータ管理情報450に含まれるバッファグループ管理情報470の構成図である。
バッファグループ管理情報470は、グループID472、上位LRU管理リスト情報474及び下位LRU管理リスト情報476を含む。
グループID472は、ブロックが属するグループの一意な識別子である。
上位LRU管理リスト情報474は、当該グループに対応する上位LRU管理リスト642を管理する情報である。上位LRU管理リスト情報474は、ブロック数、先頭ブロックID及び終端ブロックIDを含む。ブロック数は、当該グループに対応する上位LRU管理リスト642に属するブロックの数である。先頭ブロックIDは、当該グループに属するブロックの中で、上位LRU管理管理リスト642の先頭に位置するブロックの一意な識別子である。終端ブロックIDは、当該グループに属するブロックの中で、上位LRU管理管理リスト642の終端に位置するブロックの一意な識別子である。
下位LRU管理リスト情報476は、当該グループに対応する下位LRU管理リスト644を管理する情報である。下位LRU管理リスト情報476は、ブロック数、先頭ブロックID及び終端ブロックIDを含む。ブロック数は、当該グループに対応する下位LRU管理リスト644に属するブロックの数である。先頭ブロックIDは、当該グループに属するブロックの中で、下位LRU管理管理リスト644の先頭に位置するブロックの一意な識別子である。終端ブロックIDは、当該グループに属するブロックの中で、下位LRU管理管理リスト644の終端に位置するブロックの一意な識別子である。
図8Dは、本発明の第1の実施の形態の共有DBデータ管理情報450に含まれるロック管理情報480の構成図である。
ロック管理情報480は、ページID482、ロック種別484、ロック取得トランザクションID486及びロック待ちリスト488を含む。
ページID482は、ロックの対象となるページの一意な識別子である。ロック種別484は、当該ページに設定するロックの種別である。具体的には、ロック種別484には、共有ロックを示す「共有」又は排他ロックを示す「排他」等が格納される。
ロック取得トランザクションID486は、当該ページに対してロックを取得しているトランザクションの一意な識別子である。
ロック待ちリスト488には、クエリID及びロック種別が格納される。当該クエリIDは、ロックの解放を待つクエリの一意な識別子である。ロック種別は、当該クエリが設定するロックの種別である。なお、当該クエリがロックを設定しない場合、ロック種別には「ロックなし」が格納される。また、複数のクエリがロックの解放を待っている場合、ロック待ちリスト488には、ロックの解放を待つクエリの数と同数のクエリID及びロック種別が格納される。
なお、本実施の形態では、ロックをページ単位で管理しているが、他の粒度で管理してもよい。
図8Eは、本発明の第1の実施の形態の共有DBデータ管理情報450に含まれるI/O待ち管理情報490の構成図である。
I/O待ち管理情報490は、ブロックID492及びI/O待ちリスト494を含む。
ブロックID492は、I/O中のブロックの一意な識別子である。
I/O待ちリスト494は、当該ブロックのI/Oの完了を待っている処理の識別子である。具体的には、I/O待ちリスト494には、クエリID又は先読み処理の識別子が格納される。なお、当該ブロックのI/Oの完了を待っている処理が複数ある場合、I/O待ちリスト494には、当該完了待ちの処理の数と同数の識別子が格納される。
図9Aは、本発明の第1の実施の形態の先読み処理情報500に含まれる総先読み数管理情報501の構成図である。
総先読み数管理情報501は、総先読みスレッド数502及び総先読みブロック数504を含む。
総先読みスレッド数502は、先読み処理で利用するスレッドの総数を管理する情報である。総先読みスレッド数502は、最大値及び割当値を含む。最大値は、先読み処理で利用可能なスレッドの総数の上限である。割当数は、先読み処理に現時点で割り当てられているスレッドの総数である。
総先読みブロック数504は、先読み処理によって読み出されたページを保持するブロックの数を管理する情報である。総読みブロック数504は、最大値及び割当値を含む。最大値は、先読み処理によって読み出されたページを保持するブロックの数の上限である。割当値は、先読み処理に現時点で割り当てられているブロックの総数である。
図9Bは、本発明の第1の実施の形態の先読み処理情報500に含まれる先読み管理情報510の構成図である。
先読み管理情報510は、クエリID512、先読みスレッド数514、先読みブロック数516、実行確認値518、I/O発行間隔管理情報522、データ処理先読み要求作成設定526及びページ数統計528を含む。
クエリID512は、先読み処理の対象となるクエリの一意な識別子である。
先読みスレッド数514は、最大スレッド数及び現利用スレッド数を含む。最大スレッド数は、当該クエリに対応する先読み処理に対して割り当てられたスレッドの総数である。現利用スレッド数は、当該クエリに対応する先読み処理で現在利用されているスレッドの総数である。
先読みブロック数516は、最大ブロック数及び先読み済ブロック数を含む。最大ブロック数は、当該クエリに対応する先読み処理に対して割当てられたブロックの総数である。先読み済ブロック数は、当該クエリに対応する先読み処理で実際に先読みされたページを保持するブロックの総数である。
実行確認値518は、当該クエリに対応する先読み処理の実行制御に利用する値である。なお、実行確認値518については後述する。
I/O発行間隔管理情報522は、優先度が低い処理における先読み処理向けのI/O発行間隔を一定値以上にする制御で利用する管理情報である。I/O発行間隔管理情報522は、設定下限値及びタイムスタンを含む。設定下限値は、設定されるI/O発行間隔の下限値である。タイムスタンプは、当該クエリに対応する先読み処理によって最新のI/Oが発行された時刻である。
データ処理先読み要求設定526は、データ処理部206が当該クエリを処理している最中に作成する先読み要求に関する情報である。データ処理先読み要求設定526は、作成要否情報、ステップID及び参照条件を含む。
作成要否情報は、データ処理部206が先読み要求を作成するか否かを示す。具体的には、データ処理部206が先読み要求を作成する場合、作成要否情報には「Yes」が格納される。また、データ処理部206が先読み要求を作成しない場合、作成要否情報には「No」が格納される。また、データ処理部206が先読み要求の作成を現在中断している場合、作成要否情報には「Stop」が格納される。
ステップIDは、データ処理部206が先読み要求を作成する処理ステップの一意な識別子である。なお、作成要否情報が「Yes」又は「Stop」の場合のみ、ステップID及び参照条件に値が格納される。
ページ数統計528は、当該クエリに対応する先読みの効果を判断するための統計値である。ページ数統計528は、処理利用数及び先読みヒット数を含む。処理利用数は、当該クエリに対応して出されたデータ取得要求の総数である。ヒット数は、当該クエリに対応して出されたデータ取得要求で要求されたデータが、先読みされたデータにヒットした回数である。
図9Cは、本発明の第1の実施の形態の先読み処理情報500に含まれる先読み要求管理情報540の構成図である。
先読み要求管理情報540は、クエリID541、ステップID543、実行確認値545、ページID549、ページ内オフセット542、参照条件544、リスト用ポインタ548及び待ちリスト管理情報552を含む。
先読み要求管理情報540は、先読みI/Oを発行する処理を実行するスレッドに対応するクエリの一意な識別子である。ステップID543は、当該クエリに対応する処理ステップの一意な識別子である。
実行確認値545は、当該クエリに対応する先読み処理の実行制御に利用する値である。
ページID549は、ページの一意な識別子である。当該ページに表のデータが記憶されている場合、ページ内データID549には値が格納される。ページ内データID549は、当該ページ内における先読み対象となるデータの一意な識別子である。
参照条件544には、当該先読み処理及びその結果取得した表データから更に実行される先読み処理における索引の既知の検索条件が格納される。
リスト用ポインタ548には、当該エントリの直前及び直後に位置するエントリへのポインタが格納される。
待ちリスト管理情報552には、処理実行待ち状態にある先頭エントリ及び終端エントリへのポインタが格納される。
なお、先読み要求管理情報540に新規エントリを追加する場合、当該エントリは、待ちリストの終端に接続される。
以下、本実施の形態の処理について説明する。
図10は、本発明の第1の実施の形態のDBMS60のクエリ処理のフローチャートである。
DBMS60は、APプログラム70からクエリを受信すると、クエリ処理を開始する(1101)。
クライアント処理部202は、クエリの受信時に、当該クエリの送信元のAPプログラム70のクライアントIDを把握する。また、クライアント処理部202は、クエリの受信と同時に、当該クエリの処理優先度をAPプログラム70から取得する。なお、処理優先度が取得できない場合、クライアント処理部202は、予め設定された処理優先度として扱う。なお、処理優先度は、クエリ中にヒントとして与えられてもよい。
次に、クライアント処理部202は、受信したクエリに基づいて、クエリプラン600を作成する(1102)。また、トランザクション管理情報430を参照することによって、取得したクライアントIDに対応するトランザクションID434が設定されているか否かを確認する。
そして、トランザクションID434が設定されていない場合、トランザクションIDを新規に設定する。
次に、クライアント処理部202は、クエリ管理情報410に新規エントリを作成する。その際、把握したクライアントID及び受信したクエリに付加されている通番を、クエリIDとする。次に、当該クエリIDを、新規エントリのクエリID412に格納する。次に、把握したクライアントIDとトランザクション管理情報430のクライアントID434とが一致するエントリを、トランザクション管理情報430から選択する。次に、選択したエントリから、トランザクションID434を抽出する。次に、抽出したトランザクションID434を、新規エントリのトランザクションID414に格納する。
次に、APプログラム70から取得した処理優先度を、新規エントリの処理優先度416に格納する。次に、新規エントリの処理実行ステータス418に「実行中」を格納する。次に、新規エントリの対象リソース422に無効値を格納する。
次に、クライアント処理部202は、クエリ処理実行要求を実行管理部204に送信する。クエリ処理実行要求は、新規エントリに格納したクエリIDを含む。
実行管理部204は、クエリ処理実行要求を受信すると、先読み管理情報設定処理を行う(1103)。なお、先読み管理情報設定処理は、図11で詳細を説明する。
また、実行管理部204は、先読み管理情報設定処理において先読み要求管理情報540に新規エントリを追加したとき、先読み処理管理ループ処理がスリープ状態にあるか否かを判定する。そして、スリープ状態にある場合、先読み処理管理ループ処理を起こす。なお、先読み処理管理ループ処理は、図15で詳細を説明する。
次に、実行管理部204は、受信したクエリ処理実行要求に含まれるクエリIDをデータ処理部206に通知し、当該クエリIDに対応するクエリの実行を要求する。
データ処理部206は、クエリの実行を要求されると、データ処理を実行する(1104)。なお、データ処理は、図12で詳細を説明する。
データ処理部206は、データ処理を完了すると、トランザクションの状態を確認する。具体的には、コミット及びロールバックを実行したか否かを確認する。
コミット及びロールバックを実行した場合、データ処理部206は、トランザクションが完了したと判断して以下の処理を実行する。
まず、データ処理部206は、クエリ管理情報410を参照することによって、トランザクションID414を把握する。次に、データ処理部206は、把握したトランザクションID414に対応するトランザクションが取得したロックの解放要求を共用DBデータ管理部210に送信する。なお、ロック解放要求には、データ処理部206が把握したトランザクションID414を含む。
共用DBデータ管理部210は、ロック解放要求を受信すると、ロックを解放する(1105)。具体的には、ロック解放要求に含まれるトランザクションIDとロック管理情報480のロック取得トランザクションID486とが一致するすべてのエントリ(対象エントリ)を、ロック管理情報480から把握する。
次に、それぞれの対象エントリのロック待ちリスト488から、先頭の値を抽出する。次に、抽出した値に含まれるクエリIDに対応するクエリを、次にロックを取得するクエリとする。そして、抽出した値に基いて、対象エントリのロック種別484及びロック取得トランザクションID486を設定する。
その後、次にロックを取得するクエリを再開させる。このとき、再開されたクエリに対応するエントリを、クエリ管理情報410から選択する。次に、選択したエントリの処理ステータス418に「実行中」を格納する。次にに、選択した対象リソース422に、無効値を格納する。
なお、対象エントリのロック待ちリスト488に値が格納されていない場合、当該エントリを、ロック管理情報480から削除する。
データ処理部206は、処理対象のクエリのクエリID及び処理結果をクライアント処理部202に送る。
すると、クライアント処理部202は、受け取った処理結果をAPプログラム70に送信する(1106)。
次に、クライアント処理部202は、処理が完了したクエリのクエリIDとクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から削除する。
また、クエリの処理完了によってトランザクションが完了した場合、当該APプログラム70のクライアントIDとトランザクション管理情報430のクライアントID432とが一致するエントリを、トランザクション管理情報430から選択する。次に、選択したエントリのトランザクションID434に、無効値を格納する。
次に、クライアント処理部202は、クエリの終了報告を実行管理部204に送信する。クエリの終了報告は、処理が終了したクエリのクエリIDを含む。
すると、実行管理部204は、受信した終了報告に含まれるクエリIDと先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から削除する(1107)。
そして、クエリ処理を終了する(1108)。
図11は、本発明の第1の実施の形態の実行管理部204の先読み管理情報設定処理のフローチャートである。
なお、先読み管理情報設定処理は、クエリ処理(図10)のステップ1103で実行される。
実行管理部204は、クエリ処理実行要求を受信すると、先読み管理情報設定処理を開始する(2101)。なお、クエリ処理実行要求は、新規エントリに格納したクエリIDを含む。
まず、先読み管理情報の初期化を行う(2102)。受信したクエリ処理実行要求に含まれるクエリIDとクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリから、処理優先度416を抽出することによって、指定されたクエリの処理優先度416を把握する。
次に、先読み管理情報510に、新規エントリを追加する。次に、受信したクエリ処理実行要求に含まれるクエリIDを、新規エントリのクエリID512に格納する。
次に、抽出した処理優先度416から定まる規定値を、先読みスレッド数514の最大スレッド数に格納する。次に、先読みスレッド数514の現利用スレッド数に、初期値を格納する。
次に、抽出した処理優先度416から定まる規定値を、先読みブロック数516の最大ブロック数に格納する。次に、先読みブロック数516の現利用ブロック数に、初期値を格納する。
次に、ランダム値を、新規エントリの実行確認値518に格納する。次に、抽出した処理優先度416から定まる規定値を、I/O発行間隔管理情報522の設定下限値に格納する。また、I/O発行間隔管理情報522のタイムスタンプには無効値を格納する。
次に、ページ数統計528に初期値を格納する。
そして、新規割当てに対応して、総先読みスレッド数502の割当値及び総先読みブロック数504の割当て値を更新する。このとき、更新した割当値が最大値を超えると、補正処理を実行する(2103)。
具体的には、クエリ管理情報410の処理優先度416を参照し、処理対象のクエリより処理優先度416が低いクエリのクエリID412を把握する。次に、把握したクエリID412と先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリの先読みスレッド数514の最大値及び先読みブロック数516の最大値から、所定の値を減ずる。
次に、総先読みスレッド数502の割当値及び総先読みブロック数504の割当値を更新する。そして、更新した割当値が最大値を下回るまでこの補正処理を繰り返す。
次に、クエリ管理情報410を参照することによって、クエリプランを把握する。次に、クエリプランの処理ステップから、索引参照処理を行う処理ステップを選択する。次に、選択した処理ステップから、索引の参照条件の値が全て既知の処理ステップを把握する(2104)。そして、このような処理ステップを一つでも把握した場合には、ステップ2105に進む。一方、一つも把握できない場合には、そのままステップ2107に進む。
次に、把握した処理ステップを起点として、連続して先読み処理が可能な処理ステップを把握し、グループ化する(2105)。
ここで、連続して先読み処理が可能な処理ステップとは、ここで把握した処理ステップ以降で取得する表、索引のデータ又はクエリプラン中の設定値に基いて、実行可能な処理ステップである。また、当該処理ステップは、索引参照処理、表データアクセス処理、フィルタ処理又はネストループ結合演算処理を実行する。
次に、先読み処理を起動するため、それぞれのグループごとに、先読み要求管理情報540にエントリを確保する。そして、確保したエントリに、値を設定する(2106)。
具体的には、受信したクエリ処理実行要求に含まれるクエリIDを、確保したエントリのクエリID541に格納する。次に、当該グループで一番最初に実施される処理ステップのステップIDを、確保したエントリのステップID543に格納する。次に、ステップ2102で先読み管理情報510の実行確認値518に格納した値を、確保したエントリの実行確認値545に格納する。
次に、当該グループで実行される索引参照処理の参照条件値に関する情報を、確保したエントリの参照条件544に格納する。なお、参照条件値が既知の場合には、既知の値を参照条件544に格納し、参照条件値が未知の場合には、どの表のどの属性から値を取得するかに関する情報を、参照条件544に格納する。
次に、ステップ2105で設定したグループに属さない索引参照処理を実行する処理ステップを把握する(2107)。なお、ステップ2104において索引の参照条件の値が全て既知の処理ステップを一つも把握できなかった場合には、すべての処理ステップがグループに属さないものとする。
そして、グループに属さない索引参照処理を実行する処理ステップが存在するか否かを判定する。そして、当該処理ステップが存在する場合には、ステップ2108に進む。一方、当該処理ステップが存在しない場合には、ステップ2121に進む。
次に、先読み管理情報510のデータ処理作成要求作成設定526の作成要否に「Yes」を格納する(2108)。
次に、ステップ2105と同様に、把握した処理ステップを起点として連続して先読み処理が可能な処理ステップを把握し、グループ化する(2109)。なお、ステップ2105で作成したグループに既に属する処理ステップは、ここでは先読み処理が不可能な処理ステップとして扱う。
次に、それぞれのグループごとに、一番最初に実行される処理ステップを特定する。次に、特定した処理ステップのステップIDを、先読み管理情報510のデータ処理先読み要求作成設定526のステップIDに格納する。
次に、ステップ2106と同様に、そのグループで実施される索引参照処理の参照条件値に関する情報を、先読み管理情報510のデータ処理先読み要求作成設定526の参照条件に格納する(2110)。なお、参照条件値が既知の場合には、既知の値をデータ処理先読み要求作成設定526の参照条件に格納し、参照条件値が未知の場合には、どの表のどの属性から値を取得するかに関する情報を、データ処理先読み要求作成設定526の参照条件に格納する。そして、先読み管理情報設定処理を終了する(2111)。
一方、グループに属さない索引参照処理を実行する処理ステップが存在しないと判定すると、先読み管理情報510のデータ処理作成要求作成設定526の作成要否に、「No」を格納する(2121)。そして、実行管理部204は、先読み管理情報設定処理を終了する(2111)。
図12は、本発明の第1の実施の形態のデータ処理部206のデータ処理のフローチャートである。
なお、データ処理は、クエリ処理(図10)のステップ1104で実行される。
まず、データ処理部206は、クエリの実行要求を受けると、データ処理を開始する(2401)。なお、クエリの実行要求には、実行を要求するクエリのクエリIDを含む。
次に、受信した実行要求に含まれるクエリIDとクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリから、クエリプラン424を抽出することによって、実行するクエリに対応するクエリプラン600を把握する(2402)。
次に、把握したクエリプラン600から、処理開始ステップID602を抽出する。これによって、最初に処理する処理ステップを確認する(2403)。なお、最初の処理では、その処理ステップで扱うデータの先頭部分を処理する。
次に、確認した処理ステップで処理するデータを取得する。なお、処理ステップで表又は索引のデータを直接利用する場合、データ取得要求を共用DBデータ管理部210に送信する。なお、データ取得要求は、ページID、ロック種別、クエリID及びトランザクションIDを含む。ページIDは、取得を要求するデータを有するページの一意な識別子である。ロック種別は、当該ページに設定するロックの種別である。クエリIDは、取得を要求するデータを必要とするクエリの一意な識別子である。トランザクションIDは、当該クエリが属するトランザクションの一意な識別子である。
共用DBデータ管理部210は、データ取得要求を受信すると、データ取得要求時処理を実行する(2404)。なお、データ取得要求時処理は、図14で詳細を説明する。
データ処理部206は、共用DBデータ管理部210からデータを取得する。次に、取得したデータに対して、処理ステップを実行する(2405)。
そして、データ利用完了報告を共用DBデータ管理部210に送信する。データ利用完了報告は、ページID及び更新情報を含む。ページIDは、ステップ2404で取得した表又は索引のデータを有するページの識別子である。更新情報は、当該ページIDに対応するページに対する更新の有無を示す。
共用DBデータ管理部210は、データ利用完了報告を受信すると、データ利用完了処理を実行する(2406)。
具体的には、受信したデータ利用完了報告に含まれるページIDとバッファブロック管理情報460のページID463とが一致するエントリを、バッファブロック管理情報460から選択する。次に、選択したエントリの利用数468を、減少させる。次に、ページの更新があった場合、選択したエントリの状態464に「Dirty」を格納する(2406)。
そして、データ処理部206は、次に実行する処理ステップを確認する(2407)。具体的には、事前に与えられるルールに従ったクエリプランの解釈及びステップ2405の処理結果によって、次に実行する処理ステップを判断する。
次に実行する処理ステップがない場合、すべての処理ステップを完了したと判定し、データ処理を終了する(2409)。
一方、後続のデータに対して同一の処理ステップを実行する場合、ステップ2404に戻る。
また、後続のデータに対して異なる処理ステップを実行する場合、先読み要求設定処理を実行する(2408)。なお、先読み要求設定処理は、図13で詳細を説明する。そして、ステップ2404に戻る。
図13は、本発明の第1の実施の形態のデータ処理部206の先読み要求設定処理のフローチャートである。
なお、先読み要求設定処理は、データ処理(図12)のステップ2408で実行される。
まず、データ処理部206は、実行中のクエリのクエリIDとクエリプラン600中で次に実行する処理ステップのステップIDが与えられ、先読み要求設定処理を開始する(2201)。
すると、与えられたクエリIDと先読み管理情報510のクエリID512とが一致するエントリが、先読み管理情報510に存在するか否かを判定する。
当該エントリが先読み管理情報510に存在すると、当該エントリからデータ処理先読み要求作成設定526を抽出する。次に、抽出したデータ処理先読み要求作成設定526の作成要否に「Yes」が格納されているか否かを判定する。そして、「Yes」が格納されていると、処理開始時に与えられたステップIDが、抽出したデータ処理先読み要求作成設定526のステップIDに格納されているか否かを判定する。これによって、先読み要求の設定が必要であるか否かを判定する(2202)。
抽出したデータ処理先読み要求作成設定526の作成要否に「Yes」が格納されていない場合、又は、処理開始時に与えられたステップIDがデータ処理先読み要求作成設定526に格納されていない場合、先読み要求の設定が不要であると判定し、そのまま先読み要求設定処理を終了する(2207)。
処理開始時に与えられたステップIDがデータ処理先読み要求作成設定526に格納されている場合、先読み要求の設定が必要であると判定する。
そこで、先読み要求管理情報540に新規エントリを追加する。次に、処理開始時に与えられたクエリIDを、新規エントリのクエリID541に格納する。次に、処理開始時に与えられたステップIDを、新規エントリのステップID543に格納する。
次に、処理開始時に与えられたクエリIDと先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリから、実行確認値518を抽出する。次に抽出した実行確認値518を、先読み要求540の実行確認値545に格納する(2203)。
次に、処理開始時に与えられたクエリIDと先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリから、データ処理先読み要求作成設定526の参照条件を抽出する。次に、抽出した参照条件を、新規エントリの参照条件544を格納する。格納した参照条件544の中で値が未知の部分に関し、これまでの処理で対応する表の属性の値が既知になったものに関してその値を設定する。これによって、参照条件544を設定する(2204)。
次に、処理開始時に与えられたクエリIDとクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に選択したエントリから、クエリプラン424を抽出することによって、クエリプラン600を特定する。次に、処理開始時に与えられたステップIDと特定したクエリプラン600のステップID606とが一致するエントリを、クエリプラン600から選択する。
次に、選択したエントリの処理詳細616から、索引参照処理が参照する索引のオブジェクトIDを抽出する。次に、抽出したオブジェクトIDとオブジェクト管理情報330のオブジェクトID332とが一致するエントリを、オブジェクト管理情報330から選択する。次に、選択したエントリから、索引ルートページID342を抽出する。そして、抽出した索引ルートページID342を、新規エントリのページID549に格納する(2205)。なお、索引ルートページID342に複数のページIDが含まれる場合、当該ページIDに対応する数の新規エントリを、先読み要求管理情報540に作成する。
次に、先読み処理管理ループ処理(図15)がスリープ状態にある場図合、先読み処理管理ループ処理を起こす(2206)。
そして、データ処理部206は、先読み要求設定処理処理を終了する(2207)。
図14は、本発明の第1の実施の形態の共有DBデータ管理部210のデータ取得要求時処理のフローチャートである。
共有DBデータ管理部210は、データ処理(図14)のステップ2404において、データ処理部206からデータ取得要求を受けると、本処理を開始する(1201)。なお、データ取得要求は、ページID、ロック種別、クエリID及びトランザクションIDを含む。ページIDは、必要とされるデータを有するページの一意な識別子である。ロック種別は、当該ページに対して設定すべきロックの種別である。なお、ロックの設定が不要な場合、データ取得要求は、ロック種別を含まない。クエリIDは、データを必要とするクエリの一意な識別子である。トランザクションIDは、当該クエリが属するトランザクションの一意な識別子である。
共有DBデータ管理部210は、受け取ったデータ取得要求に含まれるページIDに対応するページに、当該データ取得要求に含まれるロック種別のロックを設定する(1202)。なお、データ取得要求にロック種別が含まれない場合、本ステップは実行されない。
具体的には、受け取ったデータ取得要求に含まれるページIDとロック管理情報480のページID482とが一致するエントリを、ロック管理情報480から選択する。次に、選択したエントリを対象エントリとして把握する。
なお、対象エントリを把握できない場合には、当該ページに対してロックは設定されていない。そこで、ロック管理情報480に新規エントリを作成する。次に、データ取得要求に含まれるページIDを、新規エントリのページID482に格納する。次に、データ取得要求に含まれるロック種別を、新規エントリのロック種別484に格納する。次に、データ取得要求に含まれるトランザクションIDを、新規エントリのロック取得トランザクションID486に格納する。次に、ロック待ちリスト488に初期値を格納する。
一方、対象エントリを把握できた場合には、対象エントリのロック種別484及びロック取得トランザクションID486を参照することによって、当該クエリに関する処理を続行可能であるか否かを判定する。
続行可能であると、処理を続行する。このとき、必要であれば、ロック種別484の更新及びロック取得トランザクションID486への値の追加を行う。
一方、続行不可能であると、データ取得要求に含まれるページID及びロック種別を、対象エントリのロック待ちリスト488の終端に格納する。そして、ロックを取得するまで当該クエリを中断する。
なお、クエリの中断中には、クエリ管理情報410の処理ステータス418に「ロック設定待ち」を格納する。更に、ロックを取得するページのページIDを、クエリ管理情報410の対象リソース422に格納する。
次に、共有DBデータ管理部210は、受け取ったデータ取得要求に含まれるページIDとバッファブロック管理情報460のページID463とが一致するエントリを、バッファブロック管理情報460から選択する。そして、選択したエントリを、対象ブロックエントリとしてとして把握する。次に、対象ブロックエントリが存在するかどうかを判定する。
対象ブロックエントリが存在しない場合、ステップ1211に進む。
一方、対象ブロックエントリが存在する場合、対象ブロックエントリの状態464が「Reading」であるかどうかを判定する(1203)。
対象ブロックエントリの状態464が「Reading」でないと、そのままステップ1205に進む。一方、対象ブロックエントリの状態464が「Reading」であると、ステップ1204に進む。
まず、対象ブロックエントリのブロックID462とI/O待ち管理情報490のブロックID492とが一致するエントリを、I/O待ち管理情報490から選択する。次に、受け取ったデータ取得要求に含まれるクエリIDを、選択したエントリI/O待ちリスト494に格納する。そして、I/O処理が完了するまで当該クエリを中断する(1204)。
次に、対象ブロックエントリから、先読み対応クエリID469を把握する。次に、把握した先読みクエリID469に、値が格納されているか否かを判定する。
先読みクエリID469に値が格納されていると、対象ブロック内のデータは先読みされたものであるので、以下の処理を実施する。
まず、把握した先読み対応クエリID469と先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。そして、選択するエントリが存在すると、選択したエントリの先読みブロック数516を減ずる(1205)。
次に、対応ブロックエントリの先読み対応クエリID469に、無効値を格納する。また、先読み処理管理ループ処理(図15)がスリープ状態にある場合、先読み処理管理ループ処理を起こす。
次に、対象ブロックエントリの管理情報を更新する(1206)。具体的には、対象ブロックエントリから、リンク情報466の管理リストを抽出することによって、当該ブロックが属する管理リストを把握する。次に、把握した管理リストが、上位LRU管理リスト又は下位LRU管理リストのいずれであるかを判定する。
把握した管理リストが上位LRU管理リストであると、当該上位LRU管理リストのMRU端に対象ブロックエントリを挿入する。
一方、把握した管理リストが下位LRU管理リストであると、上記と同様の対象ブロックエントリの挿入とともに、挿入先の上位LRU管理リストのLRU端(終端)に存在するエントリを、当該管理リストのMRU端に繋ぎ直す。なお、バッファブロック管理情報460及びバッファグループ管理情報470を参照・更新することによって、この処理を実現する。次に、対象ブロックエントリの利用数468を増加させる。
次に、先読み管理情報510のページ数統計528を更新する(1207)。具体的には、受け取ったデータ取得要求に含まれるクエリIDと管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリのページ数統計528の処理利用数を増加させる。また、ステップ1205で「先読みされた」データであると判定した場合には、選択したエントリのページ数統計528の先読みヒット数を増加させる。
次に、対象ブロックエントリのブロックID462、バッファ領域情報452及びバッファブロックサイズ454に基づいて、対象データを保持するブロックの先頭アドレスを計算する。そして、計算した先頭アドレスをデータ処理部206に送信する。そして、データ取得要求時処理を終了する(1208)。
一方、ステップ1203で対象ブロックエントリが存在しないと判定すると、受け取ったデータ取得要求に含まれるページIDをオブジェクト管理情報330の対応ページID338に含むエントリを、オブジェクト管理情報330から選択する。次に、選択したエントリから、グループID334を抽出する。
次に、抽出したグループID334とバッファグループ管理情報470のグループID472とが一致するエントリを、バッファグループ管理情報470から選択する。次に、選択したエントリから、下位LRU管理リスト情報476を抽出する。次に、抽出した下位LRU管理リスト情報476を参照することによって、下位LRU管理リストのLRU端に存在するエントリによって管理されるブロックを把握する。次に、把握したブロックを置換対象となるブロック(置換ブロック)とする(1211)。そして、置換ブロックに、対象データを保持させる。
次に、置換ブロックのブロックIDとバッファブロック管理情報460のブロックID462とが一致するエントリを、バッファブロック管理情報460から選択する。次に、選択したエントリをを対象ブロックエントリとする。
次に、対象ブロックエントリの利用数468が「0」であるか否かを判定する。対象ブロックエントリの利用数468が「0」でない場合、当該利用数468が「0」になるまで待機する。そして、対象ブロックエントリを、下位LRU管理リストから外す。
次に、対象ブロックエントリの状態464が「Dirty」であるか否かを判定する。対象ブロックエントリの状態464が「Dirty」であると、置換ブロックに記憶されているデータをファイルに書き込む(1212)。なお、ファイル上での記憶位置は、ページID及びファイル管理情報350から把握できる記憶位置に、データを書き込む。
なお、ファイルへの書き込み処理を開始すると、I/O待ち管理情報490に新規エントリを追加する。次に、対象ブロックエントリのブロックID462を、新規エントリのブロックID492に格納する。次に、受け取ったデータ取得要求に含まれるクエリIDを、新規エントリのI/O待ちリスト494に追加する。そして、ファイルへの書き込み処理を終了すると、I/O待ち管理情報490に追加した新規エントリを削除する。
次に、共有DBデータ管理部210は、ステップ1205及びステップ1206と同一の処理を実行する。
次に、受け取ったデータ取得要求に含まれるページIDを、対象ブロックエントリのページID463に格納する。次に、対象ブロックエントリの先読み対応クエリID469に無効値を格納する。
次に、対象ブロックエントリの状態464に「Reading」を格納する。
次に、I/O待ち管理情報490に新規エントリを追加する。次に、対象ブロックエントリのブロックID462を、新規エントリのブロックID492に格納する。次に、受け取ったデータ取得要求に含まれるクエリIDを、新規エントリのI/O待ちリスト494に追加する。
そして、受け取ったデータ取得要求に含まれるページIDに対応するページのデータをファイルから読み出す(1215)。なお、ファイル上の記憶位置はページID及びファイル管理情報350から把握できる記憶位置から、データを読み出す。
読み出しを完了すると、I/O待ち管理情報490の対応エントリを参照する。もし、参照したエントリのI/O待ちリスト494にデータ取得要求に含まれるクエリID以外にも値が格納されている場合、クエリの処理再開を指示する。
そして、I/O待ち管理情報490から対応エントリを削除する。そして、ステップ1207に進む。
図15は、本発明の第1の実施の形態の先読み部208の先読み処理管理ループ処理のフローチャートである。
DBMS60が起動した際の初期化処理等において、先読み部208は、本処理を開始する(1401)。また、DBMS60の実行中にも、先読み部208は、本処理を独立して実行する。
先読み部208は、一定時間処理を中断(スリープ)する。一定時間は、例えば、十ミリ秒程度である。なお、イベント発生時には、先読み処理管理ループ処理が起こされる。イベント発生は、例えば、先読み要求管理情報540に新たなエントリが追加された場合、先読み実処理スレッドが終了した場合又は先読みしたデータが利用された場合等である。
次に、先読み要求管理情報540の待ちリスト管理情報552を参照することによって、先読み要求管理情報540の待ちリストで先頭に位置するエントリを把握する。把握したエントリを、処理対象エントリとして設定する(1403)。
次に、処理対象エントリを設定できたか否かを判定する(1404)。処理対象エントリを設定できない場合には、ステップ1402に戻る。
一方、処理対象エントリを設定できた場合、当該処理対象エントリの次に位置するエントリを把握する(1405)。
次に、処理対象エントリから、クエリID541を抽出する。次に、抽出したクエリID541と先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリを処理管理エントリとして把握する。
処理対象エントリの実行確認値545と処理管理エントリ中の実行確認値518とが一致するかどうかを判定する(1406)。実行確認値が一致しない場合、ステップ1421に進む。
一方、実行確認値が一致すると、処理管理エントリの先読みスレッド数514を参照する。そして、参照した先読みスレッド数514の現利用スレッド数が、先読みスレッド数514の最大スレッド数未満であるか否かを判定する(1407)。現利用スレッド数が最大スレッド数以上であると、そのままステップ1411に進む。
一方、現利用スレッド数が最大スレッド数未満であると、処理管理エントリの先読みブロック数516を参照する。そして、参照した先読みブロック数516の先読み済みブロック数が、先読みブロック数516の最大ブロック数未満であるか否かを判定する(1408)。先読み済みブロック数が最大ブロック数以上であると、そのままステップ1411に進む。
一方、先読み済みブロック数が最大ブロック数未満であると、処理管理エントリの先読みスレッド数514の現利用を増加させる。そして、処理対象エントリを指定して先読み実処理スレッドを起動する(1409)。なお、先読み実処理スレッドは、図16で詳細を説明する。また、先読み部208は、複数の先読み実処理スレッドを同時に実行できる。
次に、処理対象エントリを、先読み要求管理情報540の待ちリスト管理情報552から外す(1410)。
次に、ステップ1405で把握したエントリを、処理対象エントリとして設定する(1411)。そして、ステップ1404に戻る。
一方、ステップ1406において実行確認値が一致しない場合、処理対象エントリを先読み要求管理情報540の待ちリスト管理情報552から外す。次に、処理対象エントリを、先読み要求管理情報540から削除する(1421)。そして、ステップ1411に進む。
図16は、本発明の第1の実施の形態の先読み部208の先読み実処理スレッドのフローチャートである。
先読み実処理スレッドは、先読み処理管理ループ処理(図15)のステップ1409で実行される。
先読み部208は、先読み処理管理ループ処理を開始する際に(2301)、実行する先読み処理に関する情報を含む処理エントリ(先読み要求管理情報540のエントリ)を指定されている。
まず、先読み部208は、処理エントリのページID549を含むデータ参照要求を、共有DBデータ管理部210に送信する。
共有DBデータ管理部210は、データ参照要求を受信すると、データ参照要求時処理を実行する(2302)。なお、データ参照要求時処理は、図17で詳細を後述する。
先読み部208は、共有DBデータ管理部210のデータ参照要求時処理の完了を待つ。そして、処理エントリのクエリID541と先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリを、管理エントリとして把握する。
次に、処理エントリの実行確認値545と管理エントリの実行確認値518とが一致するか否かを判定する(2303)。実行確認値が一致しない場合、ステップ2321に進む。
一方、実行確認値が一致した場合、指定ページに記憶されているデータが索引であるか否かを判定する。データが索引でないと、ステップ2311に進む。
一方、データが索引であると、処理エントリから、クエリID541及びステップID543を抽出する。次に、抽出したクエリID541とクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリのクエリプラン424を参照することによって、当該索引の参照条件を把握する(2305)。
次に、把握した参照条件に表データへのポインタを有するか否かを判定する。これによって、指定ページが索引のリーフページであるか否かを判定する(2306)。
指定ページが索引のリーフページでないと、ステップ2308に進む。
一方、指定ページが索引のリーフページであると、参照条件に対応する表ページへの先読み要求を作成する(2307)。具体的には、指定ページを解析する。これによって、ステップ2305で把握した索引の参照条件に対応する表データへのポインタを把握する。
次に、当該データを記憶しているページを取得するために、先読み要求管理情報540に新規エントリを追加する。次に、処理エントリのクエリID512を、新規エントリのクエリID541に格納する。次に、処理エントリの実行確認値518を、新規エントリの実行確認値545に格納する。次に、解析によって取得した表データへのポインタから把握される値を、新規エントリのページID549及びページ内データID542に格納する。
次に、処理エントリから、データ処理先読み要求作成処理526のステップIDを抽出する。次に、クエリプランを参照することによって、抽出したステップIDの処理ステップに対応して実施される表データの取得処理に対応する処理ステップのステップIDを特定する。次に、特定したステップIDを、新規エントリのステップID543に格納する。
次に、処理エントリから参照要求544を抽出する。次に、処理エントリからステップID543を抽出する。次に、抽出した参照条件544から、抽出したステップID543に対応する処理ステップにおける検索条件を除いた値を求める。そして、求めた値を、新規エントリの参照要求544に格納する。
なお、対応するデータが複数ある場合には、それぞれのデータに対応する新規エントリを先読み要求管理情報540に追加する。
次に、データ参照要求で指定されたデータの参照完了を、共有DBデータ管理部210に報告する。
次に、処理エントリを先読み管理情報510から削除する(2321)。そして、先読み実処理スレッドを終了する(2322)。
一方、ステップ2306において指定ページが索引のリーフページでないと、参照条件に対応する下位の索引ページの先読み要求を作成する(2308)。具体的には、指定ページを解析する。
次に、ステップ2305で把握した参照条件に対応し、且つ、リーフ側に存在する索引データを保持するページへのポインタを把握する。次に、当該索引データを保持するページを取得するために、先読み要求管理情報540に新規エントリを追加する。
次に、処理エントリのクエリID512を、新規エントリのクエリID541に格納する。次に、処理エントリのデータ処理先読み要求作成設定526のステップIDを、新規エントリのステップID543に格納する。次に、処理エントリの実行確認値518を、新規エントリの実行確認値545に格納する。次に、処理エントリのデータ処理先読み要求作成設定526の参照条件を、新規エントリの参照条件544に格納する。
次に、解析によって把握した索引データを保持するページのページIDを、新規エントリのページID549に設定する。なお、対応する索引データを保持するページが複数ある場合には、それぞれに対応する新規エントリを先読み要求管理情報540に追加する。。そして、ステップ2321に進む。
一方、ステップ2304において指定ページに記憶されているデータが索引でないと、処理エントリの参照条件544に値が格納されているか否かを判定する。
参照条件に値が格納されていない場合、そのままステップ2321に進む。
一方、参照条件に値が格納されている場合、ステップ2302で取得したページを解析することによって、処理エントリのページ内データID542に対応するデータを把握する。
次に、把握したデータに基づいて、処理エントリの参照条件544に設定する対応値を求める。そして、求めた対応値を、処理エントリの参照条件544に格納する(2312)。
次に、処理エントリの参照条件544に対応する処理の次に実行する索引参照処理における検索条件を把握する。そして、把握した検索条件が揃っているか否かを判定する。
検索条件が揃っていなければ、そのままステップ2321に進む。
一方、索引ステップ2314が揃っていれば、次の索引参照処理における索引ルートページのデータを取得するため、先読み要求管理情報540へ新規エントリを追加する(2314)。
次に、処理エントリのクエリID512を、新規エントリのクエリID541に格納する。次に、処理エントリの実行確認値518を、新規エントリの実行確認値545に格納する。次に、処理エントリのデータ処理先読み要求作成設定526の参照条件を、新規エントリの参照条件544に格納する。
次に、処理エントリのクエリID512とクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリから、クエリプラン424を抽出する。次に、抽出したクエリプラン424及び処理エントリのデータ処理先読み要求作成設定526のステップIDを参照することによって、次の索引参照処理で参照する索引のオブジェクトID及び当該処理ステップに対応するステップIDを把握する。
次に、把握したステップIDを、新規エントリのステップID543に格納する。次に、把握したオブジェクトIDとオブジェクト管理情報330のオブジェクトID330とが一致するエントリを、オブジェクト管理情報330から選択する。次に、選択したエントリから、索引ルートページID342を抽出する。次に、抽出した索引ルートページID342を、新規エントリのページID549に格納する。そして、ステップ2321に進む。
図17は、本発明の第1の実施の形態の共有DBデータ管理部210のデータ参照要求時処理のフローチャートである。
データ参照要求時処理は、先読み実処理スレッド(図16)のステップ2302で実行される。
共有DBデータ管理部210は、データ参照要求を先読み部208から受けると、データ参照要求時処理を開始する(1301)。なお、データ参照要求は、必要とされるデータを有するページのページID及びデータを必要とする先読み処理に対応するクエリのクエリIDを含む。
共有DBデータ管理部210は、受け取ったデータ参照要求に含まれるページIDとバッファブロック管理情報460のページID462とが一致するエントリを、バッファブロック管理情報460から選択する。次に、選択したエントリを対象ブロックエントリとして把握する。次に、把握する対象ブロックエントリが存在するか否かを判定する。
対象ブロックエントリが存在しない場合、ステップ1211に進む。
一方、対象ブロックエントリが存在する場合、対象ブロックエントリの状態464が「Reading」であるかどうかを判定する(1303)。
対象ブロックエントリの状態464が「Reading」でないと、そのままステップ1305に進む。一方、対象ブロックエントリの状態464が「Reading」であると、ステップ1304に進む。
まず、対象ブロックエントリのブロックID462とI/O待ち管理情報490のブロックID492とが一致するエントリを、I/O待ち管理情報490から選択する。次に、受け取ったデータ参照要求に含まれるクエリIDを、選択したエントリI/O待ちリスト494に格納する。そして、I/O処理が完了するまで当該クエリを中断する(1304)。
次に、対象ブロックエントリのリンク情報466の管理リストを抽出することによって、対象ブロックエントリが属している管理リストを把握する。そして、対象ブロックが上位LRU管理リスト又は下位LRU管理リストのいずれに属するかを判定する(1305)。
対象ブロックが上位LRU管理リストに属すると、対象ブロックエントリの利用数468を増加させる(1322)。そして、データ参照要求時処理を終了する(1309)。
一方、対象ブロックが下位LRU管理リストに属すると、ステップ1205を実行する。なお、ステップ1205は、データ取得要求時処理(図14)で説明した処理と同一なので、説明を省略する。
次に、対象ブロックエントリからリンク情報466の管理リストを抽出することによって、対象ブロックエントリが現在属している下位LRU管理リストを把握する。次に、把握した下位LRU管理リストのMRU端に、対象ブロックエントリを繋ぎ直す。なお、バッファブロック管理情報460及びバッファグループ管理情報470を参照・更新することによって、この処理を実行する。次に、対応ブロックエントリの利用数468を増加させる(1307)。
次に、受け取ったデータ参照要求に含まれるクエリIDと先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリの先読みブロック数516の先読み済みブロック数を増加させる。次に、受け取ったデータ参照要求に含まれるクエリIDを、対象ブロックエントリの先読み対応クエリID469に格納する(1308)。
次に、対象ブロックエントリのブロックID462、バッファ領域情報452及びバッファブロックサイズ454に基づいて、対象データを保持するブロックの先頭アドレスを求める。そして、求めたその先頭アドレスを先読み部208に送信する。そして、データ参照要求時処理を終了する(1309)。
一方、ステップ1303において対象ブロックエントリが存在しないと判定すると、ステップ1211、ステップ1212、ステップ1205及びステップ1314を実行する。なお、ステップ1211、ステップ1212及びステップ1205は、データ取得要求時処理(図14)で説明した処理と同一なので、説明を省略する。
次に、バッファブロック管理情報を更新する(1314)。具体的には、受け取ったデータ参照要求に含まれるページIDを、対象ブロックエントリのページID463に格納する。次に、対象ブロックエントリの先読み対応クエリID469に無効値を格納する。
次に、I/O発行間隔を調整する(1315)。具体的には、受け取ったデータ参照要求に含まれるクエリIDと先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリのI/O発行間隔管理情報522のタイムスタンプを抽出する。次に、抽出したタイムスタンプが有効である場合、抽出したタイムスタンプと現在の時刻との差分を求める。次に、求めた差分が、選択したエントリのI/O発行間隔管理情報522の設定下限値より小さいか否かを判定する。
差分が設定下限値より小さいと、当該差分が設定下限値以上になるまで処理を中断する。そして、差分が設定下限値以上になると、選択したエントリのI/O発行間隔管理情報522のタイムスタンプに現在の時刻を格納する。
次に、ステップ1215と同様に、データを読み出す(1316)。なお、ステップ1215は、データ取得要求時処理(図14)で説明した処理と同一なので、説明を省略する。そして、ステップ1308に進む。
図18は、本発明の第1の実施の形態の実行管理部204の実行管理部ループ処理のフローチャートである。
DBMS60が起動した際の初期化処理等において、実行管理部204は、本処理を開始する(1501)。また、DBMS60の実行中にも、実行管理部204は、本処理を独立して実行する。
まず、実行管理部204は、DBサーバ42のCPU利用率を把握する(1502)。具体的には、CPU利用率はOS52が計測したCPU利用率を取得する。
次に、把握したCPU利用率が過負荷閾値以上である状態が一定時間継続しているかどうかを判定する(1503)。なお、当該過負荷閾値は、ユーザ等によって事前に与えられる。
CPU利用率が過負荷閾値以上である状態が一定時間継続していると、ステップ1521に進む。
一方、CPU利用率が過負荷閾値以上である状態が一定時間継続していない場合、把握したCPU利用率が低負荷閾値以下である状態が一定時間継続しているかどうかを判定する(1504)。なお、当該低負荷閾値は、ユーザ等によって事前に与えられる。
CPU利用率が低負荷閾値以下である状態が一定時間継続していない場合、そのままステップ1507に進む。
一方、CPU利用率が低負荷閾値以下である状態が一定時間継続していると、現在中断中の先読み処理を再開する(1506)。
具体的には、先読み管理情報510のデータ処理先読み要求作成設定526の作成要否情報が「Stop」のエントリを選択する。次に、選択したエントリのデータ処理先読み要求作成設定526の作成要否情報を「Yes」に変更する。なお、クエリ管理情報410の処理優先度416に基づいて、当該処理の対象を制御してもよい。
次に、ロック管理情報480のロック待ちリスト488に、閾値以上の個数のクエリIDが格納されているエントリを選択する。そして、選択したエントリを、待ち数過多ページに対応するエントリとして把握する。ここで、待ち数過多ページとは、ロックの解放を待つクエリが多数存在するページである。
そして、待ち数過多ページが存在するか否かを判定する(1507)。
待ち数過多ページが存在しない場合、そのままステップ1509に進む。
一方、待ち数過多ページが存在する場合、待ち過多数ページに対応してクエリの先読みデータ量を増加させる(1508)。当該待ち数過多ページに対応するエントリのロック取得トランザクションID486を抽出する。次に、抽出したトランザクションID486とクエリ管理情報410のトランザクションID414とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリの処理ステータス418に「ロック設定待ち」が格納されているか否かを判定する。
処理ステータス418に「ロック設定待ち」が格納されていない場合には、選択したエントリのクエリID412を把握する。
一方、処理ステータス418に「ロック設定待ち」が格納されている場合には、選択したエントリから対象リソース422を抽出する。次に、抽出した対象リソース422とロック管理情報480のページID482とが一致するエントリを、ロック管理情報480から選択する。次に、選択したエントリから、ロック取得トランザクションID486を抽出する。次に、抽出したロック取得トランザクションID486とクエリ管理情報410のトランザクションID414とが一致するエントリを、クエリ管理情報410から再度選択する。次に、選択したエントリの処理ステータス418に「ロック設定待ち」が格納されているか否かを判定する。
処理ステータス418に「ロック設定待ち」が格納されていない場合になるまで、当該処理を繰り返す。そして、処理ステータス418に「ロック設定待ち」が格納されていない場合になると、当該エントリのクエリID412を把握する。
次に、把握したクエリID412と先読み管理情報510のクエリID512とが一致するエントリを、先読み管理情報510から選択する。次に、選択したエントリの先読みブロック数516の最大ブロック数を一定割合増加させる。
次に、最大ブロック数の増加に合わせて、総先読み数管理情報501の総先読みブロック数504の割当値を更新する。なお、総先読みブロック数504の割当値が総先読みブロック数504の最大値を超える場合には、本ステップを実行しない。
次に、総先読みブロック数504中の割当値と総先読みブロック数504の最大値との比を求める。次に、求めた比が閾値以下であるか否かを判定する。
そして、比が閾値以下であると、先読み管理情報510の先読みブロック数516の最大ブロック数を見直す(1509)。
具体的には、先読み管理情報510の各エントリから、クエリID512を抽出する。次に、抽出したクエリIDとクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリから、処理優先度416を抽出する。次に、抽出した処理優先度416によって規定されている割当ブロック数(規定割当ブロック数)を把握する。
次に、先読み管理情報510の先読みブロック数516の割当て済みブロック数が規定割当ブロック数より小さい場合、当該先読みブロック数516の割当て済みブロック数を規定割当ブロック数に変更する。
次に、ステップ1508と同様に、総先読みブロック数504の割当値を更新する。
なお、総先読みブロック数504の割当値が、総先読みブロック数504の最大値を超える場合には、本ステップを実行しない。
そして、一定時間スリープし(1510)、ステップ1502に戻る。
一方、ステップ1503においてCPU利用率が過負荷閾値以上である状態が一定時間継続していると、処理優先度が低い処理の先読み処理を停止する(1521)。
具体的には、先読み管理情報510中の各エントリから、クエリID512を抽出する。次に、抽出したクエリID512とクエリ管理情報410のクエリID412とが一致するエントリを、クエリ管理情報410から選択する。次に、選択したエントリから、処理優先度416を抽出する。
次に、抽出した処理優先度416が事前に定められた優先度以下であるか否かを判定する。なお、CPU利用率に応じて、事前に定められた優先度を変化させてもよい。
抽出した処理優先度416が事前に定められた優先度以下であると、以下の処理を実施する。
選択したエントリの実行確認値518に、新たなランダム値を格納する。次に、データ処理先読み要求作成設定528の作成要否情報に「Yes」が格納されているかどうかを確認する。作成要否情報に「Yes」が格納されている場合、当該作成要否情報を「Stop」に変更する。この確認処理を、すべての選択したエントリに対して行い、ステップ1507に進む。
以上のように、本実施の形態では、計算機等の動作状態に応じて先読み処理を外部から制御する処理を設ける。これによって、先読み処理によるDBMS主処理への影響を軽減できるので、先読み動作を好適化できる。
(第2の実施の形態)
本発明の第2の実施の形態では、計算機システムにDBサーバ42が複数存在する。そして、それぞれのDBサーバ42で動作するDBMS60が協調することによって、一つの並列DBMSとして動作する。
図19は、本発明の第2の実施の形態の計算機システムのブロック図である。
第2の実施の形態の計算機システムは、複数のDBサーバを備える。第2の実施の形態の計算機システムのそれ以外の構成は、第1の実施の形態の計算機システム(図1)と同一である。よって、同一の構成には同一の番号を付し、説明を省略する。
APプログラム70は、事前に定められたDBサーバ42上で動作するDBMS60にクエリを発行する。なお、APプログラム70は、任意のDBサーバ42上で動作してもよい。
異なるDBサーバ42で動作するDBMS60は、それぞれ異なるデータを管理する「Shared Nothing」型の並列DBMSである。そのため、スキーマ300のファイル管理情報350の構成が異なる。
図20は、本発明の第2の実施の形態のスキーマ300に含まれるファイル管理情報350の構成図である。
ファイル管理情報350は、ファイルID352、ページサイズ354、ページ数356、ファイルパス358及びサーバID362を含む。
なお、ファイルID352、ページサイズ354、ページ数356及びファイルパス358は、第1の実施の形態のファイル管理情報(図5D)の構成と同一である。よって、説明を省略する。
サーバID362は、当該ファイルに記憶されているデータを管理するDBMS60が動作しているDBサーバ42の識別子である。
それぞれのDBサーバ42で動作しているDBMS60は、ネットワーク24を経由して相互に通信可能である。よって、複数のDBMS60は、同じクエリプラン600のコピーをそれぞれ保持する。そして、一つのクエリに対応する処理を分担して処理する。また、複数のDBMS60は、同一のスキーマ300及び同一の処理管理情報400を保持する。その一方で、各DBMS60は、それぞれ独立に共有バッファ64を管理する。
まず、APプログラム70は、一つのDBMS60にクエリを送信する。クエリを受信したDBMS60は、APプログラム70との通信処理及びクエリプランの作成処理を行う。そして、すべてのDBMSは、APプログラム70との通信処理及びクエリプランの作成処理以外の処理を、分担して実行する。
本実施の形態では、ファイルごとにデータを管理するDBMS60が決定される。また、ページIDにはファイルに関する識別子を含む。そのため、ページIDに基づいて、処理すべきDBMS60が稼動するDBサーバ42を把握できる。
データ処理部206及び先読み部208は、利用するデータを含むページのページIDとファイル管理情報350に基づいて、当該ページに関する処理を実行するDBMS60が稼動しているDBサーバ42を把握する。そして、把握したDBサーバ42に処理の実行を依頼する。
例えば、先読み要求管理情報540に新規エントリを追加する場合、追加する新規エントリのページID549に値を格納する必要がある。このとき、ページIDに基づいて把握したDBサーバ42に対して、先読み要求管理情報540の新規エントリの追加を依頼する。
なお、集計処理等のように、一台のDBサーバ42で実行すべき処理もある。これらの処理に関しては、処理を実行するDBサーバ42のサーバIDをクエリプラン600の処理詳細616に格納する。これによって、一台のDBサーバ42で実行すべき処理を適切に行うことができる
(第3の実施の形態)
本発明の第3の実施の形態では、第2の実施の形態と同様に、計算機システム内にDBサーバ42が複数存在する。そして、それぞれのDBサーバ42で動作するDBMS60が協調することによって、一つの並列DBMSとして動作する。
ただし、第3の実施の形態では、第2の実施の形態と異なり、異なるDBサーバ42で動作しているDBMS60が、同じデータを処理可能な「Shared Disk」型の並列DBMSである。
第3の実施の形態の計算機システムの構成は、第2の実施の形態の計算機システム(図19)と同一の構成であり、説明を省略する。
また、第3の実施の形態では、異なるDBサーバ42上で動作するDBMS60が同じデータを処理できる。そのため、最新データを含むページを保有するDBサーバ42が時間に応じて変化する。
そこで、DBMS60は、最新ページ保有サーバ情報650を含む共有DBデータ管理情報450によって、データを管理する。
図21は、本発明の第3の実施の形態の共有DBデータ管理情報450に含まれる最新ページ保有サーバ情報650の構成図である。
最新ページ保有サーバ情報650は、ページID651及びサーバID652を含む。
ページID651は、管理対象となるページの一意な識別子である。サーバID652は、当該ページの最新データを保有するDBサーバ42の一意な識別子である。
最新ページ保有サーバ情報650は、最新ページを保有するDBサーバ42が変化する度に、更新される。
DBMS60は、クエリプランを作成する際に、どのDBMS60がどのデータを処理すべきか決定する。そして、決定した内容を、処理管理情報400に含まれる処理分担情報660に格納する。
図22は、本発明の第3の実施の形態の処理管理情報400に含まれる処理分担情報660の構成図である。
処理分担管理情報660は、ステップID661、分割条件662及びサーバID663を含む。
ステップID661は、処理ステップの一意な識別子である。なお、一台のDBサーバ42がある処理ステップの結果を元に次の処理ステップを実行する場合には、次の処理ステップに対応するエントリは存在しない。
分割条件662は、当該処理ステップにおける処理の分割方法を示す。なお、一台のDBサーバ42上で実行すべき動作に関しては、分割条件662には「全データ」が格納される。
サーバID663は、当該処理ステップが実行されるDBサーバ42の一意な識別子である。
データ処理部206が次の処理ステップにデータを展開する場合、又は、先読み部208が先読み要求管理情報540に次の処理ステップに関する新規エントリを割り当てる場合には、クエリプラン600の処理分担情報660に基づいて、処理を行うDBサーバ42を把握する。そして、把握したDBサーバ42に処理の実施を依頼する。
本実施の形態では、APプログラム70は、一つのDBMS60にクエリを送信する。クエリを受信したDBMS60は、APプログラム70との通信処理及びクエリプランの作成処理を行う。そして、すべてのDBMSは、APプログラム70との通信処理及びクエリプランの作成処理以外の処理を、分担して実行する。
共有DBデータ管理部210は、データ取得要求時処理(図14)のステップ1215において、最新ページ保有サーバ情報650を参照することによって、要求されたページの最新データを他のDBサーバ42が保有しているか否かを判定する。
他のDBサーバ42が保有している場合には、当該他のDBサーバ42上で動作するDBMS60の共有DBデータ管理部210に対して、当該ページの転送を要求する。
すると、転送要求を受け取った共有DBデータ管理部210は、ロック管理情報480を参照することによって、転送を要求されたページにロックが設定されているかどうかを判定する。
ロックが設定されていない場合には、当該ページを要求先の共有DBデータ管理部210に送信する。一方、ロックが設定されている場合には、ロック管理情報480ロック待ちリスト488に当該処理に対応するクエリIDを追加する。
そして、ロックの取得が可能になると、要求されたページ及び当該ページに対応するロック待ちリスト488を要求先の共有DBデータ管理部210に送信する。
次に、当該ページを保持するブロックに対応するエントリを、バッファブロック管理情報460から削除する。
ページの転送を要求した共有DBデータ管理部210は、ページを受信する。このとき、ページと共にロック待ちリストを受け取った場合、受け取ったロック待ちリストを、ロック管理情報480のロック待ちリスト488に格納する。その後、有DBデータ管理部210は、第一の実施の形態と同一の処理を行う。
共有DBデータ管理部210は、データ参照要求時処理(図17)のステップ1316において、最新ページ保有サーバ情報650を参照することによって、要求されたページの最新データを他のDBサーバ42が保有しているか否かを判定する。
他のDBサーバ42が保有している場合には、当該他のDBサーバ42上で動作するDBMS60の共有DBデータ管理部210に対して、当該ページの転送を要求する。
すると、転送要求を受け取った共有DBデータ管理部210は、要求されたページのデータ及び当該ページのロック状態を、要求元の共有DBデータ管理部210に即時に送信する。
要求元の共有DBデータ管理部210は、受け取ったページにロックが設定されいるかいないかを判定する。
ロックが設定されていない場合、記憶装置46から読み出したページと同様に管理する。
一方、ロックが設定されている場合、当該ページを記憶装置46から読み出したページから分離して保持する。そして、先読み部208からデータの参照完了報告を受けると、当該データを即時に破棄する。つまり、ロックが設定されていない場合には、最新ページを保有するDBサーバ42が変化する。一方、ロックが設定されている場合には、最新ページを保有するDBサーバ42が変化しない。