(57)【要約】【課題】プログラムの実行に必要なデータを先読みしてその実行を効率化する。【解決手段】コンピュータにより再帰アクセス命令を先読み対象プログラムに先立ち実行させるシステムを提供する。このシステムは、プログラムの繰返し処理の中から、選択条件を満たすレコードを対象テーブルから選択し結果テーブルを生成する照会命令を検出する。そして、プログラム中で繰返し処理の開始に先立って設定される変数値を含む初期テーブルを生成する初期照会命令を生成する。また、順次実行される各々の繰返し処理に対応付けられた各々の再帰照会において、前回以前の繰返し処理の対象照会命令により生成された結果テーブルを含む中間テーブルおよび対象テーブルから次回以降の繰返し処理によって参照される次の中間テーブルを生成する再帰照会命令を生成する。また、再帰照会によって順次生成された中間テーブルから最終テーブルを生成する最終照会命令を生成する。【選択図】図４
2007179161.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより、初期テーブルを生成する初期照会命令と、前記初期テーブルまたは前回の再帰照会により生成されたテーブルを中間テーブルとし、当該中間テーブルから選択条件を満たす次の中間テーブルを生成する再帰照会命令と、それぞれの前記中間テーブルから最終テーブルを生成して出力する最終照会命令とを含む再帰アクセス命令を生成して、先読み対象プログラムの実行に先立って前記再帰アクセス命令を実行させることにより、前記プログラムの実行に必要なデータをデータベースから先読みして前記プログラムに提供するシステムであって、
前記プログラムを取得する取得部と、
予め定められた選択条件を満たすレコードを対象テーブルから選択して結果テーブルを生成する照会命令を、先読みの対象となる対象照会命令として、前記プログラム中の繰返し処理の中から検出する命令検出部と、
前記プログラム中で前記繰返し処理の開始に先立って予め設定される変数の値を含むテーブルを初期テーブルとして生成する命令を、初期照会命令として生成する初期照会命令生成部と、
順次実行される各々の前記繰返し処理に対応付けられた各々の前記再帰照会において、前回以前の繰返し処理の対象照会命令によって生成された結果テーブルを含む中間テーブルおよび前記対象テーブルから、次回以降の繰返し処理の対象照会命令によって参照されるカラムおよび前記選択条件を満たすレコードを選択することにより、前記次の中間テーブルを生成する命令を、再帰照会命令として生成する再帰照会命令生成部と、
前記再帰照会によって順次生成された前記中間テーブルの少なくとも一部のカラムを選択する命令を、最終照会命令として生成する最終照会命令生成部と、
を備えるシステム。
【請求項２】
前記命令検出部は、前記プログラム中で指定されたキー変数との間で前記選択条件を満たすレコードを選択する照会命令を、前記対象照会命令として検出し、
第１の前記繰返し処理の対象照会命令から順に、前記第１の繰返し処理に先立って実行される第２の前記繰返し処理の対象照会命令に向けて実行経路を遡って前記プログラムを走査し、前記第２の繰返し処理の対象照会命令の結果テーブルを入力として前記第１の繰返し処理の対象照会命令の前記キー変数の値を算出する第１算出式を検出する第１算出式検出部を更に備え、
前記再帰照会命令生成部は、前記対象テーブルおよび前記中間テーブルから、前記中間テーブルを前記第１算出式に入力した算出結果との関係で前記選択条件を満たすレコードを選択することにより、次の中間テーブルを生成する命令を、前記再帰照会命令として生成する、
請求項１に記載のシステム。
【請求項３】
前記第１算出式検出部は、前記対象照会命令についてＤ−Ｕチェインを生成し、前記第１の繰返し処理における対象照会命令のキー変数から前記Ｄ−Ｕチェインを遡って前記第２の繰返し処理の対象照会命令の結果テーブルに至る経路を検出し、当該経路上で当該結果テーブルから当該キー変数の値を求めるために行われる演算を前記第１算出式として検出する、
請求項２に記載のシステム。
【請求項４】
前記命令検出部は、複数のレコードを含む前記結果テーブルを生成する照会命令を、前記対象照会命令として検出し、
前記第１算出式検出部は、前記複数のレコードについて順次同一の処理を行う他の繰返し処理を、何れか一の前記レコードについて行う処理として取り扱うことによって、前記キー変数から前記Ｄ−Ｕチェインを遡って前記結果テーブルに至る経路を検出する、
請求項３に記載のシステム。
【請求項５】
前記第１算出式検出部は、更に、それぞれの前記繰返し処理を前記第１の繰返し処理とした場合において前記第１の繰返し処理から前記第２の繰返し処理に至るまでに遡る繰返し処理の最大数である遡及回数を検出し、
前記再帰アクセス命令の中間テーブルのカラム数として、前記遡及回数に、前記対象照会命令のカラム名リストのカラム数を乗じた数を設定するカラム数設定部を更に備え、
前記初期照会命令生成部は、前記繰返し処理の開始に先立って設定された変数の値および第１回目から前記遡及回数未満の前記繰返し処理のそれぞれにおける前記対象照会命令の結果テーブルを含む初期テーブルを生成する命令を、前記初期照会命令として生成し、
前記再帰照会命令生成部は、各々の前記再帰照会において、対応する繰返し処理から前記遡及回数まで遡ったそれぞれの繰返し処理における結果テーブルを含む中間テーブルから最も先に生成された結果テーブルを除外し、前記選択条件を満たすレコードを前記対象テーブルから選択して当該中間テーブルに追加することにより次の中間テーブルを生成する命令を、前記再帰照会命令として生成し、
前記最終照会命令生成部は、それぞれの再帰照会において生成された前記中間テーブルから当該再帰照会において前記対象テーブルから選択された部分を選択する命令を、前記最終照会命令として生成する、
請求項２に記載のシステム。
【請求項６】
第１の前記繰返し処理の対象照会命令から順に、前記第１の繰返し処理に先立って実行される第２の前記繰返し処理の対象照会命令に向けて実行経路を遡って前記プログラムを走査し、前記第２の繰返し処理の対象照会命令の結果テーブルを入力として前記第１の繰返し処理の終了判定に用いられる判定変数の値を算出する第２算出式を検出する第２算出式検出部を更に備え、
前記再帰照会命令生成部は、前記中間テーブルを前記第２算出式に入力した算出結果が前記終了判定の条件を満たすことを条件に再帰照会を終了させ、当該算出結果が前記終了判定の条件を満たさないことを条件に次の中間テーブルを生成する命令を、前記再帰照会命令として生成する、
請求項１に記載のシステム。
【請求項７】
前記再帰照会命令生成部は、前記中間テーブルを前記第２算出式に入力した算出結果が前記終了判定の条件を満たさないという再帰継続条件を、前記選択条件に追加することによって、前記再帰照会命令を生成する、
請求項６に記載のシステム。
【請求項８】
前記再帰照会命令生成部は、前記選択条件を満たすレコードが前記対象テーブル中に存在しなくなる場合において、前記中間テーブルを前記第２算出式に入力した算出結果が前記終了判定の条件を満たす場合には、前記再帰継続条件を前記選択条件に追加しない、
請求項７に記載のシステム。
【請求項９】
前記初期照会命令生成部は、外部入力の値を格納するためのカラムを更に含むテーブルを初期テーブルとして生成する命令を、前記初期照会命令として生成し、
前記再帰照会命令生成部は、外部入力の値を格納するためのカラムを更に含むテーブルを次の中間テーブルとして生成する命令を、前記再帰照会命令として生成する、
請求項１に記載のシステム。
【請求項１０】
コンピュータにより、初期テーブルを生成する初期照会命令と、前記初期テーブルまたは前回の再帰照会により生成されたテーブルを中間テーブルとし、当該中間テーブルから選択条件を満たす次の中間テーブルを生成する再帰照会命令と、それぞれの前記中間テーブルから最終テーブルを生成して出力する最終照会命令とを含む再帰アクセス命令を生成して、先読み対象プログラムの実行に先立って前記再帰アクセス命令を実行させることにより、前記プログラムの実行に必要なデータをデータベースから先読みして前記プログラムに提供する方法であって、
前記プログラムを取得するステップと、
予め定められた選択条件を満たすレコードを対象テーブルから選択して結果テーブルを生成する照会命令を、先読みの対象となる対象照会命令として、前記プログラム中の繰返し処理の中から検出するステップと、
前記プログラム中で前記繰返し処理の開始に先立って予め設定される変数の値を含むテーブルを初期テーブルとして生成する命令を、初期照会命令として生成するステップと、
順次実行される各々の前記繰返し処理に対応付けられた各々の前記再帰照会において、前回以前の繰返し処理の対象照会命令によって生成された結果テーブルを含む中間テーブルおよび前記対象テーブルから、次回以降の繰返し処理の対象照会命令によって参照されるカラムおよび前記選択条件を満たすレコードを選択することにより、前記次の中間テーブルを生成する命令を、再帰照会命令として生成するステップと、
前記再帰照会によって順次生成された前記中間テーブルの少なくとも一部のカラムを選択する命令を、最終照会命令として生成するステップと、
を備える方法。
【請求項１１】
コンピュータにより、初期テーブルを生成する初期照会命令と、前記初期テーブルまたは前回の再帰照会により生成されたテーブルを中間テーブルとし、当該中間テーブルから選択条件を満たす次の中間テーブルを生成する再帰照会命令と、それぞれの前記中間テーブルから最終テーブルを生成して出力する最終照会命令とを含む再帰アクセス命令を生成して、先読み対象プログラムの実行に先立って前記再帰アクセス命令を実行させることにより、前記プログラムの実行に必要なデータをデータベースから先読みして前記プログラムに提供するシステムとして、前記コンピュータを機能させる制御プログラムであって、
前記コンピュータを、
前記プログラムを取得する取得部と、
予め定められた選択条件を満たすレコードを対象テーブルから選択して結果テーブルを生成する照会命令を、先読みの対象となる対象照会命令として、前記プログラム中の繰返し処理の中から検出する命令検出部と、
前記プログラム中で前記繰返し処理の開始に先立って予め設定される変数の値を含むテーブルを初期テーブルとして生成する命令を、初期照会命令として生成する初期照会命令生成部と、
順次実行される各々の前記繰返し処理に対応付けられた各々の前記再帰照会において、前回以前の繰返し処理の対象照会命令によって生成された結果テーブルを含む中間テーブルおよび前記対象テーブルから、次回以降の繰返し処理の対象照会命令によって参照されるカラムおよび前記選択条件を満たすレコードを選択することにより、前記次の中間テーブルを生成する命令を、再帰照会命令として生成する再帰照会命令生成部と、
前記再帰照会によって順次生成された前記中間テーブルの少なくとも一部のカラムを選択する命令を、最終照会命令として生成する最終照会命令生成部と、
して機能させる制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベースにアクセスする入力されたプログラムを解析処理して実行することによりデータベースに対して効率良くアクセスするシステムに関する。特に、本発明は、繰返し処理を含むそのようなプログラムを実行する場合にデータベースに対するアクセスを効率化するシステムに関する。
【背景技術】
【０００２】
近年、J2EE(Java2 Enterprise Edition)やJDBC(Java Database Connectivity)の普及に伴い、Java言語（登録商標）などで記述されたプログラムの実行によって、データベースにアクセスすることができる。データベースにアクセスするプログラムは、例えば、アプリケーション・サーバ装置において実行され、データベースから必要なデータを読み出して条件判断し、その判断の結果に基づいてデータベースを更新する。膨大なデータを処理対象とする場合には、プログラムに繰返し処理を記述して、データベースに含まれる複数のデータを順次処理対象とする方法が用いられる。
【０００３】
このような繰返し処理はバッチ処理と呼ばれる。バッチ処理において、繰返し処理のそれぞれにおいてデータベースにアクセスさせると、データベースに対するアクセス回数が膨大となって処理効率が低下する場合がある。一方で、バッチ処理によっては、アクセスする対象となるデータを処理に先立って静的に解析できる場合がある。このような場合には、繰返し処理の開始に先立って、繰返し処理に必要なデータを一括して予めデータベースからアプリケーション・サーバ装置に読み出すことが望ましい。なお、関連技術として、バッチ処理の効率化をある程度自動的に行う技術が提案されている（非特許文献１を参照。）。
【０００４】
【非特許文献１】情報処理学会論文誌Vol. 35 No. 5 (May 1994)
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、バッチ処理によっては、アクセスする対象となるデータが繰り返し処理の過程で決定される場合がある。例えば、１回目の繰返し処理においてテーブルからある行を読み出した場合において、その行に含まれた識別番号によって、２回目の繰返し処理において読み出す行が決定される場合がある。このような場合には、１回目の繰返し処理を実行する前に２回目の繰返し処理によってアクセスされるデータを知ることはできない。このため、繰返し処理の開始に先立って、繰返し処理に必要なデータを予め読み出すことはできなかった。従って、繰返し処理の度にデータベースに対するアクセスが発生し、プログラムの実行効率が低くなる場合があった。
【０００６】
なお、上述の関連技術は、バッチ処理に含まれる複数のジョブまたはジョブステップについて、ジョブやジョブステップ間でデータを送受信する処理を効率化することを目的とする。一方で、単一のジョブの中でも複数の非効率なアクセスが発生する場合があり、このような場合にはこの技術は適用できない。
【０００７】
そこで本発明は、上記の課題を解決することのできるシステム、方法、および、制御プログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明の第１の形態においては、コンピュータにより、初期テーブルを生成する初期照会命令と、初期テーブルまたは前回の再帰照会により生成されたテーブルを中間テーブルとし、当該中間テーブルから選択条件を満たす次の中間テーブルを生成する再帰照会命令と、それぞれの中間テーブルから最終テーブルを生成して出力する最終照会命令とを含む再帰アクセス命令を生成して、先読み対象プログラムの実行に先立って再帰アクセス命令を実行させることにより、プログラムの実行に必要なデータをデータベースから先読みしてプログラムに提供するシステムであって、先読み対象プログラムを取得する取得部と、予め定められた選択条件を満たすレコードを対象テーブルから選択して結果テーブルを生成する照会命令を、先読みの対象となる対象照会命令として、プログラム中の繰返し処理の中から検出する命令検出部と、プログラム中で繰返し処理の開始に先立って予め設定される変数の値を含むテーブルを初期テーブルとして生成する命令を、初期照会命令として生成する初期照会命令生成部と、順次実行される各々の繰返し処理に対応付けられた各々の再帰照会において、前回以前の繰返し処理の対象照会命令によって生成された結果テーブルを含む中間テーブルおよび対象テーブルから、次回以降の繰返し処理の対象照会命令によって参照されるカラムおよび選択条件を満たすレコードを選択することにより、次の中間テーブルを生成する命令を、再帰照会命令として生成する再帰照会命令生成部と、再帰照会によって順次生成された中間テーブルの少なくとも一部のカラムを選択する命令を、最終照会命令として生成する最終照会命令生成部と、を備えるシステム、当該システムによって再帰アクセス命令を生成する方法、および、当該システムとしてコンピュータを機能させるプログラムを提供する。
【０００９】
なお、上記の発明概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、本発明となりうる。
【発明の効果】
【００１０】
本発明によれば、これまでより多くのプログラムについて、当該プログラムの実行に必要なデータをデータベースから先読みして当該プログラムの実行を効率化できる。
【発明を実施するための最良の形態】
【００１１】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１２】
図１は、本発明の実施形態に係る情報処理システム１０の全体構成を示す。情報処理システム１０は、端末装置１５と、データベース装置３０と、アプリケーション・サーバ４０とを備える。端末装置１５は、データベース３５に対するアクセスを指示するプログラムをアプリケーション・サーバ４０に送信する。このプログラムを対象プログラム２０とする。この対象プログラム２０は、例えば、Java言語（登録商標）のEJB(Enterprise Java Beans)に準拠したAPI(Application Programming Interface)を用いて記述されている。
【００１３】
アプリケーション・サーバ４０は、対象プログラム２０を実行することにより、データベース装置３０に指示してデータベース３５からデータを取得し、または、データベース装置３０に指示してデータベース３５にデータを書き込む。即ち、例えば、アプリケーション・サーバ４０は、Java言語の仮想機械として機能し、ＥＪＢのＡＰＩの意味を解釈して対象プログラム２０を実行し、必要に応じてSQL(Structured Query Language)などの命令列をデータベース装置３０に送信する。データベース装置３０は、データベース３５を有しており、アプリケーション・サーバ４０から受けたSQLの命令列に従ってデータベース３５からデータを読み出してアプリケーション・サーバ４０に送信する。また、データベース装置３０は、この命令列に従ってデータベース３５のデータを書き換える。
【００１４】
以上の情報処理システム１０において、アプリケーション・サーバ４０からデータベース装置３０に対して頻繁にSQLの命令が送信されると、データベース装置３０およびアプリケーション・サーバ４０間に頻繁に通信が発生し、対象プログラム２０の実行効率が低下する。これに対し、対象プログラム２０の実行に先立って必要なデータを先読みし、一括してデータベース３５から取得することで、通信回数を削減して対象プログラム２０の実行効率を高められることが知られている。本発明の実施形態に係るアプリケーション・サーバ４０は、SQL99で導入された再帰アクセス命令を用い、これまでの技術では先読みの対象とならなかった命令についても先読みの対象とすることで、対象プログラム２０の実行効率を一層向上させることができる。
【００１５】
図２は、アプリケーション・サーバ４０に入力される対象プログラム２０の第１例を示す。図３は、データベース３５のうち第１例の対象プログラム２０の実行に必要なデータの一例を示す。対象プログラム２０は、PersonTaskListというテーブルで管理された人物のそれぞれに、Taskというテーブルで管理された仕事を割り当てて、割り当てた結果をPersonTaskListに記録することを意図している。
【００１６】
割り当てる対象となる人物を選択する順序は、PersonTaskList中に記録されたNextIDによって定められる。即ち、Suzukiに対応するNextIDは３なので、Suzukiの次に仕事を割り当てる人物はKawaiである。また、割り当てる仕事を選択する順序は、外部のファイルに記録されている。そのファイルから順次読み出す番号に対応するTaskNameを、Taskテーブルから読み出して人物に割り当てる。
【００１７】
より詳しくは、対象プログラム２０は、１行目に、変数「personID」に定数１を代入する命令を含む。この変数は、４行目においてデータベースのテーブルからレコードを読み出すキーとして用いられているので、この変数をキー変数と呼ぶ。対象プログラム２０は、２行目に繰返し処理の開始を示す「while」命令を含む。この命令から、この命令の中カッコに対応する１０行目の中カッコまでが、繰返し処理である。
【００１８】
対象プログラム２０は、３行目に、キー変数が０の場合に繰返し処理を終了する命令を含む。即ち、「キー変数が０であること」が、この繰返し処理の終了条件である。対象プログラム２０は、４行目に、キー変数をプライマリ・キーとしてpersonTaskListHomeというテーブルからレコードを選択する命令を含む。この命令によって選択されたレコードは、ビーンと呼ばれるオブジェクトに変換され、Java言語のプログラムによって参照可能となる。このビーンは、「personTaskListBean」と呼ばれる変数に代入される。
【００１９】
対象プログラム２０は、５行目に、所定のファイルから値を読み出して変数「taskID」に代入する命令を含む。対象プログラム２０は、６行目に、変数「taskID」をプライマリ・キーとしてtaskHomeというテーブルからレコードを選択する命令を含む。この命令によって選択されたレコードはビーンに変換され、変数「taskBean」に代入される。対象プログラム２０は、７行目に、taskBeanのビーンから、taskNameという名前のカラムのデータを取得する命令を含む。取得されたデータは変数「taskName」に代入される。
【００２０】
対象プログラム２０は、８行目に、変数「taskName」の値を、personTaskListBeanに記録する命令を含む。対象プログラム２０は、９行目に、personTaskListBeanのNextIDというカラムから値を取得してキー変数「personID」に代入する命令を含む。
【００２１】
なお、対象プログラム２０は、一般的には以下の１から７の条件を満たすこととする。
1. 照会の結果の全体の集合が時系列的に複数個に分割でき、時系列的に n 個目の結果を n でパラメタライズして参照できる。また、この分割に対応して、n 個目の結果を生成しているプログラム部分が特定できる。
2. 時系列的に n 個目の照会の結果、及びその照会に必要であった外部データ(ファイル等などからの読み込み)がすべて名前付けされており、どこからでも、また、いつでもそれらが参照可能である。
3. 時系列的に n 個目の照会が、1 から n-1 個目の照会結果およびそれらの照会に必要であった外部データのみに依存している。
4. 時系列的に n 個目の照会に必要な入力と、その照会に必要な上記3のデータの関係が、SQL 実行系が提供する関数、あるいは、SQL 実行系で構成できるユーザ定義関数で表現することができる。
5. 上記4の関係が、集合の数 n にかかわらず有限であり、n をパラメータとしてその関係が特定できる。あるいは、同等の条件であるが、上記1のプログラム部分が、集合の数 n にかかわらず有限であり、n をパラメータとしてそのプログラム部分が特定できる。
6. 集合の中で時系列的に最後の元が、その時系列的な番号を n として、その元が最後であるかどうかが、1 から n-1 個目の照会結果およびそれらの照会に必要であった外部データ、及び n 個目の照会結果から判断できる。
7. 外部データの取得は照会の結果に依存せず、実行に先立って全て先読み可能である。
上記を満たす如何なるプログラムも、その制御構造や照会の内容にかかわらず、情報処理システム１０による先読みの対象となり、先読み対象プログラムをなす。
【００２２】
図３（ａ）に示すように、データベース３５は、PersonTaskListというテーブルを含む。このテーブルは、人物を管理するためのテーブルであり、ID、Name、TaskName、および、NextIDというカラムを含む。例えばこのテーブルの第１レコードは、IDが１の人物の名前はSuzukiであり、Suzukiに割り当てられた仕事の名前はＡであり、Suzukiの次に仕事を割り当てる対象となる人物のIDは３であることを示す。
【００２３】
図３（ｂ）に示すように、データベース３５は、Taskというテーブルを更に含む。このテーブルは、仕事を管理するためのテーブルであり、TID、および、TaskNameというカラムを含む。例えばこのテーブルの第１レコードは、TIDが１の仕事の名前はＣであることを示す。
【００２４】
図２および図３（ｂ）を対比すると、対象プログラム２０の６行目の命令によって、テーブル「Task」から複数のレコードが繰返し処理の毎に順次読み出される。同様に、対象プログラム２０の４行目の命令によって、テーブル「PersonTaskList」から複数のレコードが繰返し処理の毎に順次読み出される。アプリケーション・サーバ４０は、これらの命令をそのまま実行してしまうと、実行の毎にデータベース３５に対する通信を発生させてしまって効率が悪い。このため、２行目に記述された繰返し処理の開始に先立って、その後の繰返し処理に必要なデータを予め取得することが望ましい。
【００２５】
ここで、図３（ｂ）のテーブル「Task」は、対象プログラム２０の５行目で値が代入される変数「taskID」をキーとしてアクセスされる。この変数「taskID」の値は、外部のファイルから順次読み出されるデータによって定められる。このため、このファイルの内容が静的に定まれば、アプリケーション・サーバ４０は、テーブル「Task」のどのレコードが必要であるかを予め解析できると考えられる。
【００２６】
一方で、図３（ａ）のテーブル「PersonTaskList」は、対象プログラム２０の４行目の命令によって、キー変数「personID」をキーとして読み出される。このキー変数には、１行目で初期値が代入され、その後９行目の命令が実行される毎に、前回の繰返し処理の対象照会命令の結果に基づいて順次更新される。即ち、毎回の繰返し処理が前回の繰返し処理に依存している。このため、テーブル「PersonTaskList」については、繰返し処理に先立って予めどのレコードが読み出されるかを解析することは困難である。「PersonTatskList」の内容を解析すれば先読みが可能とも考えられるが、それではデータベース３５に対する通信が発生して処理効率を向上できなくなってしまう。
【００２７】
本実施形態に係るアプリケーション・サーバ４０は、「PersonTaskList」のような先読みが困難なテーブルについても、再帰アクセス命令を用いて先読みを可能にする。以下、図４を参照してその機能について述べる。
【００２８】
図４は、本発明の実施形態に係るアプリケーション・サーバ４０の機能構成を示す。アプリケーション・サーバ４０は、後述するコンピュータ９００などのコンピュータを、プログラム解析部４２と、プログラム実行部４５と、キャッシュ部４８として機能させる。プログラム解析部４２およびプログラム実行部４５の機能は、典型的には、本発明に係る制御プログラムなどのソフトウェアによって実現される。また、キャッシュ部４８は、後述のＲＡＭ１０２０またはハードディスクドライブ１０４０などであり、当該制御プログラムは、ＲＡＭ１０２０またはハードディスクドライブ１０４０などをキャッシュ部４８として機能させる。
【００２９】
プログラム解析部４２は、端末装置１５から対象プログラム２０を取得してプログラム実行部４５に送ると共に、対象プログラム２０を走査することによってデータベース３５に対するアクセスの内容を解析する。そして、プログラム解析部４２は、解析結果に基づいて、繰返し処理の対象照会命令に必要なデータを先読みする再帰アクセス命令８２を生成してプログラム実行部４５に送る。プログラム実行部４５は、対象プログラム２０の実行に先立って再帰アクセス命令８２を実行し、対象プログラム２０の実行に必要なデータをデータベース３５から取得してキャッシュ部４８に記録する。続いて、プログラム実行部４５は、対象プログラム２０を実行し、実行過程において必要なデータをデータベース３５から取得する代わりにキャッシュ部４８から読み出す。
【００３０】
キャッシュ部４８は、ＥＪＢコンテナのBeanキャッシュと呼ばれる記憶領域であり、ＤＢ３５を構成するテーブルのレコードを、ビーンと呼ばれるオブジェクトの形式で記憶する。再帰アクセス命令８２の実行によってデータベース３５から取得されたレコードは、プログラム実行部４５によってビーンに変換されキャッシュ部４８に記録され、その後に実行される対象プログラム２０によって参照可能となる。
【００３１】
プログラム解析部４２は、取得部４００と、命令検出部４１０と、第１算出式検出部４２０と、第２算出式検出部４３０と、カラム数設定部４４０と、初期照会命令生成部４５０と、再帰照会命令生成部４６０と、最終照会命令生成部４７０とを有する。取得部４００は、対象プログラム２０を端末装置１５から取得してプログラム実行部４５に送る。命令検出部４１０は、先読みの対象となる対象照会命令を対象プログラム２０中の繰返し処理の中から検出する。具体的には、命令検出部４１０は、対象プログラム２０中で指定されたキー変数との間で予め定められた選択条件を満たすレコードを対象テーブルから選択して結果テーブルを生成する照会命令を対象照会命令として検出する。対象照会命令は、図２の例では、４行目に示すfindByPrimaryKeyメソッドである。この命令において、キー変数とは変数「personID」であり、選択条件とは「プライマリ・キーがキー変数の値と同一である」という条件である。また、対象テーブルはテーブル「PersonTaskList」であり、結果テーブルは、選択条件を満たすレコード中の全てのカラムによって構成されるテーブルである。
【００３２】
なお、命令検出部４１０は、キー変数に対する少なくとも１つの演算命令、および、そのキー変数を入力としたメソッド呼び出しにより構成される一連の命令列を対象照会命令として検出してもよい。即ち、対象照会命令とは、１回の繰返し処理の内部で完結する一連の処理を指示する少なくとも１つの命令であればよく、この命令が言語仕様上１つの命令で表されても複数の命令で表されてもよい。
【００３３】
第１算出式検出部４２０は、第１の繰返し処理から順に、第１の繰返し処理に先立って実行される第２の繰返し処理の対象照会命令に向けて実行経路を遡って対象プログラム２０を走査する。そして、第１算出式検出部４２０は、第２の繰返し処理の対象照会命令の結果テーブルを入力として第１の繰返し処理の対象照会命令のキー変数の値を算出する第１算出式を検出する。図２の例で、第１の繰返し処理の対象照会命令のキー変数は、前回の繰返し処理の対象照会命令の結果テーブルの第４カラム「NextID」の値である。このため、第１算出式は、例えば、tailoffour（）という関数、即ち、テーブルの第４カラムを選択して返す関数として表される。もしこの実行経路中に、キー変数の値を求めるための加算や減算等の演算があれば、その演算の内容が第１算出式に含まれる。
【００３４】
また、第１算出式検出部４２０は、順次実行されるそれぞれの繰返し処理を第１の繰返し処理とした場合においてその第１の繰返し処理から第２の繰返し処理に至るまでに遡る繰返し処理の最大数である遡及回数を検出する。図２の例で、ある繰返し処理における変数「personID」の値を定めているのは、その前回の繰返し処理における対象照会命令である。より詳細には、「personID」の値は９行目で代入されるが、９行目で参照されるpersonTaskBeanは、同一の繰返し処理内の４行目で対象照会命令によって生成されている。従って、第１算出式検出部４２０は、対象プログラム２０について遡及回数として１回を検出する。
【００３５】
第２算出式検出部４３０は、第１算出式検出部４２０と同様に、第１の繰返し処理から順に、第１の繰返し処理に先立って実行される第２の繰返し処理の対象照会命令に向けて実行経路を遡って対象プログラム２０を走査する。そして、第２算出式検出部４３０は、第２の繰返し処理の対象照会命令の結果テーブルを入力として第１の繰返し処理の終了判定に用いられる判定変数の値を算出する第２算出式を検出する。図２の例で、判定変数は、キー変数と同様に変数「personID」である。そして、このキー変数の値は、前回の繰返し処理の対象照会命令の結果テーブルの第４カラム「NextID」の値である。このため、第２算出式も、第１算出式と同様に、tailoffour（）という関数となる。
【００３６】
カラム数設定部４４０は、予め定められた再帰アクセス命令の雛形である雛形命令８０を取得する。雛形命令８０は、初期テーブルを生成する初期照会命令と、中間テーブルを順次生成する再帰照会命令と、最終テーブルを生成して出力する最終照会命令とを含む。より詳細には、再帰照会命令は、初期テーブルまたは前回の再帰照会により生成されたテーブルを中間テーブルとし、当該中間テーブルから選択条件を満たす次の中間テーブルを生成する命令である。また、最終照会命令は、再帰照会によって順次生成されたそれぞれの中間テーブルから選択したカラムを最終テーブルとして生成する命令である。
【００３７】
再帰アクセス命令の仕様の一例について述べる。SQL99において、再帰アクセス命令は、例えば、以下のようなwith recursive節と、select命令の組み合わせによって表される。
with recursive temp (f1, f2, f3) as (
select f1, f2, f3 from TARGET_TABLE where f1=0
union all
select tgt.f1, tmp.f2, tgt.f3 from TARGET_TABLE tgt, temp tmp where tgt.f2=tmp.f1)
select f1, f2, f3 from temp
【００３８】
最初のselect命令が初期照会命令を示す。次のselect命令が再帰照会命令を示す。最後のselect命令が最終照会命令を示す。それぞれの再帰照会においては、前回の再帰照会の結果が中間テーブルtmpとして与えられる。そして、それぞれの再帰照会においては、この中間テーブルtmpと、対象テーブルtgtとに基づいて次の中間テーブルを生成する。再帰照会による結果が空集合となるまで再帰照会が繰り返される。そして、それぞれの再帰照会において生成された中間テーブルは順次連結されて、最終照会命令に与えられる。
【００３９】
なお、SQL99などにおいて、再帰照会によって参照可能な中間テーブルは、前回の再帰照会によって生成された中間テーブルのみであり、前回より前の再帰照会によって生成された中間テーブルは参照できない。一方で、第１算出式検出部４２０によって検出された遡及回数が２以上の場合には、前回以前の再帰照会によって生成された中間テーブルを参照可能とする必要がある。このため、再帰アクセス命令の中間テーブルのカラム数は、対象照会命令のカラム数では足りず、前回以前の再帰照会によって生成された中間テーブルを格納するためのカラム数が必要となる。
【００４０】
このため、カラム数設定部４４０は、再帰アクセス命令の中間テーブルのカラム数として、第１算出式検出部４２０によって検出された遡及回数に、命令検出部４１０によって検出された対象照会命令のカラム数を乗じた数を設定する。中間テーブルの先頭のカラムには、前回の繰返し処理の対象照会命令によって生成された結果テーブルが格納される。それより後尾側のカラムには、前回以前の繰返し処理の対象照会命令によって生成された結果テーブルが格納される。図２の例では、遡及回数は１であり、対象照会命令のカラム数は４であるので、中間テーブルのカラム数は１×４により４となる。なお、カラム数設定部４４０は、外部入力がある場合には、中間テーブルのカラム数にこの外部入力の数を加える。
【００４１】
初期照会命令生成部４５０は、初期照会命令を生成する。生成される初期照会命令は、対象プログラム２０中で繰返し処理の開始に先立って予め設定される変数の値、および、第１回目から遡及回数未満の繰返し処理のそれぞれにおける対象照会命令の結果テーブルを含むテーブルを、初期テーブルとして生成する命令である。図２の例で、繰返し処理の開始に先立って１行目でpersonIDに１が設定されているので、初期テーブルは定数１を含む。また、図２の例で遡及回数は１であるから、初期テーブルは、何れの結果テーブルも含まない。
【００４２】
再帰照会命令生成部４６０は、再帰照会命令を生成する。生成される再帰照会命令は、順次実行される各々の繰返し処理に対応付けられた各々の再帰照会において、前回以前の繰返し処理の対象照会命令によって生成された結果テーブルを含む中間テーブルおよび対象テーブルから、次回以降の繰返し処理の対象照会命令によって参照されるカラムおよび選択条件を満たすレコードを選択することにより次の中間テーブルを生成する命令である。詳細には、再帰照会命令は、対象テーブルおよび中間テーブルから、中間テーブルを第１算出式に入力した算出結果との関係で選択条件を満たすレコードを選択することにより次の中間テーブルを生成する命令である。
【００４３】
図２の例では、再帰照会命令は、前回の再帰照会においてPersonTaskListから読み出されたレコードを中間テーブルとし、第１カラムの値がこの中間テーブルの第４カラムの値と等しいレコードをPersonTaskListから選択する処理となる。選択されたこのレコードが次の中間テーブルとなる。また、再帰照会命令は、中間テーブルを第２算出式に入力した算出結果が終了判定の条件を満たすことを条件に再帰照会を終了させ、その算出結果が終了判定の条件を満たさないことを条件に次の中間テーブルを生成する命令としての役割も果たす。
【００４４】
そして、最終照会命令生成部４７０は、再帰照会によって順次生成された中間テーブルの少なくとも一部のカラムを選択する命令を、最終照会命令として生成する。
【００４５】
図５は、本発明の実施形態において対象プログラム２０を解析して必要なデータを先読みする処理の一例を示す。取得部４００は、対象プログラム２０を端末装置１５から取得する（Ｓ５００）。命令検出部４１０、第１算出式検出部４２０、および、第２算出式検出部４３０は、対象プログラム２０を解析する（Ｓ５１０）。カラム数設定部４４０、初期照会命令生成部４５０、再帰照会命令生成部４６０、および、最終照会命令生成部４７０は、再帰アクセス命令８２を生成する（Ｓ５２０）。プログラム実行部４５は、対象プログラム２０の実行に先立って再帰アクセス命令８２を実行することにより、対象プログラム２０の実行に必要なデータをデータベース３５から取得してキャッシュ部４８に記録する（Ｓ５３０）。そして、プログラム実行部４５は、対象プログラム２０を実行する。
【００４６】
図６は、図５のＳ５１０における処理の概要を示す。命令検出部４１０は、対象照会命令を検出する（Ｓ６００）。対象プログラム２０が、ＥＪＢに準拠したJavaプログラムとすれば、命令検出部４１０は、findByPrimaryKeyメソッドを含む命令を対象照会命令として検出してもよい。次に、命令検出部４１０は、検出した対象照会命令に基づいて、キー変数と結果テーブルとの間の関係を定めた関数FX（）を生成する（Ｓ６１０）。FX（）は、ｘを変数とするラムダ式を用いて以下のように表される。
FX() = λx.(select OF from T where F(x))
【００４７】
ただし、キー変数を抽象化した変数をｘとし、対象照会命令のカラム名リストをOFとする。また、対象照会命令のテーブル名リストをTとし、対象照会命令の選択条件をＦ（）とする。即ち、FX（）は、入力であるキー変数ｘと、キー変数ｘとの間で選択条件Ｆ（）を満たすレコードをテーブルTから選択した結果テーブルとの関係を示す。
【００４８】
次に、第１算出式検出部４２０は、対象照会命令についてＤ−Ｕチェイン（Ｄｅｆｉｎｅ−Ｕｓｅ  チェイン）を生成し、第１の繰返し処理における対象照会命令のキー変数からこのＤ−Ｕチェインを遡って第２の繰返し処理の対象照会命令の結果テーブルに至る経路を検出し、この経路上でこの結果テーブルからこのキー変数の値を求めるために行われる演算を第１算出式として検出する（Ｓ６２０）。
【００４９】
この第１算出式を、入力されるテーブルと出力されるキー変数との関係を示す関数FYと表す。FYは、１回遡及した繰返し処理の対象照会命令の結果テーブルの各カラムを、ｏ_１_１からｏ_１_ｈとし、Ｎ−１回遡及した繰返し処理の対象照会命令の結果テーブルの各カラムを、ｏ_（Ｎ−１）_１からｏ_（Ｎ−１）_ｈとし、以下の関数FY_１からFY_ｍの集合として表される。
【００５０】
I_N_1 = FY_1(o_1_1, o_1_2, … o_1_h,
o_2_1, o_2_2, … o_2_h,
…
o_(N-1)_1, o_(N-1)_2, … o_(N-1)_h, 外部入力)
I_N_2 = FY_2(o_1_1, o_1_2, … o_1_h,
o_2_1, o_2_2, … o_2_h,
…
o_(N-1)_1, o_(N-1)_2, … o_(N-1)_h, 外部入力)
…
I_N_m = FY_m(o_1_1, o_1_2, … o_1_h,
o_2_1, o_2_2, … o_2_h,
…
o_(N-1)_1, o_(N-1)_2, … o_(N-1)_h, 外部入力)
【００５１】
なお、Ｉ_Ｎ_１からＩ_Ｎ_ｍは、キー変数の集合とする。図２の例では、キー変数は１つなので、FYはFY_１からFY_ｍのうち１つのみと等しい関数である。具体的には、既に述べたように、１回遡及した繰返し処理の対象照会命令の結果テーブルにおける第４カラムの値を取得して返す関数となる。即ち、この表記に従えば、FY＝ｏ_１_４である。
【００５２】
次に、第１算出式検出部４２０は、遡及回数を検出する（Ｓ６３０）。遡及回数は、Ｓ６２０において生成されたＤ−Ｕチェインを、キー変数から対象照会命令に向けて遡ることによってカウントされる。検出された遡及回数をLと置く。
次に、第１算出式検出部４２０は、終了判定に用いられる判定変数からＤ−Ｕチェインを遡ることによって対象照会命令に至る経路を選択し、その経路上で結果テーブルに対して行われる演算を第２算出式として検出する（Ｓ６４０）。検出された第２算出式を含む終了条件をFTと置く。FTは、第２算出式の算出結果が終了条件を満たす場合に真となる関数とする。
【００５３】
図７は、図５のＳ５２０における処理の概要を示す。図８は、雛形命令８０、第１例の対象プログラム２０に基づき生成される再帰アクセス命令８２、および、改良アクセス命令８４を対比して示す。図８を参照しながら、Ｓ５２０の処理の流れを説明する。カラム数設定部４４０は、再帰アクセス命令の中間テーブルのカラム数として、遡及回数に、対象照会命令のカラム名リストのカラム数を乗じた数を設定する（Ｓ７００）。より詳細には、カラム数設定部４４０は、再帰アクセス命令の引数リストに、このカラム数と同一の個数の変数を設定する。これらの変数の列をROWS_LASTと表記する。これは、それぞれの再帰照会から見て、前回の再帰照会によってテーブルから選択されたロー（即ちレコード）という意味である。ROWS_LASTは、遡及回数Lと、対象照会命令のカラム数ｈを用いて、例えば以下の変数列として表される。
【００５４】
ROWS_LAST 
= {f_L_1, f_L_2, … f_L_h,
f_(L-1)_1, f_(L-1)_2, … f_(L-1)_h,
…
f_2_1, f_2_2, … f_2_h,
f_1_1, f_1_2, … f_1_h}
【００５５】
カラム数設定部４４０は、このような中間テーブルを設定するために、再帰アクセス命令の定義部分を以下のように生成する。これは、図８（ａ）の１行目に相当する。
with recursive temp ( ROWS_LAST ) as
但し、tempは、再帰照会によって順次生成される中間テーブルを示す。
【００５６】
図２の例では、遡及回数Lは１であり、カラム数ｈは４なので、ROWS_LAST={f_1_1, f_1_2, f_1_3, f_1_4}となる。即ち、再帰アクセス命令の定義部分は以下のように構成される。これは、図８（ｂ）の１行目に相当する。
with recursive temp (f_1_1, f_1_2, f_1_3, f_1_4)
【００５７】
次に、初期照会命令生成部４５０は、初期照会命令を生成する（Ｓ７１０）。初期照会命令は、繰返し処理の開始に先立って設定された変数の値、および、第１回目から遡及回数（L）未満の繰返し処理のそれぞれにおける対象照会命令の結果テーブルを含む初期テーブルを生成する命令である。遡及回数Lが１の場合には、初期テーブルは当該変数の値のみを含み、結果テーブルを含まない。初期テーブルに含まれる結果テーブルの列、および、変数の値を一般化して以下のように表す。
O'_(L＋１)＝O_L，O_(L-１），O_(L−２)，…，O_１
【００５８】
これは、図８（ａ）の２行目に相当する。O'_(L＋１)は、初期テーブルとして生成するテーブルのカラム名リストを示す。O_Lは、第(L−１)回目の繰返し処理の対象照会命令によって生成される結果テーブルを示し、O_１は、繰返し処理の開始に先立って設定される変数の値を含むテーブルを示す。これらを一般化して示すと、以下のように表される。
O_１  ＝  （繰返し処理の開始に先立って設定される変数の値を含むテーブル）
O_ｎ＝FX(FY(O_ｎ-1))  ただし  n>1の場合
【００５９】
図２の例では、遡及回数Lは１なので、初期テーブルは以下のように表される。
O'_(L+１)=O'_２=O_１
即ち、初期テーブルは、繰返し処理の開始に先立って設定される変数の値を含むテーブルとなる。初期照会命令生成部４５０は、例えば、図２の例の初期テーブルとして以下のテーブルを生成する。これは、図８（ｂ）の２行目に相当する。
O_１={dummy, dummy, dummy, 1}
【００６０】
第４カラムの定数１は、変数personIDの値である。初期照会命令生成部４５０は、初期テーブルが最初の再帰照会における中間テーブルとして用いられるので、検出された第１算出式（FY）に基づいて、第４カラムに変数personIDの値を設定する。即ち、初期照会命令生成部４５０は、第１算出式（FY）によって変数personIDの値が中間テーブルから算出できるように、初期テーブルに変数personIDの値を格納させる。なお、select命令は常にwhere節を含むという仕様に従い、常に真となる条件がwhere節に記述される。図８（ａ）の例では d.id = 1となる。
なお、変数の値、FX、FYともに、再帰照会の動的な振る舞いに関わらず静的に定まるものである。このため、この初期照会命令の生成は漸化式の成立を妨げない。
【００６１】
再帰照会命令生成部４６０は、再帰照会命令を生成する（Ｓ７２０）。再帰照会命令は、それぞれの繰返し処理に対応するそれぞれの再帰照会を処理させる命令である。それぞれの再帰照会は、対応する繰返し処理から遡及回数Lまで遡ったそれぞれの繰返し処理における結果テーブルを含む中間テーブルから、最も先に生成された結果テーブルを除外し、対象照会命令の選択条件を満たすレコードを対象テーブルから選択して当該中間テーブルに追加することにより次の中間テーブルを生成する処理となる。
【００６２】
Ｓ７１０の説明において定義した記号O'_n(つまり、n-L回目からn-1回目までの結果テーブルの列)を用いると、再帰照会命令の処理内容を示す式は以下のように表される。
O'_(M+1)=O_M + CutTail(O'_M)
ここで、O'_Mは、M回目の再帰照会によって生成される中間テーブルを示し、O'_(M+1)は、M+1回目の再帰照会によって生成される中間テーブルを示す。また、O_Mは、M回目の再帰照会によって対象テーブルから選択されたレコードを示す。また、CutTailは、最初に生成された（つまり末尾に配列された）結果テーブルを除外する関数を示す。
【００６３】
O_Mは、１回からL回遡及したそれぞれの繰返し処理の対象照会命令の結果テーブルを入力として、FXおよびFYによって以下のように表される。
O_M = FX(FY(O_(M-L), O_(M-L+1), … , O_(M-1)))
FYに与えられる列は、O'_Mに他ならないから、O'_(M+1)は、以下の式によって表される。
O'_(M+1)=FX(FY(O'_M)) + CutTail(O'_M)
これは、M+1回目の再帰照会によって生成される中間テーブルが、M回目の再帰照会によって生成される中間テーブルに依存することを示す。即ち、再帰照会の処理内容は前回の再帰照会の結果のみに依存する漸化式として表される。
なお、中間テーブルが外部入力を含む場合には、再帰照会命令も外部入力をカラム名リストに更に含んでよい。
【００６４】
従って、再帰照会は、SQLのSELECT命令によって以下のように表される（図８（ａ）の４行目から６行目に相当）。
select [OF](FX()), ROWS_LAST_CUTTAIL, E_IN
from [T](FX()), temp t, dummy d
where [F](FX())(FY(ROWS_LAST, E_IN)) and d.id = case when FT(ROWS_LAST, E_IN) then 0 else 1 end
【００６５】
ここで、[OF](FX())は、対象照会命令のカラム名リストを示す。ROWS_LAST_CUTTAILは、ROWS_LASTから最も先に生成された結果テーブルを除外したカラムのリストを示す。例えば、ROWS_LAST={f_1_1, f_1_2, f_1_3, f_1_4, f_2_1, f_2_2, f_2_3, f_2_4}であれば、このうち２回遡及した繰返し処理の対象照会命令の結果テーブルを除外して、ROWS_LAST_CUTTAIL={f_1_1, f_1_2, f_1_3, f_1_4}となる。
【００６６】
E_IN は外部入力の値を格納するカラムを示す。[T](FX())は、対象照会命令のテーブル名リスト、即ち対象テーブルを示す。tは中間テーブルを示す。ｄは、idという名前のカラムのみからなり、値１を格納するテーブルを示す。ｄおよびcase when節については後述する。[F](FX())(FY(ROWS_LAST, E_IN))は、前回の繰返し処理の対象照会命令による結果テーブルとの関係で選択条件を満たすか否かを判断する条件を示す。より詳細には、[F](FX())は、対象照会命令の選択条件を示す。また、FY(ROWS_LAST, E_IN)は、前回の繰返し処理における結果テーブルを第１算出式に入力した算出結果を示す。これは、ROWS_LASTは中間テーブルであり、前回の繰返し処理における結果テーブルを含むものであるからである。
【００６７】
図２の例では、[OF](FX())は、{ID, Name, TaskName, nextID}となる。また、[T](FX())は、PersonTaskListであるが、select命令によって参照可能とするために例えば変数pによって表す。即ち、[T](FX())は、PersonTaskList pとなる。これと整合をとるため、[OF](FX())は、{p.ID, p.Name, p.TaskName, p.nextID}となる。また、ROWS_LAST_CUTTAILは、空集合（以降これをNULLとする）となる。また、選択条件は、カラムIDがキー変数の値と等しいということであるから、条件節whereは、p.ID=？となる。また、キー変数は第１算出式によって求められるから、中間テーブルの第４カラムの値、即ちt.f_1_4となる。
【００６８】
以上により、以下のselect命令が再帰照会命令として生成される。これは、図８（ｂ）の４行目および５行目に相当する。
select p.ID, p.Name, p.TaskName, p.nextID from PersonTaskList p, temp t, dummy d where p.ID = t.f_1_4 and d.id = case when t.f_1_4 = 0 then 0 else 1 end
【００６９】
また、再帰照会命令は、中間テーブルを第２算出式に入力した算出結果が対象照会命令の終了判定の条件を満たすことを条件に再帰照会を終了させる機能を有する。再帰照会命令にこの機能を持たせるべく、再帰照会命令生成部４６０は、前回の中間テーブルを第２算出式に入力した算出結果が終了判定の条件を満たさないという再帰継続条件を、対象照会命令の選択条件に追加する。この再帰継続条件は、上記のcase when節によって実現される。即ち、FT(ROWS_LAST, E_IN)は、第２算出式に結果テーブルを入力した算出結果が対象照会命令の終了条件を満たす場合に真となる。これが真の場合には、定数０とcase when節の値とが等しくなり、再帰照会が終了する。例えば図２の例では、第２算出式は第４カラムの選択であるから、case when t.f_1_4 = 0となる。
【００７０】
最終照会命令生成部４７０は、最終照会命令を生成する（Ｓ７３０）。最終照会命令は、それぞれの再帰照会において生成された中間テーブルから当該再帰照会において対象テーブルから選択された部分を選択する命令である。それぞれの再帰照会において対象テーブルから生成されたレコードは、中間テーブルの一番先頭側に追加されていくので、最終照会命令は中間テーブルの一番先頭側のカラムを選択する命令となる。最終照会命令の一般形は、図８（ａ）の８行目に示すように、以下のような命令となる。
select ROWS_HEAD from temp
【００７１】
ここで、ROWS_HEADは、それぞれの再帰照会において対象テーブルから選択されたカラムのカラム名リストを示す。例えば、ROWS_LAST={f_1_1, f_1_2, f_1_3, f_1_4, f_2_1, f_2_2, f_2_3, f_2_4}であれば、このうち２回遡及した繰返し処理の対象照会命令の結果テーブルを除外して、ROWS_HEAD={f_1_1, f_1_2, f_1_3, f_1_4}となる。図２の例では遡及回数Lが１なので、ROWS_HEAD={ f_1_1, f_1_2, f_1_3, f_1_4}となる。
【００７２】
最後に、図８（ｃ）に、再帰アクセス命令８２の改良例である改良アクセス命令８４を示す。図８（ｃ）の例において、カラム数設定部４４０は、再帰照会の回数をカウントする変数countを再帰アクセス命令のカラム名リストに加えてもよい。この場合、初期照会命令生成部４５０は、この変数countの初期値を0とするべく、初期照会命令のカラム名リストに定数0を加える。また、再帰照会命令生成部４６０は、再帰照会命令のカラム名リストに、この変数countに1を加えた値を加える。更に、再帰照会命令生成部４６０は、再帰照会命令の条件節に、この変数countの値が上限数MAX未満であるという条件を加える。改良アクセス命令８４によれば、再帰照会の最大回数を定めることができ、先読みの処理に要する時間を制限することができる。
【００７３】
図９は、アプリケーション・サーバ４０に入力される対象プログラム２０の第２例を示す。図１０は、データベース３５のうち第２例の対象プログラム２０の実行に必要なデータの一例を示す。第２例において、対象プログラム２０は、OLAP (online analytical processing)の例として、特定の条件を満たすレコードを対象テーブルから探し出すプログラムを示す。対象テーブルは図１０に示すARawDataである。ARawDataは、情報の収集結果や分析結果を示している。このARawDataを関数と見ると、ARawDataは、カラムIDの値に対してこの関数が出力する値をカラムaValueに格納している。この関数をRawDataと呼ぶ。
【００７４】
また、対象プログラム２０のプログラム内で参照可能な関数MyFuncが予め定められている。第２例は、この関数MyFuncと関数RawDataとの交点を示すIDの値を求めることを目的とする。これらの関数の交点を示すIDを求めるには、関数MyFuncから関数RawDataを引いた関数を生成し、その関数の値の符号が変化する点を示すIDを求めればよい。対象プログラム２０は、このようなIDの値を二分探索法によって探索し、そのIDに対応するaValueの値を出力する。
【００７５】
より詳細には、１行目の定数Xは、二分探索の初期探索範囲の上限を示す。変数greaterは、それぞれの探索における探索範囲の上限を示す。２行目の定数Yは、二分探索の初期探索範囲の下限を示す。変数lessは、それぞれの探索における探索範囲の下限を示す。３行目の変数aValueは、各探索範囲の中心にあるIDの値に対するaValueの値を格納するための変数である。変数aValueには、探索に影響を与えない定数Zが便宜上代入される。
【００７６】
４行目から１４行目が繰返し処理に対応する。それぞれの繰返し処理がそれぞれの探索に対応する。５行目の命令は、探索範囲の中心にあるIDの値を変数middleに代入する命令である。６行目の命令は、終了判定を行う命令であり、前回の探索範囲の中心が交点であれば繰返し処理を終了する命令である。７行目の命令は、変数middleをキー変数としてARawDataからレコードを読み出す対象照会命令である。８行目の命令は、読み出したレコードからカラムaValueの値を読み出して変数aValueに代入する命令である。９行目から１２行目の命令は、前回の探索範囲の中心が交点でなければ、前回の探索範囲を中心で分割した範囲の何れに交点が存在するかを判断して、交点が存在する範囲を次の探索範囲とする命令を示す。
【００７７】
図１１は、第２例のプログラムの解析に必要な追加テーブルを示す。プログラムの解析処理のために、便宜上、カラム数設定部４４０は、恒等写像を示すINDENTというテーブルを生成する。INDENTは、カラムgreater、カラムless、カラムX1、および、カラムX2を含む。INDENTは、レコードを１つのみ有し、その要素は、順に、X, Y, X, Yである。
【００７８】
図１２は、第２例の対象プログラム２０に基づき生成される再帰アクセス命令８２の具体例を示す。命令検出部４１０によって、対象照会命令として対象プログラム２０の７行目のfindByPrimarykeyメソッドが検出される。この対象照会命令に対応する関数FXは、選択条件を示す関数F()を用いて、以下のように表される。
【００７９】
FX() =
λx1x2x3.(select a.ID, a.aValue, i.greater, i.less from ARawData a, IDENT i where F(x1, x2, x3))
F() =
λx1x2x3.(i.X1 = x1 and i.X2 = x2 and a.ID = x3)
これに従い、図１２（ａ）の４行目から６行目に示すselect命令が生成される。
【００８０】
また、第１算出式検出部４２０は、７行目のbeanから次の繰返し処理における変数middleの値を求める算出式を、第１算出式として検出する。この第１算出式を示す関数FYは、関数FY_x1、関数FY_x2、および、関数FY_x3を用いて以下のように表される。また、それぞれの変数の値は前回の繰返し処理のみに依存するので、遡及回数Lは１である。
【００８１】
FY_x1() =
λxy.(case when SecondOfFour(x)-MyFunc(FirstOfFour(x)) > 0.0 then (ThirdOfFour(x)+ FourthOfFour(x))/2 else ThirdOfFour(x))
FY_x2() =
λxy.(case when !(SecondOfFour(x)-MyFunc(FirstOfFour(x)) > 0.0) then (ThirdOfFour(x)+ FourthOfFour(x))/2 else FourthofFour(x))
FY_x3() =
λxy.((ThirdOfFour(x)+ FourthOfFour(x))/2)
【００８２】
また、第２算出式検出部４３０は、６行目に示す終了条件を判定するための第１判定変数middle、および、第２判定変数aValueのそれぞれを、前回の繰返し処理の対象照会命令の結果テーブルから求める第２算出式を検出する。この第２算出式を含む終了条件FTは、以下のように表される。
FT() =
λxy.(SecondOfFour(x)-MyFunc(FirstOfFour(x))=0.0)
【００８３】
また、遡及回数が１なので、初期テーブルは、予め設定された定数のみを含む。具体的には、初期テーブルは、{(X+Y)/2, Z, X, Y}となる。ROWS_LAST、ROWS_LAST_CUTTAIL、ROWS_HEADについては、第１例と同様である。
【００８４】
処理の便宜上設けられたテーブルINDENTを、図１２（ａ）のselect命令から除外すると、図１２（ｂ）に示すプログラムとなる。具体的には、まず、カラム数設定部４４０は、図１２（ａ）に示す再帰アクセス命令８２から、条件節を検出する。そして、カラム数設定部４４０は、この条件節において、i.X1と同一か否かを判定される対象となる項を検出する。この項は、例えば、図１２（ａ）の５行目のcase whenから開始する項である。カラム数設定部４４０は、この項によって、カラム名リストのi.greaterを置き換える。同様に、カラム数設定部４４０は、i.X2との同一性を判定されている６行目の項によって、カラム名リストのi.lessを置き換える。そして、カラム数設定部４４０は、i.X1およびi.X2に関する条件節を削除する。
以上、第２例のように、結果テーブルからキー変数の値を求めるために各種の演算や選択処理が行われる場合であっても、適切な先読みのための再帰アクセス命令を生成することができる。
【００８５】
図１３は、アプリケーション・サーバ４０に入力される対象プログラム２０の第３例を示す。図１４は、データベース３５のうち第３例の対象プログラム２０の実行に必要なデータの一例を示す。第３例の対象プログラム２０は、社員の給料を管理する社員テーブルにおいて、それぞれの社員の給料を１万単位量増加させる処理を目的とする。図１4に示すように、データベース３５は、社員テーブルと、組織テーブルとを有する。社員テーブルは、社員番号のカラムと、社員の名前のカラムと、社員の給料のカラムと、それぞれの社員が所属する組織の管理者（以下、所属長）の社員番号を示すカラムとを有する。例えば、Kosekiの社員番号は40001であり、給料は700000単位量であり、所属長の社員番号は20000である。また、組織テーブルは、組織コードのカラムと、マネージャのカラムと、名前のカラムとを有する。例えば、組織コードがS7000の組織のマネージャの社員番号は10000であり、その組織の名前はTRLである。
【００８６】
また、社員テーブルの社員番号および所属長の社員番号によれば、組織の階層構造を解析可能である。即ち、例えば、Kuseの社員番号は10000であり、Nakataniの所属長の社員番号は10000であるから、Kuseの組織TRLの従属組織として、Nakataniの組織Systemsが位置していることが分かる。
【００８７】
対象プログラム２０は、１行目に、組織コードを格納するためのリスト構造のデータを生成する命令を含む。対象プログラム２０は、２行目に、そのデータに、組織コード「Ｓ７０００」を加える命令を含む。対象プログラム２０は、３行目から１６行目に繰返し処理を示す命令を含む。対象プログラム２０は、４行目に、リスト構造のデータから１つの要素を取り出す命令を含む。取り出された要素は、変数deptnoに格納される。対象プログラム２０は、５行目に、変数deptnoをキー変数として組織テーブルからレコードを選択する命令を含む。選択されたこのレコードは、変数departmentに代入される。
【００８８】
対象プログラム２０は、６行目に、選択されたそのレコードの中から、変数deptnoによって指定される組織コードの組織のマネージャの社員番号を取得する命令を含む。取得されたこの社員番号は、変数mgrNoに格納される。対象プログラム２０は、７行目に、変数mgrNoをキー変数として社員テーブルからレコードを選択する命令を含む。選択されたこのレコードは、変数employeesに格納される。対象プログラム２０は、８行目から１５行目において、変数employeesに格納された各社員のレコードのそれぞれについて順次同一の処理を行う他の繰返し処理を含む。
【００８９】
詳細には、対象プログラム２０は、９行目に、当該社員の給料を示す数値を10000単位増加させる命令を含む。対象プログラム２０は、１０から１１行目に、当該社員の社員番号をマネージャの社員番号とする組織テーブルのレコードを選択する命令を含む。このレコードは、変数subDeptに代入される。対象プログラム２０は、１２から１３行目に、組織コードを格納するためのリスト構造に、変数subDeptの要素を加える命令を含む。
【００９０】
対象プログラム２０によれば、社員テーブルを走査しながら走査対象の社員をマネージャとする従属組織を順次探索し、全ての従属組織を含む社員全体の給料を10000単位増加させることができる。このように、第３例においては、従属組織を動的に順次探索するので、読出の対象となるレコードはこの探索結果によって動的に決定される。即ち、第３例のようなプログラムも、従来手法によっては先読みの対象とすることができない。
【００９１】
図１５は、第３例の対象プログラム２０に基づき生成される再帰アクセス命令８２の具体例を示す。命令検出部４１０は、対象照会命令として、対象プログラム２０の５行目から１１行目までの一連の命令列を検出する。この対象照会命令に対応する関数FXは、選択条件を示す関数F()を用いて、以下のように表される。
【００９２】
FX() =
λx.(Select d1.deptCode, e.salary from Dept d1, Employee e, Dept d2 where F(x))
F() =
λx.(d1.mgrNum = e.empNum and e.mgrNum = d2.mgrNum and d2.deptCode = x)
【００９３】
また、第１算出式検出部４２０は、１０行目のDepartmentBeanから次の繰返し処理における変数deptnoの値を求める算出式を、第１算出式として検出する。なお、１０および１１行目に示す処理が繰り返し処理の中で実行されるので、第３例において結果テーブルが複数生成される場合がある。このような場合に、結果テーブルについてＤ−Ｕチェインを生成するのは困難であり、または、可能であっても極めて処理時間を要する場合が多い。これは、８行目の命令によって、複数の社員レコードのそれぞれについて順次同一の処理が繰返し行われるからである。第１算出式検出部４２０は、このような場合であっても適切な解析を可能とするべく、この繰返し処理を、何れか一の社員レコードについて行う処理として取り扱うことによって、Ｄ−Ｕチェインを生成する。そして、第１算出式検出部４２０は、このＤ−Ｕチェインをキー変数（deptno）から順次遡って結果テーブル(departmentBean)に至る経路を選択する。なお、この処理によって生成される再帰アクセス命令は、SQLの性質上、プログラムの実行に必要十分なデータを先読みすることに注意されたい。
【００９４】
検出された第１算出式は、所属テーブルの第１要素を選択する処理となる。第１算出式を以下のFYにより示す。また、それぞれの変数の値は前回の繰返し処理のみに依存するので、遡及回数Lは１である。
FY() =
λxy.(FirstOfColumns(x))    -> Select された列の最初の要素
以上により、図１５の４行目から５行目に示すselect命令が生成される。
【００９５】
また、第２算出式検出部４３０は、３行目に示す終了条件を判定するためのdeptCodesを、前回の繰返し処理の対象照会命令の結果テーブルから求める第２算出式を検出する。この第２算出式を含む終了条件FTは、以下のように表される。
FT() =
λxy.(select [OF](FX()) from [T](FX()), temp t , dummy d where [F](FX())(FY(x,y)) = null)
以上により、図１５の４から８行目に示す再帰照会命令が生成される。
【００９６】
また、遡及回数が１なので、初期テーブルは、予め設定された定数のみを含む。具体的には、初期テーブルは、{S7400, "dummy"}となる。ROWS_LAST、および、ROWS_HEADは、共に{f_1_1, f_1_2}となる。また、ROWS_LAST_CUTTAILはNULLである。
以上により、プログラム解析部４２は、図１５に示す再帰アクセス命令８２を再帰アクセス命令として生成することができる。
【００９７】
図１６は、再帰アクセス命令８２の変形例である改良アクセス命令８４を示す。再帰照会命令生成部４６０は、対象照会命令の選択条件を満たすレコードが対象テーブル中に存在しなくなる場合において、中間テーブルを第２算出式に入力した算出結果が終了判定の条件を満たす場合には、再帰継続条件を選択条件に追加しない。つまり、終了条件を満たした場合において、再帰照会命令のwhere節の前半の条件によって選択されるレコードがNULLになるのであれば、where節の後半のcase when節によって再帰継続条件を判断させなくとも、再帰照会は正しく終了する。このような場合には、再帰照会命令生成部４６０は、FTに関わらず、再帰継続条件を判断するcase when節を再帰照会命令に追加しない。このような最適化を行うことにより、再帰アクセス命令の構成を簡素にして、先読みに要する処理時間を削減することもできる。
【００９８】
図１７は、本発明の実施形態に係るアプリケーション・サーバ４０として機能するコンピュータ９００のハードウェア構成の一例を示す。コンピュータ９００は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、及びグラフィックコントローラ１０７５を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＢＩＯＳ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００９９】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＢＩＯＳ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【０１００】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１０４０は、コンピュータ９００が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０又はハードディスクドライブ１０４０に提供する。
【０１０１】
また、入出力コントローラ１０８４には、ＢＩＯＳ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＢＩＯＳ１０１０は、コンピュータ９００の起動時にＣＰＵ１０００が実行するブートプログラムや、コンピュータ９００のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、入出力チップ１０７０を介してＲＡＭ１０２０またはハードディスクドライブ１０４０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【０１０２】
コンピュータ９００に提供されるプログラム、例えば本発明に係る制御プログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１０７０及び/又は入出力コントローラ１０８４を介して、記録媒体から読み出されコンピュータ９００にインストールされて実行される。制御プログラムがコンピュータ９００等に働きかけて行わせる動作は、図１から図１６において説明したアプリケーション・サーバ４０における動作と同一であるから、説明を省略する。
【０１０３】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ９００に提供してもよい。
【０１０４】
以上、本実施形態に係る情報処理システム１０によれば、これまでの技術では対象にならなかった命令についても、データ先読みの対象とすることで、プログラムの実行効率を高めることができる。具体的には、まず、読み出すレコードが動的に決定されるプログラムについても、データ先読みの対象とすることができる。更に、ある繰返し処理がその直前の繰返し処理のみならずそれ以上前の繰返し処理の結果に依存するプログラムについても、データ先読みの対象とすることができる。実際に第１例のプログラムを用いて実験した結果、従来よりも３０倍程度の実行効率化が実現されることが確かめられた。
【０１０５】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【０１０６】
【図１】図１は、本発明の実施形態に係る情報処理システム１０の全体構成を示す。
【図２】図２は、アプリケーション・サーバ４０に入力される対象プログラム２０の第１例を示す。
【図３】図３は、データベース３５のうち第１例の対象プログラム２０の実行に必要なデータの一例を示す。
【図４】図４は、本発明の実施形態に係るアプリケーション・サーバ４０の機能構成を示す。
【図５】図５は、本発明の実施形態において対象プログラム２０を解析して必要なデータを先読みする処理の一例を示す。
【図６】図６は、図５のＳ５１０における処理の概要を示す。
【図７】図７は、図５のＳ５２０における処理の概要を示す。
【図８】図８は、雛形命令８０、第１例の対象プログラム２０に基づき生成される再帰アクセス命令８２、および、改良アクセス命令８４を対比して示す。
【図９】図９は、アプリケーション・サーバ４０に入力される対象プログラム２０の第２例を示す。
【図１０】図１０は、データベース３５のうち第２例の対象プログラム２０の実行に必要なデータの一例を示す。
【図１１】図１１は、第２例のプログラムの解析に必要な追加テーブルを示す。
【図１２】図１２は、第２例の対象プログラム２０に基づき生成される再帰アクセス命令８２の具体例を示す。
【図１３】図１３は、アプリケーション・サーバ４０に入力される対象プログラム２０の第３例を示す。
【図１４】図１４は、データベース３５のうち第３例の対象プログラム２０の実行に必要なデータの一例を示す。
【図１５】図１５は、第３例の対象プログラム２０に基づき生成される再帰アクセス命令８２の具体例を示す。
【図１６】図１６は、再帰アクセス命令８２の変形例である改良アクセス命令８４を示す。
【図１７】図１７は、本発明の実施形態に係るアプリケーション・サーバ４０として機能するコンピュータ９００のハードウェア構成の一例を示す。
【符号の説明】
【０１０７】
１０  情報処理システム
１５  端末装置
２０  対象プログラム
３０  データベース装置
３５  データベース
４０  アプリケーション・サーバ
４２  プログラム解析部
４５  プログラム実行部
４８  キャッシュ部
８０  雛形命令
８２  再帰アクセス命令
８４  改良アクセス命令
４００  取得部
４１０  命令検出部
４２０  第１算出式検出部
４３０  第２算出式検出部
４４０  カラム数設定部
４５０  初期照会命令生成部
４６０  再帰照会命令生成部
４７０  最終照会命令生成部
９００  コンピュータ
【図１】
2007179161.tif 000003
【図２】
2007179161.tif 000004
【図３】
2007179161.tif 000005
【図４】
2007179161.tif 000006
【図５】
2007179161.tif 000007
【図６】
2007179161.tif 000008
【図７】
2007179161.tif 000009
【図８】
2007179161.tif 000010
【図９】
2007179161.tif 000011
【図１０】
2007179161.tif 000012
【図１１】
2007179161.tif 000013
【図１２】
2007179161.tif 000014
【図１３】
2007179161.tif 000015
【図１４】
2007179161.tif 000016
【図１５】
2007179161.tif 000017
【図１６】
2007179161.tif 000018
【図１７】
2007179161.tif 000019