(57)【要約】【課題】ＤＢに対する検索処理を実行した実行結果に基づいて生成されるデータ群をＤＢに格納する際にＤＢを分割した記憶領域を効率的に使用すること。【解決手段】コア＃１は、（５）で示すように、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１の格納処理１１３を実行する前に、パーティションｐｔ１内のページｐｇ１に対するトランザクションロックを獲得する。また、コア＃１は、（６）で示すように、ページｐｇ１に対するメンバ間ロックを獲得する。コア＃１は、ページｐｇ１に対するトランザクションロックとメンバ間ロックとを獲得できたため、（７）で示すように、格納処理１１３を検索処理１１２と同一のトランザクションに含まれる処理として実行する。コア＃２も、（１０）で示すように、ページｐｇ１に対するトランザクションロックとメンバ間ロックとを獲得できた場合、格納処理１１３を検索処理１１２と同一のトランザクションに含まれる処理として実行する。【選択図】図１
2017126173.tif 000002
【特許請求の範囲】
【請求項１】
データベースにアクセス可能な複数のプロセッサに含まれるプロセッサに、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータが前記プロセッサに割り当てられたことに応じて、前記データを取得し、
前記データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
処理を実行させることを特徴とするデータベース制御プログラム。
【請求項２】
前記第２のロックを獲得する処理は、
前記第１のロックを獲得した後に、前記第２のロックを獲得する、
ことを特徴とする請求項１に記載のデータベース制御プログラム。
【請求項３】
前記データベースが複数の記憶領域に分割されており、
前記プロセッサに、
前記複数の記憶領域のうち、前記割当先プロセッサのうちのいずれかのプロセッサにより前記第１のロックが獲得されており、かつ、前記第２のロックが獲得されていない記憶領域を特定する、処理を実行させ、
前記第２のロックを獲得する処理は、
特定した前記記憶領域に対する第２のロックを獲得する、
ことを特徴とする請求項１または２に記載のデータベース制御プログラム。
【請求項４】
前記特定する処理は、
前記割当先プロセッサのうちのいずれかのプロセッサにより前記第１のロックが獲得されており、かつ、前記第２のロックが獲得されていない記憶領域が２以上ある場合、前記２以上の記憶領域のうち、前記検索処理を実行した際に少なくともいずれかの記憶領域よりも先に検索された記憶領域を特定する、
ことを特徴とする請求項３に記載のデータベース制御プログラム。
【請求項５】
コンピュータに、
データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記データベースにアクセス可能な複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記トランザクションが終了するまでの間の前記データベースのいずれかの記憶領域に対するアクセスを前記割当先プロセッサについて選択的に許容する第１のロックと前記データを割り当てたプロセッサが前記いずれかの記憶領域に前記データを格納する格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックとを獲得してから前記格納処理を前記トランザクションに含まれる処理として実行する要求を送信する、
処理を実行させることを特徴とするデータベース制御プログラム。
【請求項６】
前記いずれかのプロセッサに、
前記割当先プロセッサの全てが前記格納処理を終了させた場合、前記第１のロックを解放する、
処理を実行させることを特徴とする請求項５に記載のデータベース制御プログラム。
【請求項７】
データベースにアクセス可能な複数のプロセッサを有するデータベース制御装置であって、
前記複数のプロセッサに含まれるプロセッサは、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータが前記プロセッサに割り当てられたことに応じて、前記データを取得し、
前記データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
ことを特徴とするデータベース制御装置。
【請求項８】
データベースにアクセス可能な複数のプロセッサを有するデータベース制御装置であって、
前記複数のプロセッサのいずれかのプロセッサは、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記トランザクションが終了するまでの間の前記データベースのいずれかの記憶領域に対するアクセスを前記割当先プロセッサについて選択的に許容する第１のロックと前記データを割り当てたプロセッサが前記いずれかの記憶領域に前記データを格納する格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックとを獲得してから前記格納処理を前記トランザクションに含まれる処理として実行する要求を送信する、
ことを特徴とするデータベース制御装置。
【請求項９】
データベースにアクセス可能な複数のプロセッサに含まれるプロセッサが、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータが前記プロセッサに割り当てられたことに応じて、前記データを取得し、
前記データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
処理を実行することを特徴とするデータベース制御方法。
【請求項１０】
コンピュータが、
データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記データベースにアクセス可能な複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記トランザクションが終了するまでの間の前記データベースのいずれかの記憶領域に対するアクセスを前記割当先プロセッサについて選択的に許容する第１のロックと前記データを割り当てたプロセッサが前記いずれかの記憶領域に前記データを格納する格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックとを獲得してから前記格納処理を前記トランザクションに含まれる処理として実行する要求を送信する、
処理を実行することを特徴とするデータベース制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベース制御プログラム、データベース制御装置、およびデータベース制御方法に関する。
【背景技術】
【０００２】
従来、データベース（ＤＢ：ＤａｔａＢａｓｅ）に対する検索処理を実行した実行結果に基づいて生成されるデータ群をデータベースに格納することを示す命令がある。関連する先行技術として、例えば、トランザクションがファイル上のＤＢへのレコード追加指示を含む時トランザクションごとに設けるバッファにレコードを追加し、トランザクションの正常終了指示によりバッファ内のレコードをＤＢに追加するものがある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平２−１３８６４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来技術において、ＤＢに対する検索処理を実行した実行結果に基づいて生成されるデータ群をＤＢに格納する際に、ＤＢを分割した記憶領域が十分に使用されない場合がある。例えば、複数のプロセッサの各プロセッサが格納処理を並列に実行する場合に、整合性を保つために、各プロセッサは、分割した各記憶領域にロックを獲得してから格納処理を行う。ここで、あるプロセッサが、ある記憶領域に対して格納処理を継続する間、他のプロセッサは、ある記憶領域に格納処理を行うことができないため、別の記憶領域に対してロックを獲得してから格納処理を行うようになる。このように、各プロセッサが、それぞれ異なる記憶領域に対して格納処理を行うため、記憶領域のほとんどが空き領域となってしまい、記憶領域が十分に使用されなくなる。
【０００５】
１つの側面では、本発明は、ＤＢに対する検索処理を実行した実行結果に基づいて生成されるデータ群をＤＢに格納する際にＤＢを分割した記憶領域を効率的に使用することができるデータベース制御プログラム、データベース制御装置、およびデータベース制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一態様によれば、データベースにアクセス可能な複数のプロセッサに含まれるプロセッサに、データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータがプロセッサに割り当てられたことに応じて、データを取得し、データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、トランザクションが終了するまでの間のいずれかの記憶領域に対するアクセスをデータ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、プロセッサが格納処理を終了するまで専有するいずれかの記憶領域に対する第２のロックを獲得し、第１のロックと第２のロックとを獲得した場合、格納処理をトランザクションに含まれる処理として実行するデータベース制御プログラム、データベース制御装置、およびデータベース制御方法が提案される。
【０００７】
本発明の他の態様によれば、データベースにアクセス可能な複数のプロセッサのいずれかのプロセッサに、データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、複数のプロセッサのいずれかに割り当て、複数のプロセッサのうちのデータ群のそれぞれのデータを割り当てた割当先プロセッサに、トランザクションが終了するまでの間のデータベースのいずれかの記憶領域に対するアクセスを割当先プロセッサについて選択的に許容する第１のロックとデータを割り当てたプロセッサがいずれかの記憶領域にデータを格納する格納処理を終了するまで専有するいずれかの記憶領域に対する第２のロックとを獲得してから格納処理をトランザクションに含まれる処理として実行する要求を送信するデータベース制御プログラム、データベース制御装置、およびデータベース制御方法が提案される。
【発明の効果】
【０００８】
本発明の一側面によれば、ＤＢに対する検索処理を実行した実行結果に基づいて生成されるデータ群をＤＢに格納する際にＤＢを分割した記憶領域を効率的に使用することができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施の形態にかかるデータベース制御装置１０１の動作例を示す説明図である。
【図２】図２は、ＤＢ管理システム２００の構成例を示す説明図である。
【図３】図３は、データベース制御装置１０１のハードウェア構成例を示す説明図である。
【図４】図４は、データベース制御装置１０１の機能構成例を示す説明図である。
【図５】図５は、リーダ実行体ｌｄとメンバ実行体ｍｍとの動作例の一例を示す説明図（その１）である。
【図６】図６は、リーダ実行体ｌｄとメンバ実行体ｍｍとの動作例の一例を示す説明図（その２）である。
【図７】図７は、ページの格納例を示す説明図である。
【図８】図８は、２種類のロックを用いた格納シーケンスの一例を示す説明図である。
【図９】図９は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その１）である。
【図１０】図１０は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その２）である。
【図１１】図１１は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その３）である。
【図１２】図１２は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その４）である。
【図１３】図１３は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理手順の一例を示すフローチャート（その１）である。
【図１４】図１４は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理手順の一例を示すフローチャート（その２）である。
【図１５】図１５は、ページ格納処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、開示のデータベース制御プログラム、データベース制御装置、およびデータベース制御方法の実施の形態を詳細に説明する。
【００１１】
図１は、本実施の形態にかかるデータベース制御装置１０１の動作例を示す説明図である。図１に示すデータベース制御装置１０１は、ＤＢ１０２を制御するコンピュータである。データベース制御装置１０１は、例えば、ＤＢ１０２を有するＤＢサーバでもよいし、ＤＢ１０２を有するコンピュータにアクセス可能なコンピュータでもよい。
【００１２】
ＤＢ１０２は、一定の形式で作成、管理されたデータの集合である。例えば、ＤＢ１０２は、データベース制御装置１０１にアクセスするユーザの顧客データや売上データ等を、一定の形式で管理する。そして、データベース制御装置１０１は、ユーザが操作する端末からの命令に応じて、ＤＢ１０２に対する検索処理を実行したり、ＤＢ１０２に対する格納処理を実行したりする。
【００１３】
また、ＤＢ１０２は、複数の記憶領域に分割されることがある。分割された記憶領域は、「パーティション」と呼ばれる。パーティションに分割することにより、ＤＢ１０２の性能や管理のし易さを向上させることができる。例えば、ＤＢ１０２の管理者は、データの集合を垂直方向のカラムと水平方向のレコードとで表したテーブルを、１つのパーティションに記憶するようにＤＢ１０２を設計してもよい。または、ＤＢ１０２の管理者は、１つのテーブルに含まれる各レコードを、レコードキーの値で分類し、分類した各グループをそれぞれ別のパーティションに記憶するようにＤＢ１０２を設計してもよい。図１の例では、ＤＢ１０２は、パーティションｐｔ１、ｐｔ２に分割されている。
【００１４】
さらに、パーティションは、複数の記憶領域に分割されることがある。分割された記憶領域は、「ページ」と呼ばれる。ページに分割することにより、パーティションへの格納を効率よくすることができる。例えば、記憶内容の整合性を保つために行うロックをページ単位で行うことにより、１つのパーティションに対するデータの格納を、複数のプロセッサが同時に行うことができる。ロックとは、記憶内容の整合性を保つために行う排他制御のことである。図１の例では、パーティションｐｔ１は、ページｐｇ１、ｐｇ２に分割されている。
【００１５】
また、ユーザが操作する端末からの命令は、データの操作や定義を行う問い合わせ言語の仕様に従ったデータである。問い合わせ言語としては、例えば、ＳＱＬが挙げられる。以下の記載では、ユーザが操作する端末からの命令を、ＳＱＬとして説明する。例えば、検索処理を行うＳＱＬは、ＳＥＬＥＣＴ句から始まる構文となっており、ＳＥＬＥＣＴ文と呼ばれる。また、格納処理を行うＳＱＬは、ＩＮＳＥＲＴ句から始まる構文となっており、ＩＮＳＥＲＴ文と呼ばれる。
【００１６】
ＳＱＬの仕様の中には、ＤＢ１０２に対する検索処理を実行した実行結果に基づいて生成されるデータ群をＤＢ１０２に格納することを示す構文がある。この構文に従ったＳＱＬを実行することにより、ＤＢ１０２に格納されたデータを加工したデータを、ＤＢ１０２に格納することができる。このＳＱＬは、ＩＮＳＥＲＴ句から始まり、途中でＳＥＬＥＣＴ句が含まれる構文となっており、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文と呼ばれる。
【００１７】
ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文を行うと、データベース制御装置１０１は、ＳＥＬＥＣＴ句以降のＦＲＯＭ句で指定されたテーブルからＷＨＥＲＥ句で指定された条件に従ってレコードを検索する。そして、データベース制御装置１０１は、条件を満たしたレコード群に基づいて、ＳＥＬＥＣＴ句で指定された検索元のテーブルの列名や、算術演算子、グループ関数等の指定によって新たなレコード群を生成する。そして、データベース制御装置１０１は、生成されるレコード群を、ＩＮＳＥＲＴ句で指定されたテーブルに格納する。
【００１８】
しかしながら、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文に従った処理を行う場合、ページが十分に使用されない場合がある。具体的には、整合性を保つために、生成されるレコード群が割り当てられた割当先プロセッサの各プロセッサは、分割した各ページにロックを獲得してから格納処理を行う。すると、割当先プロセッサのうちのあるプロセッサが、あるページに対して格納処理を継続する間、他のプロセッサは、あるページに格納処理を行うことができないため、別のページに対してロックを獲得してから格納処理を行うようになる。このように、各プロセッサが、それぞれ異なるページに対して格納処理を行うため、ページのほとんどが空き領域となってしまい、ページが十分に使用されなくなる。以下、ページの記憶容量が使用されている割合を、「格納効率」と呼称する。ページのほとんどが空き領域となる状態は、格納効率が低い状態である。
【００１９】
また、あるプロセッサが、一つのレコードを格納した際に、あるページのロックを一旦解放するようにすると、他のトランザクションによってあるページにレコードの格納が行われる可能性がある。同一のトランザクションによるレコードは、同一のページに格納することが好ましく、他のトランザクションに割り込まれることは好ましくない。
【００２０】
そこで、本実施の形態では、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文について、いずれかのページに対する第１のロックと第２のロックとを獲得してから、いずれかのページにレコードを格納する方法について説明する。ここで、第１のロックは、トランザクションが終了するまでの間のいずれかのページに対するアクセスを割当先プロセッサについて選択的に許容するロックである。第２のロックは、各プロセッサが格納処理を終了するまで専有するロックである。以下、第１のロックを、「トランザクションロック」と呼ぶ。また、第２のロックを、「メンバ間ロック」と呼ぶ。
【００２１】
図１を用いて、データベース制御装置１０１の動作例について説明する。データベース制御装置１０１は、複数のプロセッサとして、１つのプロセッサ・パッケージ内に複数のプロセッサコアを有する。または、データベース制御装置１０１は、複数のプロセッサコアの代わりに、複数のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を有してもよい。以下の記載では、プロセッサコアを、「コア」と称する。
【００２２】
図１の（１）で示すように、データベース制御装置１０１に含まれる複数のコアのうちのいずれかのコアとして、コア＃０は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１を受け付ける。例えば、コア＃０は、クライアント端末、Ｗｅｂサーバ等からＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１を受け付ける。または、コア＃０は、ストアドプロシージャを実行することにより、実行するストアドプロシージャに含まれるＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１を取得してもよい。ここで、ストアドプロシージャは、ＤＢ１０２に対する一連の処理手続きを１つのプログラムとして、ＤＢ１０２に保存されたプログラムである。
【００２３】
そして、図１の（２）で示すように、コア＃０は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１のＳＥＬＥＣＴ句に従って検索処理１１２を実行し、検索処理１１２を実行した実行結果に基づいてレコード群ｒｄ１、ｒｄ２を生成する。また、コア＃０は、検索処理１１２を自身で行わず、他のコアが検索処理を実行した実行結果を他のコアから取得して、取得した実行結果に基づいてレコード群ｒｄ１、ｒｄ２を生成してもよい。または、コア＃０は、検索処理１１２および実行結果からのレコード群の生成を自身で行わず、他のコアが生成したレコード群ｒｄ１、ｒｄ２を取得してもよい。
【００２４】
次に、図１の（３）で示すように、コア＃０は、レコード群ｒｄ１、ｒｄ２のそれぞれを、複数のコアのいずれかに割り当てる。図１の例では、コア＃０は、レコードｒｄ１をコア＃１に割り当てるとともに、レコードｒｄ２をコア＃２に割り当てる。また、コア＃０は、自身にレコードを割り当ててもよい。
【００２５】
そして、図１の（４）で示すように、コア＃０は、レコード群ｒｄを割り当てる割当先コアとなるコア＃１、＃２に、割当先コアに割り当てたレコードをＤＢ１０２に格納する格納処理１１３を実行する要求を送信する。ここで、コア＃０は、検索処理１１２を同一のトランザクションに含まれる処理として実行するようにコア＃１、＃２に要求する。トランザクションとは、複数の処理を、一体不可分の処理として扱う方式のことである。図１では、同一のトランザクションとして扱う処理群を、破線で囲ってある。
【００２６】
要求を受信したコア＃１、＃２は、それぞれ、レコードｒｄ１、ｒｄ２を、パーティションｐｔ１に格納するものとし、図１の例では、コア＃１がコア＃２より先に格納処理１１３を実行するものとする。図１の（５）で示すように、コア＃１は、パーティションｐｔ１内のいずれかのページとして、ページｐｇ１に対するトランザクションロックを獲得する。ここで、トランザクションロックを獲得するページは、他のトランザクションによるトランザクションロックが獲得されていないページであれば、どのページでもよい。例えば、コア＃１は、ページ番号の小さい順に、トランザクションロックが獲得されていないページを探索する。
【００２７】
図１の例では、コア＃１が、ページｐｇ１に対するトランザクションロックを獲得できたものとする。そして、図１では、トランザクションロックを、ページを囲む破線として表す。
【００２８】
次に、コア＃１は、図１の（６）で示すように、ページｐｇ１に対するメンバ間ロックを獲得する。図１の例では、コア＃１が、ページｐｇ１に対するメンバ間ロックを獲得できたものとする。そして、図１では、メンバ間ロックを、ページの枠を太線にすることで表す。
【００２９】
そして、コア＃１は、ページｐｇ１に対するトランザクションロックとメンバ間ロックとを獲得できたため、図１の（７）で示すように、格納処理１１３を、検索処理１１２と同一のトランザクションに含まれる処理として実行する。具体的には、コア＃１は、格納処理１１３として、レコードｒｄ１をページｐｇ１に格納する。格納終了後、コア＃１は、ページｐｇ１に対するメンバ間ロックを解放する。一方、コア＃１は、トランザクションロックを獲得し続ける。
【００３０】
図１の例では、コア＃１の格納処理１１３が終了した後に、コア＃２が格納処理１１３を開始するものとする。図１の（８）で示すように、コア＃２は、パーティションｐｔ１内のいずれかのページとして、ページｐｇ１に対するトランザクションロックを獲得しようとする。図１の例では、ページｐｇ１に対しては、同一トランザクションとなる格納処理を実行したコア＃１によって、自トランザクションのトランザクションロックが既に獲得されている。従って、コア＃２は、トランザクションロックが獲得できたものとして、そのまま次の処理に進む。
【００３１】
図１の（９）で示すように、コア＃２は、ページｐｇ１に対するメンバ間ロックを獲得する。この例では、コア＃１の格納処理１１３が終了した後であるため、コア＃２は、ページｐｇ１に対するメンバ間ロックを獲得する。なお、コア＃１が格納処理１１３を実行中に、コア＃２がページｐｇ１に対するメンバ間ロックを獲得しようとした場合、獲得に失敗するため、コア＃２は、ページｐｇ１とは別のページに対してトランザクションロックとメンバ間ロックとを獲得することを試みる。
【００３２】
そして、コア＃１は、ページｐｇ１に対するトランザクションロックとメンバ間ロックとを獲得できたため、図１の（１０）で示すように、格納処理１１３を、検索処理１１２と同一のトランザクションに含まれる処理として実行する。具体的には、コア＃２は、格納処理１１３として、レコードｒｄ２をページｐｇ１に格納する。格納終了後、コア＃２は、ページｐｇ１に対するメンバ間ロックを解放する。
【００３３】
以上により、データベース制御装置１０１は、ページｐｇ１にレコードｒｄ１、２が格納されているように、同一のトランザクションのレコードを同じページに格納することができ、ページの格納効率を向上させることができる。また、データベース制御装置１０１は、他のトランザクションによる格納処理との競合時には、トランザクションロックが獲得されたページには格納処理をさせないようにすることができる。次に、データベース制御装置１０１をＤＢ管理システムのＤＢサーバとして適用した例を、図２を用いて説明する。
【００３４】
図２は、ＤＢ管理システム２００の構成例を示す説明図である。ＤＢ管理システム２００は、データベース制御装置１０１と、クライアント端末２０１とを含む。ＤＢ管理システム２００は、ＤＢを管理し、ＤＢに対するアクセスに応答するシステムである。データベース制御装置１０１は、図１に示したデータベース制御装置１０１に相当する。データベース制御装置１０１と、クライアント端末２０１とは、ネットワーク２０２により接続される。
【００３５】
データベース制御装置１０１は、ＤＢ管理システム２００を管理するコンピュータである。クライアント端末２０１は、データベース制御装置１０１にアクセスするコンピュータである。また、ＤＢ管理システム２００は、図２で示した構成に限らない。例えば、ＤＢ管理システム２００は、Ｗｅｂサーバを有し、データベース制御装置１０１は、ＷｅｂサーバからＤＢに対するアクセスを受け付けてもよい。
【００３６】
（データベース制御装置１０１のハードウェア構成）
図３は、データベース制御装置１０１のハードウェア構成例を示す説明図である。図３において、データベース制御装置１０１は、ＣＰＵ３０１と、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、を含む。また、データベース制御装置１０１は、ディスクドライブ３０４およびディスク３０５と、通信インターフェース３０６と、を含む。また、ＣＰＵ３０１〜ディスクドライブ３０４、通信インターフェース３０６はバス３０７によってそれぞれ接続される。ここで、ディスク３０５が、図１で示したＤＢ１０２に相当する。また、データベース制御装置１０１は、通信インターフェース３０６を経由して、外部の装置となるＤＢ１０２に接続してもよい。
【００３７】
ＣＰＵ３０１は、データベース制御装置１０１の全体の制御を司る演算処理装置である。そして、ＣＰＵ３０１は、複数のコアを有する。
【００３８】
ＲＯＭ３０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ３０３は、ＣＰＵ３０１のワークエリアとして使用される揮発性メモリである。
【００３９】
ディスクドライブ３０４は、ＣＰＵ３０１の制御に従ってディスク３０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ３０４には、例えば、磁気ディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク３０５は、ディスクドライブ３０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ３０４が磁気ディスクドライブである場合、ディスク３０５には、磁気ディスクを採用することができる。また、ディスクドライブ３０４が光ディスクドライブである場合、ディスク３０５には、光ディスクを採用することができる。また、ディスクドライブ３０４がソリッドステートドライブである場合、ディスク３０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００４０】
通信インターフェース３０６は、ネットワーク２０２と内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース３０６は、通信回線を通じてネットワーク２０２を介して他の装置に接続される。通信インターフェース３０６には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００４１】
また、ＤＢ管理システム２００の管理者が、データベース制御装置１０１を直接操作する場合、データベース制御装置１０１は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。また、図示していないが、クライアント端末２０１も、データベース制御装置１０１が有するハードウェアと、ディスプレイ、キーボード、マウスといったハードウェアとを有する。
【００４２】
（データベース制御装置１０１の機能構成例）
図４は、データベース制御装置１０１の機能構成例を示す説明図である。データベース制御装置１０１は、検索処理実行部４０１と、割当部４０２と、送信部４０３と、解放部４０４と、取得部４０５と、第１獲得部４０６と、特定部４０７と、第２獲得部４０８と、格納処理実行部４０９とを含む。制御部となる検索処理実行部４０１〜格納処理実行部４０９は、記憶装置に記憶されたプログラムをＣＰＵ３０１の各コアが実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、ディスク３０５などである。また、各部の処理結果は、ＣＰＵ３０１の各コアのレジスタや、ＣＰＵ３０１各コアのキャッシュメモリ、ＲＡＭ３０３等に格納される。
【００４３】
また、検索処理実行部４０１〜解放部４０４は、リーダ実行体ｌｄに含まれる。これに対し、取得部４０５〜格納処理実行部４０９は、メンバ実行体ｍｍに含まれる。リーダ実行体ｌｄは、ＳＥＬＥＣＴ句の指定による検索処理を行い、パーティションに格納するレコードを分配する。また、メンバ実行体ｍｍは、分配されたレコードをパーティションのページに格納する。検索処理実行部４０１〜格納処理実行部４０９は、データベース制御装置１０１の各コアが有しており、どのコアがリーダ実行体ｌｄを実行してもよいし、どのコアがメンバ実行体ｍｍを実行してもよい。また、リーダ実行体ｌｄを実行するコアが、メンバ実行体ｍｍを実行してもよい。図４の例では、コア＃０がリーダ実行体ｌｄを実行し、コア＃１、＃２がメンバ実行体ｍｍを実行する例を示す。
【００４４】
検索処理実行部４０１は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１を受け付けたことに応じて、ＳＥＬＥＣＴ句に対応する検索処理１１２をトランザクションに含まれる処理として実行する。または、検索処理実行部４０１は、ＤＢ１０２に記憶されたストアドプロシージャが実行されたことにより、ストアドプロシージャに含まれるＩＮＳＥＲＴ  ＳＥＬＥＣＴ文を取得した際に、検索処理１１２をトランザクションに含まれる処理として実行してもよい。
【００４５】
割当部４０２は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１内のＳＥＬＥＣＴ句の実行結果となるレコード群のそれぞれを、複数のコアのいずれかに割り当てる。具体的には、割当部４０２は、割当先コアに対応するバッファを確保し、バッファにレコードを分散して格納していくことにより、レコード群のそれぞれを、複数のコアのいずれかに割り当てる。図４の例では、割当部４０２は、コア＃１に割り当てるレコードをバッファｂ１に格納し、コア＃２に割り当てるレコードを、バッファｂ２に格納する。
【００４６】
送信部４０３は、複数のプロセッサのうちのレコード群のそれぞれのデータを割り当てた割当先コアに、格納処理１１３を検索処理１１２のトランザクションに含まれる処理として実行する要求を送信する。この場合には、要求を受け付けた割当先コアは、該当するプログラムコードを読み込むことにより、トランザクションロックとメンバ間ロックとを獲得してから格納処理１１３を実行することを予め把握しているものとする。また、送信部４０３は、トランザクションロックとメンバ間ロックとを獲得してから格納処理１１３を検索処理１１２のトランザクションに含まれる処理として実行する要求を送信してもよい。
【００４７】
解放部４０４は、割当先コアの全てが格納処理１１３を終了させた場合、トランザクションロックを解放する。例えば、解放部４０４は、割当先コアの全てから格納処理１１３が終了したことの通知を受けた場合に、トランザクションロックを解放する。
【００４８】
取得部４０５は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文１１１内のＳＥＬＥＣＴ句の実行結果となるレコード群のそれぞれが複数のコアのいずれかに割り当てられたことに応じて、各コアに割り当てられたレコードを取得する。具体的には、取得部４０５は、各コアに対応するバッファから、各コアに割り当てられたレコードを取得する。図４の例では、コア＃１の取得部４０５は、バッファｂ１からレコードを取得し、コア＃２の取得部４０５は、バッファｂ２からレコードを取得する。
【００４９】
第１獲得部４０６は、格納対象となるいずれかのページに取得したレコードを格納する格納処理１１３を実行する前に、格納対象となるいずれかのページに対するトランザクションロックを獲得する。
【００５０】
特定部４０７は、割当先コアのうちのいずれかのコアによりトランザクションロックが獲得されており、かつ、メンバ間ロックが獲得されていないページを特定する。例えば、メンバ実行体ｍｍが、ページ番号の小さい順からページからトランザクションロックを獲得するという仕様にしておく。そして、特定部４０７は、ページ番号の小さい順からページを探索し、自トランザクションによるトランザクションロックが獲得されており、かつ、メンバ間ロックが獲得されていないページを特定する。
【００５１】
また、割当先コアのうちのいずれかのコアによりトランザクションロックが獲得されており、かつ、メンバ間ロックが獲得されていないページが２以上あるとする。この場合、特定部４０７は、２以上のページのうち、検索処理１１２を実行した際に少なくともいずれかのページよりも先に検索されたページを特定する。例えば、特定部４０７は、２以上のページのうち、１番先に検索されたページを特定する。
【００５２】
第２獲得部４０８は、いずれかのページに対するメンバ間ロックを獲得する。また、第２獲得部４０８は、第１獲得部４０６がトランザクションロックを獲得した後に、メンバ間ロックを獲得してもよい。また、第２獲得部４０８は、特定部４０７が特定したページに対するメンバ間ロックを獲得してもよい。
【００５３】
格納処理実行部４０９は、第１獲得部４０６と第２獲得部４０８とがいずれかのページに対するトランザクションロックとメンバ間ロックとを獲得した場合、格納処理１１３を、検索処理１１２のトランザクションに含まれる処理として実行する。図４の例では、コア＃１の格納処理実行部４０９は、格納処理１１３として、取得したレコードをパーティションｐｔ１のページに格納したり、パーティションｐｔ２のページに格納したりする。取得したレコードをどのパーティションに格納するかについての一例は、図６で説明する。次に、リーダ実行体ｌｄとメンバ実行体ｍｍとの動作例を、図５、図６を用いて説明する。
【００５４】
図５は、リーダ実行体ｌｄとメンバ実行体ｍｍとの動作例の一例を示す説明図（その１）である。図６は、リーダ実行体ｌｄとメンバ実行体ｍｍとの動作例の一例を示す説明図（その２）である。図５、図６では、パーティションの数が３であり、ＣＰＵ３０１のコアの数が３以上あるものとし、メンバ実行体ｍｍを３つ生成するものとする。
【００５５】
図５、図６では、図５で示すＳＱＬ１をデータベース制御装置１０１がクライアント端末２０１から受け付けたとする。ＳＱＬ１の内容は、「ＩＮＳＥＲＴ  ＩＮＴＯ  Ｔ４  〜  ＳＥＬＥＣＴ  〜  ＦＲＯＭ    （ＳＥＬＥＣＴ  〜  ＦＲＯＭ  Ｔ１，Ｔ２）  Ａ  ＬＥＦＴ  ＯＵＴＥＲ  ＪＯＩＮ  〜  Ｔ３  〜」である。ここで、ＳＱＬ１は、テーブルＴ１、Ｔ２に対して図５のＳＥＬＥＣＴ句５０２を行った結果を軸にして、テーブルＴ３を外部結合し、結合して得られたデータに対してＳＥＬＥＣＴ句５０１を行った結果を、テーブルＴ４に格納することを示すＳＱＬである。
【００５６】
リーダ実行体ｌｄは、図５に示す（ｌｄ−１）のＳＥＬＥＣＴの処理として、テーブルＴ１のデータを記憶するパーティションｐｔ１＿１、１＿２、１＿３からスキャンして、条件に一致するレコードを生成する。このとき、リーダ実行体ｌｄは、パーティションｐｔ１＿１、１＿２、１＿３から並列にスキャンする。リーダ実行体ｌｄは、生成したデータを、ソートし、ソート結果ｓｔ１に格納する。リーダ実行体ｌｄは、図５に示す（ｌｄ−２）のＳＥＬＥＣＴの処理についても図５に示す（ｌｄ−１）のＳＥＬＥＣＴの処理と同様に処理を行い、実行結果を、ソート結果ｓｔ２に格納する。
【００５７】
次に、リーダ実行体ｌｄは、図５に示す（ｌｄ−３）の処理として、Ｔ１の結果とＴ２の結果とをＪＯＩＮする。リーダ実行体ｌｄは、ＪＯＩＮした結果を、ソート結果ｓｔ３に格納する。そして、リーダ実行体ｌｄは、図５に示す（ｌｄ−４）のＳＥＬＥＣＴの処理についても図５に示す（ｌｄ−１）のＳＥＬＥＣＴの処理と同様に処理を行い、実行結果を、ソート結果ｓｔ４に格納する。
【００５８】
そして、リーダ実行体ｌｄは、図５に示す（ｌｄ−５）の処理として、（ｌｄ−３）、（ｌｄ−４）の実行結果をＪＯＩＮしながら、Ｔ４に並列にＩＮＳＥＲＴを行う。具体的には、リーダ実行体ｌｄは、ＪＯＩＮしたレコードを、作業域ｗａ＿ｌｄに格納する。格納後の処理は、図６で示す。
【００５９】
図６において、リーダ実行体ｌｄは、３つのメンバ実行体ｍｍ１、ｍｍ２、ｍｍ３用のバッファｂ１、ｂ２、ｂ３に、作業域ｗａ＿ｌｄに格納されたレコードを蓄積し、メンバ実行体ｍｍ１〜３からの要求を待ち受ける。バッファｂ１、ｂ２、ｂ３は、リーダ実行体ｌｄによって、メンバ実行体ｍｍの数分用意されたものである。
【００６０】
具体的には、リーダ実行体ｌｄは、まず、バッファｂ１にレコードを蓄積する。そして、リーダ実行体ｌｄは、バッファｂ１に空き領域がなくなったら、バッファｂ２にレコードを蓄積する。さらに、リーダ実行体ｌｄは、バッファｂ２に空き領域がなくなったら、バッファｂ３にレコードを蓄積し、バッファｂ３に空き領域がなくなったら、バッファｂ１にレコードを蓄積する。リーダ実行体ｌｄは、これらの処理を、作業域ｗａ＿ｌｄに格納されたレコードがなくなるまで繰り返す。図６の例では、リーダ実行体ｌｄは、バッファｂ１にレコードｒｄ１、２を格納し、バッファｂ２にレコードｒｄ３、４を格納し、バッファｂ３にレコードｒｄ５、６を格納する。
【００６１】
次に、各メンバ実行体ｍｍの動作を説明する。メンバ実行体ｍｍ１〜ｍｍ３の動作は同一であるため、メンバ実行体ｍｍ１の動作を用いて説明する。メンバ実行体ｍｍ１は、図６に示す（ｍｍ−１）の処理として、リーダ実行体ｌｄに対してレコードが蓄積されたバッファを要求し、図６の例では、バッファｂ１からレコードを取得する。レコードの取得が終わると、メンバ実行体ｍｍ１は、リーダ実行体ｌｄに対して、バッファｂ１の解放を通知する。メンバ実行体ｍｍ１は、取得したレコードを、作業域ｗａ＿ｍｍ１に格納する。図６の例では、メンバ実行体ｍｍ１は、バッファｂ１から取得したレコードｒｄ１、２を、作業域ｗａ＿ｍｍ１に格納する。
【００６２】
そして、メンバ実行体ｍｍ１は、図６に示す（ｍｍ−２）の処理として、作業域ｗａ＿ｍｍ１に格納したレコードを、テーブルＴ４のデータを記憶するパーティションｐｔ４＿１、４＿２、４＿３のいずれかに格納する。例えば、メンバ実行体ｍｍ１は、レコードｒｄ１をパーティションｐｔ４＿１に格納するとともに、レコードｒｄ２をパーティションｐｔ４＿２に格納する。
【００６３】
ここで、どのパーティションに格納するかについて、各パーティションは、格納するレコードのキーに基づいて、記憶するレコードを分散させている。例えば、パーティションｐｔ４＿１はキーの値が「１」から「３」までのレコードを記憶し、パーティションｐｔ４＿２はキーの値が「４」から「６」までのレコードを記憶し、パーティションｐｔ４＿３はキーの値が「７」から「９」までのレコードを記憶する。メンバ実行体ｍｍ１は、格納しようとするキーの値を参照して、パーティションｐｔ４＿１、４＿２、４＿３のうち格納先のパーティションを決定する。次に、パーティションｐｔ内のページへの格納例について、図７を用いて説明する。
【００６４】
図７は、ページの格納例を示す説明図である。複数のメンバ実行体ｍｍが、同時に同一パーティションｐｔに対してレコードを格納する場合、あるメンバ実行体ｍｍは、他のメンバ実行体ｍｍが更新中のページと異なるページに対してレコードを格納するように制御する。これにより、データベース制御装置１０１は、メンバ実行体ｍｍ間で排他待ちにならないようにすることができる。
【００６５】
図７の例を用いて具体的に説明する。図７の例では、同一のトランザクションに含まれるメンバ実行体ｍｍ１、ｍｍ２、ｍｍ３が、パーティションｐｔ１に、それぞれ、レコードｒｄ１、ｒｄ２、ｒｄ３を格納するものとする。そして、パーティションｐｔ１には、ページｐｇ１、ｐｇ２、ｐｇ３、ｐｇ４…を含むとする。
【００６６】
まず、メンバ実行体ｍｍ１が、パーティションｐｔ１に含まれるいずれかのページにレコードｒｄ１を格納しようとする。図７の例では、メンバ実行体ｍｍ１は、空きページとして、ページｐｇ１にレコードｒｄ１を格納する。
【００６７】
続けて、メンバ実行体ｍｍ１がページｐｇ１の更新中に、メンバ実行体ｍｍ２が、パーティションｐｔ１に含まれるいずれかのページにレコードｒｄ２を格納しようとしたとする。このとき、ページｐｇ１は、メンバ実行体ｍｍ１によって更新中であるため、メンバ実行体ｍｍ２は、空きページとして、ページｐｇ２にレコードｒｄ２を格納する。
【００６８】
さらに、メンバ実行体ｍｍ１がページｐｇ１の更新中であり、かつ、メンバ実行体ｍｍ２がページｐｇ２の更新中に、メンバ実行体ｍｍ３がパーティションｐｔ１のいずれかのページにレコードｒｄ３を格納しようとする。このとき、ページｐｇ１はメンバ実行体ｍｍ１によって更新中であり、ページｐｇ２はメンバ実行体ｍｍ２によって更新中であるため、メンバ実行体ｍｍ３が、空きページとして、ページｐｇ３にレコードｒｄ３を格納する。
【００６９】
ここで、図７の例では、パーティションｐｔ１内の各ページの最大の記憶容量に対して、少量のレコードしか格納されていないという、すかすかなページが生成される場合がある。そこで、ページへの格納効率を向上させる格納例として、図１、図４で説明したトランザクションロックとメンバ間ロックという２種類のロックを用いて各ページに同一のトランザクションのレコードを集約させる例を、図８〜図１２を用いて説明する。図８では、２種類のロックを用いた格納シーケンスの一例について説明する。
【００７０】
図８は、２種類のロックを用いた格納シーケンスの一例を示す説明図である。図８の例では、同一のトランザクションとして、メンバ実行体ｍｍ１、ｍｍ２、ｍｍ３があるとする。そして、図８では、１つのトランザクションしかない場合を例として説明する。
【００７１】
メンバ実行体ｍｍ１は、パーティションｐｔ１のレコードｒｄ１＿１と、パーティションｐｔ２のレコード（不図示）と、パーティションｐｔ１のレコードｒｄ２＿２とを格納する処理を実行する。また、メンバ実行体ｍｍ２は、パーティションｐｔ１のレコードｒｄ２＿１と、パーティションｐｔ２のレコード（不図示）と、パーティションｐｔ１のレコードｒｄ１＿３とを格納する処理を実行する。また、メンバ実行体ｍｍ３は、パーティションｐｔ１のレコードｒｄ３＿１と、パーティションｐｔ２のレコードｒｄ１＿２と、パーティションｐｔ１のレコードｒｄ３＿２とを格納する処理を実行する。
【００７２】
期間８０１では、１つのパーティションｐｔ１に対してレコードを格納しているため、メンバ実行体ｍｍ１〜ｍｍ３は、パーティションｐｔ１のそれぞれ異なるページに格納する。具体的には、メンバ実行体ｍｍ１は、格納処理ｐｒ＿ｍｍ１＿１によって、レコードｒｄ１＿１をページｐｇ１に格納する。また、メンバ実行体ｍｍ２は、格納処理ｐｒ＿ｍｍ２＿１によって、レコードｒｄ２＿１をページｐｇ２に格納する。また、メンバ実行体ｍｍ３は、格納処理ｐｒ＿ｍｍ３＿１によって、レコードｒｄ３＿１をページｐｇ３に格納する。
【００７３】
次に、期間８０２では、メンバ実行体ｍｍ１、ｍｍ２がそれぞれ格納処理ｐｒ＿ｍｍ１＿２、格納処理ｐｒ＿ｍｍ２＿２によって、パーティションｐｔ２にレコードを格納しているため、メンバ実行体ｍｍ３は、パーティションｐｔ１のページｐｇ１に格納する。具体的には、メンバ実行体ｍｍ３は、格納処理ｐｒ＿ｍｍ３＿２によって、レコードｒｄ１＿２をページｐｇ１に格納する。
【００７４】
そして、期間８０３の先頭において、メンバ実行体ｍｍ３がページｐｇ１に対する格納処理ｐｒ＿ｍｍ３＿２を実行中であるため、メンバ実行体ｍｍ１は、格納処理ｐｒ＿ｍｍ１＿３によって、ページｐｇ１の次となるページｐｇ２にレコードｒｄ２＿２を格納する。また、期間８０３において、メンバ実行体ｍｍ２が格納処理ｐｒ＿ｍｍ２＿２を終了して格納処理ｐｒ＿ｍｍ２＿３を開始する際には、メンバ実行体ｍｍ３によるページｐｇ１に対する格納処理ｐｒ＿ｍｍ３＿２が完了している。従って、メンバ実行体ｍｍ２は、格納処理ｐｒ＿ｍｍ２＿３によって、レコードｒｄ１＿３をページｐｇ１に格納する。また、期間８０３において、メンバ実行体ｍｍ３は、格納処理ｐｒ＿ｍｍ３＿３によって、レコードｒｄ３＿２をページｐｇ３に格納する。
【００７５】
図８で示した結果、ページｐｇ１〜ｐｇ３に格納されたレコードは、３つ、２つ、２つとなりページ番号の小さい方に詰められることになる。次に、図９〜図１２を用いて、他トランザクションがある場合における２種類のロックを用いた格納例について説明する。
【００７６】
図９〜図１２では、データベース制御装置１０１は、トランザクションｔｒ１に含まれるメンバ実行体ｍｍ１〜ｍｍｎと、トランザクションｔｒ２に含まれるメンバ実行体ｍｍＡ〜ｍｍＣとを動作させるものとする。そして、メンバ実行体ｍｍ１〜ｍｍｎ、ｍｍＡ〜ｍｍＣは、それぞれ、レコードｒｄ１〜ｒｄｎ、ｒｄＡ〜ｒｄＣを、パーティションｐｔ１に格納するものとする。また、パーティションｐｔ１には、ページｐｇ１〜ｐｇｎを含むものとする。そして、各ページには、最大３つのレコードが格納できるものとする。また、各メンバ実行体は、ページｐｇ１から順に空きページを検索するものとする。
【００７７】
図９は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その１）である。図９に示す（１）の処理として、メンバ実行体ｍｍ１は、パーティションｐｔ１から、最初の空きページとなるページｐｇ１に対するトランザクションロックと、メンバ間ロックとを獲得する。ページｐｇ１に対するトランザクションロックと、メンバ間ロックとを獲得した後、メンバ実行体ｍｍ１は、ページｐｇ１にレコードｒｄ１を格納する。レコードｒｄ１の格納が終了した場合、メンバ実行体ｍｍ１は、ページｐｇ１に対するメンバ間ロックを解放する。一方、この時点では、ページｐｇ１に対するトランザクションロックについては解放せず、獲得したままとなる。
【００７８】
ここで、図９〜図１２では、トランザクションｔｒ１によるページに対するトランザクションロックを、ページを囲む破線として表す。これに対し、トランザクションｔｒ２によるページに対するトランザクションロックを、ページを囲む一点鎖線として示す。また、ページに対するメンバ間ロックを、ページの枠を太線にすることで示す。
【００７９】
次に、レコードｒｄ１の格納中に、図９に示す（２）の処理として、メンバ実行体ｍｍＡは、最初の空きページとなるページｐｇ１に対するトランザクションロックを獲得しようとする。しかしながら、ページｐｇ１に対するトランザクションロックは獲得済であるため、メンバ実行体ｍｍＡは、別の空きページを検索する。図９の例では、メンバ実行体ｍｍＡは、空きページとして、ページｐｇ２を検出し、ページｐｇ２に対するトランザクションロックと、メンバ間ロックとを獲得する。ページｐｇ２に対するトランザクションロックと、メンバ間ロックとを獲得した後、メンバ実行体ｍｍＡは、ページｐｇ２にレコードｒｄＡを格納する。
【００８０】
図１０は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その２）である。図１０では、図９に示す（１）、（２）の処理が終わった後のデータベース制御装置１０１の状態を示す。
【００８１】
図１０に示す（３）の処理として、メンバ実行体ｍｍ２は、最初の空きページとなるページｐｇ１に対するトランザクションｔｒ１によるトランザクションロックを獲得済か判断する。ここで、ページｐｇ１は、トランザクションｔｒ１によるトランザクションロックが獲得されている。ページｐｇ１に対するトランザクションｔｒ１によるトランザクションロックを獲得済であることを判断した場合、メンバ実行体ｍｍ２は、ページｐｇ１に対するメンバ間ロックを獲得済か判断する。図１０の例では、ページｐｇ１に対するメンバ間ロックは解放済であるため、メンバ実行体ｍｍ２は、ページｐｇ１に対するメンバ間ロックを獲得する。ページｐｇ１に対するメンバ間ロックを獲得した後、メンバ実行体ｍｍ２は、ページｐｇ１にレコードｒｄ２を格納する。レコードｒｄ２の格納が終了した場合、メンバ実行体ｍｍ２は、ページｐｇ１に対するメンバ間ロックを解放する。
【００８２】
次に、レコードｒｄ２の格納中に、図１０に示す（４）の処理として、メンバ実行体ｍｍＢは、最初の空きページとなるページｐｇ１に対するトランザクションロックを獲得済か否かを判断する。ここで、ページｐｇ１に対するトランザクションｔｒ１によるトランザクションロックが獲得済であるため、メンバ実行体ｍｍＢは、ページｐｇ１にレコードｒｄＢを格納しようとすることはやめ、別の空きページを検索する。
【００８３】
図１０の例では、メンバ実行体ｍｍＢは、空きページとして、ページｐｇ２を検出し、ページｐｇ２に対するトランザクションロックを獲得済か否かを判断する。ここで、ページｐｇ２に対するトランザクションｔｒ２によるトランザクションロックが獲得済であるため、メンバ実行体ｍｍＢは、続けて、ページｐｇ２に対するメンバ間ロックを獲得済か判断する。図１０の例では、ページｐｇ２に対するメンバ間ロックは解放済であるため、メンバ実行体ｍｍＢは、ページｐｇ２に対するメンバ間ロックを獲得する。ページｐｇ２に対するメンバ間ロックを獲得した後、メンバ実行体ｍｍ２は、ページｐｇ２にレコードｒｄＢを格納する。レコードｒｄＢの格納が終了した場合、メンバ実行体ｍｍ２は、ページｐｇ２に対するメンバ間ロックを解放する。
【００８４】
図１１は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その３）である。図１１では、図１０に示す（３）、（４）の処理が終わった後のデータベース制御装置１０１の状態を示す。
【００８５】
図１１に示す（５）の処理として、メンバ実行体ｍｍ３は、最初の空きページとなるページｐｇ１に対するトランザクションｔｒ１によるトランザクションロックを獲得済か判断する。ここで、ページｐｇ１は、トランザクションｔｒ１によるトランザクションロックが獲得されている。ページｐｇ１に対するトランザクションｔｒ１によるトランザクションロックを獲得済であることを判断した場合、メンバ実行体ｍｍ３は、ページｐｇ１に対するメンバ間ロックを獲得済か判断する。図１０の例では、ページｐｇ１に対するメンバ間ロックは解放済であるため、メンバ実行体ｍｍ３は、ページｐｇ１に対するメンバ間ロックを獲得する。ページｐｇ１に対するメンバ間ロックを獲得した後、メンバ実行体ｍｍ３は、ページｐｇ１にレコードｒｄ３を格納する。
【００８６】
この段階で、ページｐｇ１に３つのレコードが格納されたため、ページｐｇ１に空きがなくなる。レコードｒｄ３の格納が終了した場合、メンバ実行体ｍｍ３は、ページｐｇ１に対するメンバ間ロックを解放する。
【００８７】
図１２は、他トランザクションがある場合の２種類のロックを用いた格納例を示す説明図（その４）である。図１２では、図１１に示す（５）の処理が終わった後のデータベース制御装置１０１の状態を示す。図１２に示す（６）〜（８）の処理として、図９〜図１１で示した処理と同様に、メンバ実行体ｍｍ４、ｍｍｎ、ｍｍ５は、先頭となるページｐｇ１から順に空きページを検索し、ページが一杯になるまでレコードを格納する。
【００８８】
図９〜図１２で示したように、各メンバ実行体が、メンバ間ロックをレコード格納中だけ獲得することにより、トランザクション中ロックを獲得することに比べて、同一トランザクションの他のメンバ実行体に対し、ロックを獲得する期間を短くすることができる。ロックを獲得する期間を短くすることにより、同一トランザクションの他のメンバ実行体が同一ページにレコードを格納できるようになり、すかすかのページができにくくなり、ページの格納効率を向上させることができる。
【００８９】
また、ページの格納効率が向上することにより、ＲＡＭ３０３上に載せるページ内のレコード数が増えることになり、結果、ＤＢのアクセス性能が向上することになる。具体的には、ＲＡＭ３０３上に載せるページ数が同一の場合、ページ内のレコード数が多い方が、ＲＡＭ３０３で処理できるレコード数が増えることになるため、ＤＢのアクセス性能が向上することになる。
【００９０】
また、ページを前詰めすることにより、テーブル内の全件のレコードや大量のレコードを検索する場合、レコードを参照するためにアクセスするページ数が少なくて済むため、ＤＢのアクセス性能を向上させることができる。
【００９１】
次に、図８〜図１２で説明したＩＮＳＥＲＴ  ＳＥＬＥＣＴ文を受け付けた際に行う処理を示すフローチャートを、図１３〜図１５を用いて説明する。
【００９２】
図１３は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理手順の一例を示すフローチャート（その１）である。また、図１４は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理手順の一例を示すフローチャート（その２）である。
【００９３】
ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文となるＳＱＬを受け付けた際にデータベース制御装置１０１が実行する処理である。ここで、図１４の説明において、メンバ実行体ｍｍの処理内容は各メンバ実行体ｍｍで同一であるため、メンバ実行体ｍｍ１を用いて説明を行い、他のメンバ実行体ｍｍの動作の説明を省略する。
【００９４】
リーダ実行体ｌｄは、トランザクションを開始する（ステップＳ１３０１）。トランザクションを開始した後、リーダ実行体ｌｄは、図５の（ｌｄ−１）〜（ｌｄ−４）で示したＳＥＬＥＣＴ句の処理を開始する。
【００９５】
次に、リーダ実行体ｌｄは、メンバ実行体ｍｍを作成する（ステップＳ１３０２）。また、リーダ実行体ｌｄは、作成したメンバ実行体用のバッファｂを獲得する（ステップＳ１３０３）。次に、リーダ実行体ｌｄは、パーティション数またはＣＰＵ３０１のコア数の少ない数分メンバ実行体を作成したか否かを判断する（ステップＳ１３０４）。パーティション数またはＣＰＵ３０１のコア数の少ない数分メンバ実行体を作成していない場合（ステップＳ１３０４：Ｎｏ）、リーダ実行体ｌｄは、ステップＳ１３０２の処理に移行する。
【００９６】
一方、パーティション数またはＣＰＵ３０１のコア数の少ない数分メンバ実行体を作成した場合（ステップＳ１３０４：Ｙｅｓ）、リーダ実行体ｌｄは、図５の（ｌｄ−１）の実行結果として作業域ｗａ＿ｌｄに格納されたレコードを、メンバ実行体用のバッファｂに蓄積する（ステップＳ１４０１）。次に、リーダ実行体ｌｄは、各メンバ実行体ｍｍに処理要求を送信する（ステップＳ１４０２）。
【００９７】
メンバ実行体ｍｍ１は、リーダ実行体ｌｄからの通知を待ち受ける（ステップＳ１４０３）。次に、メンバ実行体ｍｍ１は、リーダ実行体ｌｄからの通知内容を確認する（ステップＳ１４０４）。リーダ実行体ｌｄからの通知内容として処理終了を受信した場合（ステップＳ１４０４：処理終了）、メンバ実行体ｍｍ１は、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理を終了する。
【００９８】
リーダ実行体ｌｄからの通知内容として処理依頼を受信した場合（ステップＳ１４０４：処理要求）、メンバ実行体ｍｍ１は、ページ格納処理を実行する（ステップＳ１４０５）。ページ格納処理については、図１５で説明する。そして、メンバ実行体ｍｍ１は、メンバ実行体のバッファｂ１にレコードがあるか否かを判断する（ステップＳ１４０６）。メンバ実行体のバッファｂ１にレコードがある場合（ステップＳ１４０６：Ｙｅｓ）、メンバ実行体ｍｍ１は、ステップＳ１４０５の処理に移行する。
【００９９】
一方、メンバ実行体のバッファにレコードがない場合（ステップＳ１４０６：Ｎｏ）、メンバ実行体ｍｍ１は、リーダ実行体に処理完了を通知する（ステップＳ１４０７）。そして、メンバ実行体ｍｍ１は、ステップＳ１４０３の処理に移行する。
【０１００】
処理完了を受信したリーダ実行体ｌｄは、作業域ｗａ＿ｌｄにレコードがあるか否かを判断する（ステップＳ１４０８）。作業域ｗａ＿ｌｄにレコードがある場合（ステップＳ１４０８：Ｙｅｓ）、リーダ実行体ｌｄは、ステップＳ１４０１の処理に移行する。一方、作業域ｗａ＿ｌｄにレコードがない場合（ステップＳ１４０８：Ｎｏ）、リーダ実行体ｌｄは、トランザクションを終了する（ステップＳ１４０９）。次に、リーダ実行体ｌｄは、各メンバ実行体が獲得したトランザクションロックを解放する（ステップＳ１４１０）。ここで、各メンバ実行体が獲得したトランザクションロックは、ページごとに獲得したため、リーダ実行体ｌｄは、獲得したページごとのトランザクションロックを全て解放する。そして、リーダ実行体ｌｄは、全メンバ実行体に処理終了を通知する（ステップＳ１４１１）。そして、リーダ実行体ｌｄは、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理を終了する。
【０１０１】
ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文受付時処理を実行することにより、データベース制御装置１０１は、同一トランザクションの他のメンバ実行体が同一ページにレコードを格納できるようになり、すかすかのページができにくくなる。従って、データベース制御装置１０１は、ページの格納効率を向上させることができる。
【０１０２】
図１５は、ページ格納処理手順の一例を示すフローチャートである。ページ格納処理は、メンバ実行体ｍｍが、ページにレコードを格納する際に行う処理である。図１５の説明において、メンバ実行体ｍｍの処理内容は各メンバ実行体ｍｍで同一であるため、メンバ実行体ｍｍ１を用いて説明を行い、他のメンバ実行体ｍｍの動作の説明を省略する。
【０１０３】
メンバ実行体ｍｍ１は、メンバ実行体ｍｍ１用のバッファｂ１から、レコードを抽出する（ステップＳ１５０１）。次に、メンバ実行体ｍｍ１は、抽出したレコードを格納するパーティションを決定する（ステップＳ１５０２）。レコードの格納先として、各パーティションは、格納するレコードのキーに基づいて、記憶するレコードを分散させている。例えば、パーティションｐｔ４＿１はキーの値が「１」から「３」までのレコードを記憶し、パーティションｐｔ４＿２はキーの値が「４」から「６」までのレコードを記憶し、パーティションｐｔ４＿３はキーの値が「７」から「９」までのレコードを記憶する。メンバ実行体ｍｍ１は、格納しようとするキーの値を参照して、パーティションｐｔ４＿１、４＿２、４＿３のうち格納先のパーティションを決定する。
【０１０４】
そして、メンバ実行体ｍｍ１は、決定したパーティションから、空きページを検索する（ステップＳ１５０３）。次に、メンバ実行体ｍｍ１は、検出した空きページのページに対するトランザクションロックを他のトランザクションが獲得しているか否かを判断する（ステップＳ１５０４）。検出した空きページのページに対するトランザクションロックを他のトランザクションが獲得している場合（ステップＳ１５０４：Ｙｅｓ）、メンバ実行体ｍｍ１は、ステップＳ１５０３の処理に移行する。
【０１０５】
検出した空きページのページに対するトランザクションロックを他のトランザクションが獲得していない場合（ステップＳ１５０４：Ｎｏ）、メンバ実行体ｍｍ１は、続けて、検出した空きページのページに対するトランザクションロックを自トランザクションが獲得しているか否かを判断する（ステップＳ１５０５）。検出した空きページのページに対するトランザクションロックを自トランザクションが獲得していない場合（ステップＳ１５０５：Ｎｏ）、メンバ実行体ｍｍ１は、検出した空きページに対するトランザクションロックを獲得する（ステップＳ１５０６）。そして、メンバ実行体ｍｍ１は、検出した空きページのページに対するメンバ間ロックを他のメンバ実行体が獲得しているか否かを判断する（ステップＳ１５０７）。
【０１０６】
また、検出した空きページのページに対するトランザクションロックを自トランザクションが獲得している場合（ステップＳ１５０５：Ｙｅｓ）、メンバ実行体ｍｍ１は、ステップＳ１５０７の処理を実行する。
【０１０７】
検出した空きページのページに対するメンバ間ロックを他のメンバ実行体が獲得している場合（ステップＳ１５０７：Ｙｅｓ）、メンバ実行体ｍｍ１は、ステップＳ１５０３の処理に移行する。検出した空きページのページに対するメンバ間ロックを他のメンバ実行体が獲得していない場合（ステップＳ１５０７：Ｎｏ）、メンバ実行体ｍｍ１は、検出した空きページに対するメンバ間ロックを獲得する（ステップＳ１５０８）。そして、メンバ実行体ｍｍ１は、検出した空きページにレコードを格納する（ステップＳ１５０９）。次に、メンバ実行体ｍｍ１は、検出した空きページに対するメンバ間ロックを解放する（ステップＳ１５１０）。ステップＳ１５１０の処理終了後、メンバ実行体ｍｍ１は、ページ格納処理を終了する。ページ格納処理を実行することにより、データベース制御装置１０１は、空きページに対するトランザクションロックとメンバ間ロックとを獲得した際に、空きページにレコードを格納することができる。
【０１０８】
以上説明したように、メンバ実行体ｍｍは、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文について、いずれかのページに対するトランザクションロックとメンバ間ロックとを獲得してから、いずれかのページにレコードを格納する。これにより、メンバ実行体ｍｍは、同一のトランザクションのレコードが同じページに格納することができ、ページの格納効率を向上させることができる。また、メンバ間ロックは、メンバ実行体ｍｍがレコードをページに格納する間だけ獲得されるものであるので、レコードの全ての格納が終わるまでロックを獲得する場合に比べて排他区間を短くすることができる。そして、排他区間を短くし、レコードをページに前詰めして格納することにより、メンバ実行体ｍｍは、一ページあたりの格納効率を向上させることができる。格納効率を向上させることにより、ＲＡＭ３０３に載せるページ内のレコード数が増えることになり、メンバ実行体ｍｍは、ＤＢ１０２のアクセス性能を向上させることができる。理由としては、ＲＡＭ３０３に載せるページ数が同一の場合、ページ内のレコード数が多い方が、ＲＡＭ３０３で処理できるレコード数が増えるため、ＤＢ１０２の性能向上につながるためである。
【０１０９】
また、メンバ実行体ｍｍは、トランザクションロックを獲得した後に、メンバ間ロックを獲得してもよい。トランザクションロックを獲得した後に、メンバ間ロックを獲得するという順序で処理を行う場合、トランザクションロックが未獲得であったページに対して、メンバ間ロックが獲得されていることはない。従って、メンバ実行体ｍｍは、トランザクションロックを獲得したページに対して、メンバ間ロックが既に獲得されているか確認することなくメンバ間ロックを獲得することができる。これに対し、メンバ間ロックを獲得した後にトランザクションロックを獲得するという順序で処理を行う場合、メンバ間ロックが未獲得であったページに対して、トランザクションロックが獲得されていることはあり得る。従って、この場合、メンバ実行体ｍｍは、メンバ間ロックを獲得した後に、トランザクションロックが獲得されているか否かを確認する処理が発生することになる。
【０１１０】
また、メンバ実行体ｍｍは、同一のトランザクションとなるいずれかのメンバ実行体ｍｍによってトランザクションロックが獲得されており、かつ、メンバ間ロックが獲得されていないページを特定し、特定したページに対してメンバ間ロックを獲得してもよい。ここで、同一のトランザクションとなるいずれかのメンバ実行体ｍｍによってトランザクションロックが既に獲得されているページは、同一のＳＥＬＥＣＴ句によるレコード群が格納されていることを示している。従って、メンバ実行体ｍｍは、同一のＳＥＬＥＣＴ句によるレコード群を１つのページに集約して格納することができる。そして、同一のＳＥＬＥＣＴ句によるレコード群は、検索時に同時に参照される可能性が高い。従って、同一のＳＥＬＥＣＴ句によるレコード群が１つのページに集約されていることにより、メンバ実行体ｍｍは、ＳＥＬＥＣＴ句によるレコード群に対する検索効率を高めることができる。
【０１１１】
同一のトランザクションとなるいずれかのメンバ実行体ｍｍによってトランザクションロックが獲得されており、かつ、メンバ間ロックが獲得されていないページを特定するために、例えば、メンバ実行体ｍｍは、ページ番号の小さい順からページを検索してもよい。これにより、ページ番号の小さいページから順に、何らかのトランザクションロックが獲得されることになる。従って、メンバ実行体ｍｍは、トランザクションロックが獲得されているページの検出が容易となる。そして、メンバ実行体ｍｍは、獲得されているトランザクションロックが自トランザクションのものであれば、メンバ間ロックが獲得されているか否かを特定すればよい。そして、この場合、メンバ実行体ｍｍは、格納されるレコードの数が多いページを多く作成することができる。また、メンバ実行体ｍｍは、ページ番号のより小さいページの格納レコード数を増やすことができる。
【０１１２】
また、同一のトランザクションとなるいずれかのメンバ実行体ｍｍによってトランザクションロックが獲得されており、かつ、メンバ間ロックが獲得されていないページが２以上あるとする。この場合、メンバ実行体ｍｍは、ＳＥＬＥＣＴ句による検索処理を実行した際に少なくともいずれかのページよりも先に検索されたページを特定し、特定したページに対してメンバ間ロックを獲得してもよい。このように、先に検索されたページにレコードを格納することにより、ページを前詰めすることができる。ページを前詰めすることにより、テーブル内のレコードの全件、または大量に検索する場合に、レコードを参照するためにアクセスするページ数が少なくて済むために、ＤＢ１０２のアクセス性能を向上させることができる。また、メンバ実行体ｍｍは、ページ内の格納レコード数がより多いページを優先して特定してもよい。これにより、メンバ実行体ｍｍは、格納されるレコードの数が多いページをより多く作成することができる。
【０１１３】
また、リーダ実行体ｌｄは、メンバ実行体ｍｍに、トランザクションロックとメンバ間ロックとを獲得してから格納処理を、検索処理と同一のトランザクションに含まれる処理として実行する要求を送信してもよい。これにより、メンバ実行体ｍｍが、ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文について、いずれかのページに対するトランザクションロックとメンバ間ロックとを獲得してから、いずれかのページにレコードを格納することになる。そして、メンバ実行体ｍｍは、同一のトランザクションのレコードが同じページに格納することができ、ページの格納効率を向上させることができる。
【０１１４】
また、リーダ実行体ｌｄは、メンバ実行体ｍｍの全てが格納処理を終了させた場合、格納処理を行っていたページのトランザクションロックを解放する。これにより、メンバ実行体ｍｍは、ページにまだ空き容量があれば、他のトランザクションのメンバ実行体ｍｍによる格納処理によって、レコードを格納することができて、格納されるレコードの数が多いページをより多く作成することができる。
【０１１５】
なお、本実施の形態で説明したデータベース制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本データベース制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本データベース制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１１６】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１１７】
（付記１）データベースにアクセス可能な複数のプロセッサに含まれるプロセッサに、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータが前記プロセッサに割り当てられたことに応じて、前記データを取得し、
前記データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
処理を実行させることを特徴とするデータベース制御プログラム。
【０１１８】
（付記２）前記第２のロックを獲得する処理は、
前記第１のロックを獲得した後に、前記第２のロックを獲得する、
ことを特徴とする付記１に記載のデータベース制御プログラム。
【０１１９】
（付記３）前記データベースが複数の記憶領域に分割されており、
前記プロセッサに、
前記複数の記憶領域のうち、前記割当先プロセッサのうちのいずれかのプロセッサにより前記第１のロックが獲得されており、かつ、前記第２のロックが獲得されていない記憶領域を特定する、処理を実行させ、
前記第２のロックを獲得する処理は、
特定した前記記憶領域に対する第２のロックを獲得する、
ことを特徴とする付記１または２に記載のデータベース制御プログラム。
【０１２０】
（付記４）前記特定する処理は、
前記割当先プロセッサのうちのいずれかのプロセッサにより前記第１のロックが獲得されており、かつ、前記第２のロックが獲得されていない記憶領域が２以上ある場合、前記２以上の記憶領域のうち、前記検索処理を実行した際に少なくともいずれかの記憶領域よりも先に検索された記憶領域を特定する、
ことを特徴とする付記３に記載のデータベース制御プログラム。
【０１２１】
（付記５）コンピュータに、
データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記データベースにアクセス可能な複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記トランザクションが終了するまでの間の前記データベースのいずれかの記憶領域に対するアクセスを前記割当先プロセッサについて選択的に許容する第１のロックと前記データを割り当てたプロセッサが前記いずれかの記憶領域に前記データを格納する格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックとを獲得してから前記格納処理を前記トランザクションに含まれる処理として実行する要求を送信する、
処理を実行させることを特徴とするデータベース制御プログラム。
【０１２２】
（付記６）前記いずれかのプロセッサに、
前記割当先プロセッサの全てが前記格納処理を終了させた場合、前記第１のロックを解放する、
処理を実行させることを特徴とする付記５に記載のデータベース制御プログラム。
【０１２３】
（付記７）データベースにアクセス可能な複数のプロセッサを有するデータベース制御装置であって、
前記複数のプロセッサに含まれるプロセッサは、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータが前記プロセッサに割り当てられたことに応じて、前記データを取得し、
前記データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
ことを特徴とするデータベース制御装置。
【０１２４】
（付記８）データベースにアクセス可能な複数のプロセッサを有するデータベース制御装置であって、
前記複数のプロセッサのいずれかのプロセッサは、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記トランザクションが終了するまでの間の前記データベースのいずれかの記憶領域に対するアクセスを前記割当先プロセッサについて選択的に許容する第１のロックと前記データを割り当てたプロセッサが前記いずれかの記憶領域に前記データを格納する格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックとを獲得してから前記格納処理を前記トランザクションに含まれる処理として実行する要求を送信する、
ことを特徴とするデータベース制御装置。
【０１２５】
（付記９）データベースにアクセス可能な複数のプロセッサを有するデータベース制御装置であって、
前記複数のプロセッサのいずれかのプロセッサは、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記データベースのいずれかの記憶領域にデータを格納する格納処理を前記トランザクションに含まれる処理として実行する要求を送信し、
前記複数のプロセッサに含まれるプロセッサは、
前記要求を前記いずれかのプロセッサから受信したことに応じて、前記プロセッサに割り当てられたデータを取得し、
前記格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
ことを特徴とするデータベース制御装置。
【０１２６】
（付記１０）データベースにアクセス可能な複数のプロセッサに含まれるプロセッサが、
前記データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のいずれかのデータが前記プロセッサに割り当てられたことに応じて、前記データを取得し、
前記データベースのいずれかの記憶領域にデータを格納する格納処理を実行する前に、前記トランザクションが終了するまでの間の前記いずれかの記憶領域に対するアクセスを前記データ群のそれぞれが割り当てられた割当先プロセッサについて選択的に許容する第１のロックを獲得し、
前記プロセッサが前記格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックを獲得し、
前記第１のロックと前記第２のロックとを獲得した場合、前記格納処理を前記トランザクションに含まれる処理として実行する、
処理を実行することを特徴とするデータベース制御方法。
【０１２７】
（付記１１）コンピュータが、
データベースに対する検索処理をトランザクションに含まれる処理として実行した実行結果に基づいて生成されるデータ群のそれぞれを、前記データベースにアクセス可能な複数のプロセッサのいずれかに割り当て、
前記複数のプロセッサのうちの前記データ群のそれぞれのデータを割り当てた割当先プロセッサに、前記トランザクションが終了するまでの間の前記データベースのいずれかの記憶領域に対するアクセスを前記割当先プロセッサについて選択的に許容する第１のロックと前記データを割り当てたプロセッサが前記いずれかの記憶領域に前記データを格納する格納処理を終了するまで専有する前記いずれかの記憶領域に対する第２のロックとを獲得してから前記格納処理を前記トランザクションに含まれる処理として実行する要求を送信する、
処理を実行することを特徴とするデータベース制御方法。
【符号の説明】
【０１２８】
＃０〜＃２  コア
１０１  データベース制御装置
１０２  ＤＢ
１１１  ＩＮＳＥＲＴ  ＳＥＬＥＣＴ文
１１２  検索処理
１１３  格納処理
４０１  検索処理実行部
４０２  割当部
４０３  送信部
４０４  解放部
４０５  取得部
４０６  第１獲得部
４０７  特定部
４０８  第２獲得部
４０９  格納処理実行部
【図１】
2017126173.tif 000003
【図２】
2017126173.tif 000004
【図３】
2017126173.tif 000005
【図４】
2017126173.tif 000006
【図５】
2017126173.tif 000007
【図６】
2017126173.tif 000008
【図７】
2017126173.tif 000009
【図８】
2017126173.tif 000010
【図９】
2017126173.tif 000011
【図１０】
2017126173.tif 000012
【図１１】
2017126173.tif 000013
【図１２】
2017126173.tif 000014
【図１３】
2017126173.tif 000015
【図１４】
2017126173.tif 000016
【図１５】
2017126173.tif 000017