(57)【要約】      （修正有）【課題】データベースにおける一括更新中に、個別更新を行なえるようにする。【解決手段】データベースの個別のレコードへの更新内容の履歴を記録し、データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置をデータベースにおける第１のインデックスに適用した第２のインデックスを生成する。第２のインデックスに、少なくとも第２のインデックスの生成の開始以降の履歴に含まれる更新内容を反映させる処理を含む。【選択図】図７
2016066224.tif 000002
【特許請求の範囲】
【請求項１】
データベースの個別のレコードへの更新内容の履歴を記録し、
前記データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置を前記データベースにおける第１のインデックスに適用した第２のインデックスを生成し、
前記第２のインデックスに、少なくとも前記第２のインデックスの生成の開始以降の前記履歴に含まれる前記更新内容を反映させる
処理をコンピュータに実行させる更新プログラム。
【請求項２】
請求項１記載の更新プログラムであって、
前記第２のインデックスが完成した後、前記第２のインデックスが完成する前に開始されたトランザクションが終了するまで、前記個別のレコードへの更新に伴い、前記第１のインデックスと前記第２のインデックスとを更新する
処理をコンピュータに実行させる更新プログラム。
【請求項３】
請求項１又は２記載の更新プログラムであって、
前記記録する処理において、前記開始を前記履歴に記録し、
前記反映させる処理において、前記開始以降の前記更新内容のうち、前記第２のインデックスに反映されていない更新内容を適用する
更新プログラム。
【請求項４】
請求項１乃至３いずれか１つ記載の更新プログラムであって、
前記生成する処理において、前記各レコードの格納位置とともに当該レコードのキー値を抽出し、前記各レコードの格納位置とともに当該キー値を、前記第１のインデックスに適用し、更に前記第２のインデックスにおけるキー値の重複を検出し、
前記反映させる処理において、前記更新内容の適用によって生じるキー値の重複を検出し、
前記キー値の重複が無い場合に、前記第２のインデックスが完成したと判定する
処理をコンピュータに実行させる更新プログラム。
【請求項５】
請求項１乃至４いずれか１つ記載の更新プログラムであって、
前記更新内容に対するロールバックを行なうためのログを記録し、
前記ログに基づいて前記ロールバックを行なった場合にキー値に重複が生じないかを検証する
処理をコンピュータに実行させる更新プログラム。
【請求項６】
データベースの個別のレコードへの更新内容の履歴を記録し、
前記データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置を前記データベースにおける第１のインデックスに適用した第２のインデックスを生成し、
前記第２のインデックスに、少なくとも前記第２のインデックスの生成の開始以降の前記履歴に含まれる前記更新内容を反映させる
処理をコンピュータに実行させる更新方法。
【請求項７】
データベースの個別のレコードへの更新内容の履歴を記録する記録処理部と、
前記データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置を前記データベースにおける第１のインデックスに適用した第２のインデックスを生成する生成部と、
前記第２のインデックスに、少なくとも前記第２のインデックスの生成の開始以降の前記履歴に含まれる前記更新内容を反映させる反映部と
を含む更新装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベースの更新技術に関する。
【背景技術】
【０００２】
ＳＱＬ（標準としては略語ではないが、Structured Query Languageの意と解する場合もある。）文などのアクセス要求によって１つのレコードに対して個別に更新を行なう方法の他に、例えばデータベースに対して多くのレコードを含むデータを追加するような一括更新の方法もある。
【０００３】
このように、データベースを一括して更新する場合には、更新後におけるインデックスとデータとの整合を担保するために、データベースに対する他の更新を排除することが多い。例えば、ＳＱＬ文などのアクセス要求も制限される。
【０００４】
一方、例えばオンライントランザクション処理（ＯＬＴＰ：Online Transaction Processing）によってデータベースを利用する側にとっては、絶え間なく処理を行なえることが望ましい。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−２５１９９９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の目的は、一側面では、データベースにおける一括更新中に、個別更新を行なえるようにすることである。
【課題を解決するための手段】
【０００７】
一態様に係る更新方法は、データベースの個別のレコードへの更新内容の履歴を記録し、データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置をデータベースにおける第１のインデックスに適用した第２のインデックスを生成し、第２のインデックスに、少なくとも第２のインデックスの生成の開始以降の上記履歴に含まれる更新内容を反映させる処理を含む。
【発明の効果】
【０００８】
一側面としては、データベースにおける一括更新中に、個別更新を行なえる。
【図面の簡単な説明】
【０００９】
【図１】図１は、ネットワーク構成例を示す図である。
【図２】図２は、主なモジュール構成例を示す図である。
【図３】図３は、テーブルのデータの構成例を示す図である。
【図４】図４は、リーフノード域の構成例を示す図である。
【図５】図５は、新規テーブルのデータの構成例を示す図である。
【図６】図６は、シーケンスの例を示す図である。
【図７】図７は、追加モードにおけるデータフローの例を示す図である。
【図８】図８は、既存リーフノード域が更新される様子を示す図である。
【図９】図９は、アーカイブログを新規リーフノード域に適用する例を示す図である。
【図１０】図１０は、パターンを説明するための図である。
【図１１】図１１は、第１パターンにおけるデータアクセスの概要を示す図である。
【図１２】図１２は、第２パターンにおけるデータアクセスの概要を示す図である。
【図１３】図１３は、第３パターンにおけるデータアクセスの概要を示す図である。
【図１４】図１４は、生成処理におけるノードの重複の例を示す図である。
【図１５】図１５は、反映処理におけるノードの重複の例を示す図である。
【図１６】図１６は、データ記憶部の構成例を示す図である。
【図１７】図１７は、トランザクションテーブルの構成例を示す図である。
【図１８】図１８は、制御データの構成例を示す図である。
【図１９】図１９は、実行部の構成例を示す図である。
【図２０】図２０は、実行部のメイン処理フローを示す図である。
【図２１】図２１は、トランザクション開始処理フローを示す図である。
【図２２】図２２は、トランザクションの制御プロセスにおける処理フローを示す図である。
【図２３】図２３は、パターン判定処理フローを示す図である。
【図２４】図２４は、レコード抽出処理フローを示す図である。
【図２５Ａ】図２５Ａは、レコード挿入処理フローを示す図である。
【図２５Ｂ】図２５Ｂは、レコード挿入処理フローを示す図である。
【図２６Ａ】図２６Ａは、レコード削除処理フローを示す図である。
【図２６Ｂ】図２６Ｂは、レコード削除処理フローを示す図である。
【図２７Ａ】図２７Ａは、レコード更新処理フローを示す図である。
【図２７Ｂ】図２７Ｂは、レコード更新処理フローを示す図である。
【図２７Ｃ】図２７Ｃは、レコード更新処理フローを示す図である。
【図２７Ｄ】図２７Ｄは、レコード更新処理フローを示す図である。
【図２８】図２８は、トランザクション完了処理フローを示す図である。
【図２９】図２９は、トランザクション取消処理フローを示す図である。
【図３０】図３０は、一括追加部の構成例を示す図である。
【図３１】図３１は、一括追加処理フローを示す図である。
【図３２】図３２は、一括追加処理フローを示す図である。
【図３３】図３３は、生成処理フローを示す図である。
【図３４】図３４は、生成処理フローを示す図である。
【図３５】図３５は、生成処理フローを示す図である。
【図３６】図３６は、反映処理フローを示す図である。
【図３７】図３７は、第１サブルーチン処理フローを示す図である。
【図３８】図３８は、第２サブルーチン処理フローを示す図である。
【図３９】図３９は、取消用ログを適用する様子を示す図である。
【図４０】図４０は、取消検証処理フローを示す図である。
【図４１】図４１は、待機処理フローを示す図である。
【図４２】図４２は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１０】
［実施の形態１］
図１に、ネットワーク構成例を示す。この例で、データベースサーバ１０１とアプリケーションサーバ１０３とは、ＬＡＮ（Local Area Network）を介して接続されている。データベースサーバ１０１は、データベース管理システム１０５及びローダ部１０７を有している。アプリケーションサーバ１０３は、アプリケーション部１０９を有している。
【００１１】
図２に、主なモジュール構成例を示す。アプリケーション部１０９は、オンライントランザクション処理により、データベース管理システム１０５のデータを利用する。アプリケーション部１０９は、第１インターフェース２０１を有している。第１インターフェース２０１は、データベース管理システム１０５にＳＱＬ文を発行し、更に当該ＳＱＬ文の結果を受け取る。
【００１２】
データベース管理システム１０５は、オンライントランザクション処理を実行するために、第１受付部２０３及び実行部２０５を有している。第１受付部２０３は、ＬＡＮを介してＳＱＬ文を受け付ける。実行部２０５は、受け付けたＳＱＬ文に応じた処理を実行する。
【００１３】
データベース管理システム１０５は、更に、データ記憶部２０７を有している。データ記憶部２０７は、データベースに含まれるデータ及び制御データなどを記憶する。
【００１４】
ローダ部１０７は、例えば、他のデータベースや他のシステムなどから得られるデータを一括してロードする処理を行なう。ローダ部１０７は、第２インターフェース２０９を有している。第２インターフェース２０９は、ダイレクトパスロードを利用するために用いられる。ダイレクトパスロードでは、データが高速に更新される。尚、ダイレクトパスロードにおいて、トランザクションの概念はない。
【００１５】
データベース管理システム１０５は、ダイレクトパスロードによる一括のデータ追加を行なうために、第２受付部２１１及び一括追加部２１３を有している。第２受付部２１１は、例えば、一括してデータを追加する要求（以下、追加要求という。）を受け付ける。一括追加部２１３は、受け付けた追加要求に従って、一括してデータを追加する。以下では、データベース管理システム１０５で管理するデータベースのテーブルに複数のレコードを一度に加える例について説明する。データベース管理システム１０５は、更に記録処理部２１５を有している。記録処理部２１５は、アーカイブログを記録する処理及び取消ログを記録する処理を行なう。
【００１６】
上述したデータベース管理システム１０５、第１受付部２０３、実行部２０５、第２受付部２１１、一括追加部２１３及び記録処理部２１５は、ハードウエア資源（例えば、図４２）と、以下で述べる処理をプロセッサに実行させるプログラムとを用いて実現される。
【００１７】
上述したデータ記憶部２０７は、ハードウエア資源（例えば、図４２）を用いて実現される。
【００１８】
次に、データベースにおけるテーブルのデータについて説明する。図３に、テーブルのデータの構成例を示す。データベースにおけるテーブルのデータは、インデックス域及びデータ域を有している。インデックス域には、例えばＢ木の構成が採用される。Ｂ木は、多分岐の平衡木である。Ｂ木の構成は、ＲＤＢ（Relational Database）において広く用いられている。また、Ｂ木のインデックスは、リーフノードと、リーフノードに対する上位のノード（以下、上位ノードという。）とを有する。データ域には、レコードのデータが格納される。尚、図３は、通常のモードにおける構成を示している。
【００１９】
図４に、リーフノード域の構成例を示す。図４に示すように、リーフノード域には、キー値とレコード格納位置（以下では、ＴＩＤということもある。）との組がキー値の昇順に格納されている。キー値とＴＩＤとの組は、リーフノードに相当する。つまり、リーフノードにおいて、キー値とＴＩＤとが対応付けられている。また、キー値とＴＩＤとの各組は、キー値が昇順になるようにリーフノードに割り当てられている。キー値は、テーブルに含まれるレコードを識別するために用いられる。レコード格納位置は、データ域において、キー値によって識別されるレコードが格納されている位置である。以下では、リーフノードをノードという。
【００２０】
次に、データを一括追加した後の新規テーブルのデータの構成について説明する。図５に、新規テーブルのデータの構成例を示す。新規テーブルのデータは、新規データ域５０１及び新規インデックス域５０３を有している。新規データ域５０１は、既存データ域５０５及び追加データ域５０７を含んでいる。既存データ域５０５は、一括のデータ追加が実行される前のデータ域に相当する。追加データ域５０７は、一括のデータ追加によって追加されたデータ域である。新規インデックス域５０３には、新規データ域５０１に含まれる既存データ域５０５及び追加データ域５０７にアクセスするためのインデックスが格納されている。新規インデックス域５０３は、新規リーフノード域５０９及び新規上位ノード域５１１を含んでいる。
【００２１】
次に、本実施の形態におけるシーケンスについて説明する。図６に、シーケンスの例を示す。アプリケーション部１０９は、オンライントランザクション処理によってＳＱＬ文６０１をデータベース管理システム１０５へ送り、データベース管理システム１０５は、受け付けたＳＱＬ文６０１に応じた処理を実行する。そして、データベース管理システム１０５は、処理した結果６０３をアプリケーション部１０９へ返す。
【００２２】
アプリケーション部１０９とデータベース管理システム１０５とが上述したオンライントランザクション処理を行なっている間に、ローダ部１０７は、追加要求６０５をデータベース管理システム１０５へ送る。データベース管理システム１０５は、受け付けた追加要求６０５に従って、一括してデータを追加し、その処理の結果６０７をローダ部１０７に返す。
【００２３】
本実施の形態では、オンライントランザクション処理を中断させることなく、データを一括して追加する。この例では、一括してデータを追加する処理を行なっている間のデータベース管理システム１０５のモードを、追加モードという。追加モードでないときのデータベース管理システム１０５のモードを、通常モードという。
【００２４】
次に、追加モードにおけるデータの流れについて説明する。図７に、追加モードにおけるデータフローの例を示す。既存テーブルのデータには、上述した既存データ域５０５の他に、既存インデックス域７０１が含まれている。既存インデックス域７０１は、既存リーフノード域７０３と既存上位ノード域７０５とを含んでいる。通常モードと追加モードのいずれにおいても、データベース管理システム１０５がＳＱＬ文６０１に応じた処理を実行すると、当該処理の内容がアーカイブログ７０７に記録される（Ｓ７５１）。
【００２５】
追加データは、追加データ域５０７に格納される（Ｓ７５３）。そして、追加データから要素列７０９が抽出される（Ｓ７５５）。要素列７０９における要素は、キー値とＴＩＤとの組である。キー値とＴＩＤとの組は、新規リーフノード域５０９のノードにおいて保持されるようになる。要素においても、ノードと同様にキー値とＴＩＤとが対応付けられている。追加データから要素列７０９を抽出する手順は、リーフノードを生成する従来の手順と同様である。
【００２６】
そして、データベース管理システム１０５は、既存リーフノード域７０３のノードと、要素列７０９の要素をマージして、新規リーフノード域５０９に格納する（Ｓ７５７）。この処理を、生成処理という。
【００２７】
但し、本実施の形態では、マージ処理を行なっている間にも、ＳＱＬ文６０１に応じた処理が行なわれる。従って、マージ処理を行なっている間に行なわれたＳＱＬ文６０１の処理をアーカイブログ７０７から読み、それらの処理に伴う新規リーフノード域５０９の更新を追加的に行なう（Ｓ７５９）。この処理を、反映処理という。
【００２８】
そして、生成処理と反映処理とによって作られた新規リーフノード域５０９に基づいて、新規上位ノード域５１１が生成される（Ｓ７６１）。この段階で、新規インデックスが完成する。
【００２９】
尚、生成処理を行なっている間に行なわれたＳＱＬ文６０１の処理に起因する既存リーフノード域７０３のノードの更新のうち、生成処理で新規リーフノード域５０９にも反映されるものと、生成処理で新規リーフノード域５０９に反映されないものとがある。
【００３０】
生成処理を行なっている間に行なわれたＳＱＬ文６０１の処理に起因する既存リーフノード域７０３のノードの更新について説明する。図８に、既存リーフノード域７０３が更新される様子を示す。既存リーフノード域７０３におけるノードは、キー値を昇順に保持している。図８の例の場合、左側のノードで保持されているキー値が小さく、右側のノードで保持されているキー値が大きい。そして、マージ処理においてノードを指す第１ポインタが、キー値が大きくなる順に移動する。図８の例の場合、左から右へ第１ポインタが移動する。
【００３１】
図８のように第１ポインタがあるノードを指している状態で、既に第１ポインタが通過した位置へのノード８０１の挿入については、生成処理で新規リーフノード域５０９に反映されない。同じ状態で既に第１ポインタが通過した位置のノード８０３の削除についても、生成処理で新規リーフノード域５０９に反映されない。従って、ノード８０１の挿入及びノード８０３の削除については、反映処理によって新規リーフノード域５０９に反映させるようにする。図８では、反映処理によって新規リーフノード域５０９に反映させるノードの更新に丸印を付している。
【００３２】
図８のように第１ポインタがあるノードを指している状態で、第１ポインタが未だ通過していない位置へのノード８０５の挿入については、生成処理で新規リーフノード域５０９に反映される。同じ状態で第１ポインタが未だ通過していない位置のノード８０７の削除についても、生成処理で新規リーフノード域５０９に反映される。従って、ノード８０５の挿入及びノード８０７の削除については、反映処理によって新規リーフノード域５０９に反映させないようにする。図８では、反映処理によって新規リーフノード域５０９に反映させないノードの更新にバツ印を付している。
【００３３】
次に、図９を用いて、反映処理においてアーカイブログ７０７を新規リーフノード域５０９に適用する例について説明する。アーカイブログ７０７のレコード９０１は、図８に示したノード８０１の挿入に相当する態様において追加されたものである。キー値「７」とＴＩＤ「２０００」との組を保持するノードは、未だ新規リーフノード域５０９に挿入されていないので、レコード９０１に示される処理を適用して、新規リーフノード域５０９にキー値「７」とＴＩＤ「２０００」との組を保持するノードを挿入する。図９では、レコードに示される処理を適用する場合に丸印を付している。
【００３４】
アーカイブログ７０７のレコード９０３は、図８に示したノード８０５の挿入に相当する態様において追加されたものである。キー値「１０」とＴＩＤ「５００」との組を保持するノードは、既に新規リーフノード域５０９に挿入されているので、レコード９０３に示される処理を適用しない。図９では、レコードに示される処理を適用しない場合にバツ印を付している。
【００３５】
アーカイブログ７０７のレコード９０５は、図８に示したノード８０７の削除に相当する態様において追加されたものである。キー値「３０」とＴＩＤ「１８００」との組を保持するノードは、既に新規リーフノード域５０９から削除されているので、レコード９０５に示される処理は適用されない。
【００３６】
アーカイブログ７０７のレコード９０７は、図８に示したノード８０３の削除に相当する態様において追加されたものである。キー値「２０」とＴＩＤ「１０００」との組を保持するノードは、未だ新規リーフノード域５０９から削除されていないのでレコード９０７に示される処理を適用する。
【００３７】
また、反映処理によって新規インデックスが完成した後でも、新規インデックスが完成する前に開始したトランザクションにおいて発行されるＳＱＬ文６０１に応じた処理に関しては、既存インデックス域７０１を用いるようにする。つまり、新規インデックスが完成する前に開始したトランザクションが残らず終了するまで、既存インデックス域７０１も有効にする。このようにすることによって、新規インデックスが完成する前に開始したトランザクションによる一連の処理についての原子性が担保される。仮に、新規インデックスが完成する前に開始したトランザクションにおいて、新規インデックスが完成した時点からすぐに新規インデックスを用いるようにすると、アプリケーション部１０９が参照するレコード数がその時点から突然多くなる。その結果、アプリケーション部１０９における処理の前提が崩れ、矛盾が生じる。尚、原子性は、トランザクション処理における一連の処理が残らず実行された状態、あるいは一切実行されない状態のいずれかを保証することを意味する。
【００３８】
本実施の形態では、テーブルのレコードを操作する処理、例えばレコードの抽出処理やレコードの挿入処理などが、夫々３つのパターンを有し、パターン毎の態様でデータアクセスを行なう。
【００３９】
図１０を用いて、３つのパターンについて説明する。図１０は、下向きに時間の経過を示している。時点１００１で、通常モードから追加モードに切り替わっている。また、時点１００３で、新規インデックスが完成している。更に、時点１００５で、新規インデックスが完成する前に開始したトランザクションが残らず終了し、追加モードから通常モードに切り替わっている。
【００４０】
また、図１０に示すように、追加モードの期間は、生成処理及び反映処理によって新規インデックス域５０３を生成する期間と、待機処理によって新規インデックスが完成する前に開始したトランザクションが残らず終了するまで待つ期間とに分けられる。
【００４１】
図１０に示すように、トランザクションＡは、追加モードに切り替わる前に開始している。トランザクションＢは、新規インデックスが完成する前に開始している。トランザクションＣは、新規インデックスが完成した後に開始している。
【００４２】
トランザクションＡにおける処理Ａ−１とトランザクションＢにおける処理Ｂ−１は、未だ新規インデックスが完成していないので、既存インデックス域７０１を用いて実行される。この例では、このようなパターンを第１パターンという。
【００４３】
図１１に、第１パターンにおけるデータアクセスの概要を示す。第１パターンの場合、例えばレコードの抽出処理では、矢印１１０１に示すように、抽出部は、既存インデックス域７０１を参照して既存データ域５０５へアクセスする。同じく、例えばレコードの挿入処理では、矢印１１０３に示すように、挿入部は、既存インデックス域７０１を参照して既存データ域５０５へアクセスし、矢印１１０５に示すように、既存インデックス域７０１を更新する。
【００４４】
図１０の説明に戻って、トランザクションＡにおける処理Ａ−２とトランザクションＢにおける処理Ｂ−２は、時点１００３で新規インデックスが完成した後であっても、既存インデックス域７０１を用いて実行される。但し、新規インデックス域５０３との整合も図るようにする。この例では、このようなパターンを第２パターンという。
【００４５】
図１２に、第２パターンにおけるデータアクセスの概要を示す。第２パターンの場合、例えばレコードの抽出処理では、矢印１２０１に示すように、抽出部は、既存インデックス域７０１を参照して既存データ域５０５へアクセスする。同じく、例えばレコードの挿入処理では、矢印１２０３に示すように、挿入部は、既存インデックス域７０１を参照して既存データ域５０５へアクセスし、矢印１２０５に示すように、既存インデックス域７０１を更新する。更に、挿入部は、矢印１２０７に示すように、新規インデックス域５０３も更新する。
【００４６】
図１０の説明に戻って、時点１００３で新規インデックスが完成した後に開始したトランザクションＣにおける処理Ｃ−１は、新規インデックス域５０３を用いて実行される。但し、既存インデックス域７０１との整合も図るようにする。この例では、このようなパターンを第３パターンという。
【００４７】
図１３に、第３パターンにおけるデータアクセスの概要を示す。第３パターンでは、追加データ域５０７にアクセスする場合と、既存データ域５０５にアクセスする場合とがある。
【００４８】
例えばレコードの抽出処理で追加データ域５０７にアクセスする場合には、矢印１３０１に示すように、抽出部は、新規インデックス域５０３を参照して追加データ域５０７へアクセスする。また、例えばレコードの挿入処理で追加データ域５０７にアクセスする場合には、矢印１３０３に示すように、挿入部は、新規インデックス域５０３を参照して追加データ域５０７へアクセスし、矢印１３０５に示すように、新規インデックス域５０３を更新する。
【００４９】
一方、例えばレコードの抽出処理で既存データ域５０５にアクセスする場合には、矢印１３０７に示すように、抽出部は、新規インデックス域５０３を参照して既存データ域５０５へアクセスする。また、例えばレコードの挿入処理で既存データ域５０５にアクセスする場合には、矢印１３０９に示すように、挿入部は、新規インデックス域５０３を参照して既存データ域５０５へアクセスし、矢印１３１１に示すように、新規インデックス域５０３を更新する。更に、挿入部は、矢印１３１３に示すように、既存インデックス域７０１も更新する。
【００５０】
図１０の説明に戻って、時点１００５以降は、新規インデックス域５０３のみが残り、レコードの挿入処理もレコードの更新処理も、新規インデックス域５０３を用いてデータアクセスする。つまり、トランザクションＣにおける処理Ｃ−２のような場合は、通常モードの通常パターンによって実行される。
【００５１】
本実施の形態では、生成処理によってノードの重複が生じないかを検証する。図１４に、生成処理におけるノードの重複の例を示す。既存リーフノード域７０３においてキー値「５０」とＴＩＤ「２９００」との組を保持するノードと、要素列７０９においてキー値「５０」とＴＩＤ「１２４００」との組を保持する要素とを、新規リーフノード域５０９に反映させると、同じキー値「５０」を保持するノードが重複することになる。
【００５２】
このように、ノードの重複が生じる場合には、重複リスト１４０１においてキー値「５０」と重複数「１」とを対応付けて記憶する。重複リスト１４０１におけるキー値は、重複したキー値を示している。
【００５３】
また、本実施の形態では、反映処理によってノードの重複が生じないかを検証する。図１５に、反映処理におけるノードの重複の例を示す。上段では、生成処理によって既にノードの重複が生じている状態を示している。
【００５４】
中段では、反映処理において、アーカイブログ７０７の第１レコードを適用して、キー値「５０」とＴＩＤ「２９００」との組を保持するノードを削除する処理を行なう。その結果、キー値「５０」を有するノードが１つになる。つまり、重複が解消する。そして、重複リスト１４０１におけるキー値「５０」に対応する重複数は「０」となる。このような場合には、重複リスト１４０１におけるキー値「５０」のレコードは削除される。
【００５５】
下段では、反映処理において、アーカイブログ７０７の第２レコードを適用して、キー値「６０」とＴＩＤ「７０」との組を保持するノードを挿入する処理を行なう。その結果、同じキー値「６０」を保持するノードが重複することになる。このように、ノードの重複が生じる場合には、重複リスト１４０１に登録する。この例では、重複リスト１４０１においてキー値「６０」と、重複数「１」とを対応付けて記憶する。尚、同じキー値について既に重複が生じている場合には、重複数に１を加算する。
【００５６】
このように、反映処理においてノードの重複が解消する場合と、ノードの重複が発生する場合とがある。
【００５７】
上述したように生成処理及び反映処理を通じてノードの重複が生じるかを検証し、ノードの重複が生じる場合には、データの一括追加を取り消す。このようにすれば、データの一括追加が成功した場合に、新規リーフノード域５０９における一意性が担保されるようになる。
【００５８】
次に、データ記憶部２０７の構成について説明する。図１６に、データ記憶部２０７の構成例を示す。データ記憶部２０７は、テーブル記憶部１６０１、アーカイブログ記憶部１６０３、トランザクションテーブル記憶部１６０５、重複リスト記憶部１６０７、制御データ記憶部１６０９及び取消用ログ記憶部１６１１を有している。テーブル記憶部１６０１は、通常モードにおいて、データベースで管理されるテーブルのデータ（図３）を記憶する。また、テーブル記憶部１６０１は、追加モードにおいて、図７に示した新規インデックス域５０３、既存テーブルのデータ、追加データ域５０７及び要素列７０９などに相当するデータを記憶する。アーカイブログ記憶部１６０３は、アーカイブログ７０７を記憶する。トランザクションテーブル記憶部１６０５は、トランザクションテーブルを記憶する。重複リスト記憶部１６０７は、重複リスト１４０１を記憶する。制御データ記憶部１６０９は、制御データを記憶する。取消用ログ記憶部１６１１は、取消用ログを記憶する。
【００５９】
ここで、トランザクションテーブルについて説明する。図１７に、トランザクションテーブルの構成例を示す。この例におけるトランザクションテーブルは、トランザクション毎にレコードを有している。レコードは、トランザクションＩＤを設定するためのフィールドと、トランザクションのステータスを設定するためのフィールドと、トランザクションの開始時刻を設定するためのフィールドとを有している。トランザクションが開始した時点で、ステータスには「開始」が設定される。そして、トランザクションが完了した時点で、ステータスには「完了」が設定される。トランザクションが取り消された場合には、トランザクションが取り消された時点で、ステータスに「取消」が設定される。つまり、ステータスに「開始」が設定されている場合には、当該トランザクションは継続していることを意味する。
【００６０】
次に、制御データについて説明する。図１８に、制御データの構成例を示す。制御データ記憶部１６０９には、現在のモード１８０１を設定するフィールドが設けられている。現在のモード１８０１は、「通常モード」あるいは「追加モード」である。現在のモード１８０１が「通常モード」である場合には、制御データ記憶部１６０９に設けられている通常モードのインデックス域用ポインタ１８０３が用いられる。通常モードのインデックス域用ポインタ１８０３は、通常モードにおいてインデックス域にアクセスする場合に用いられる。
【００６１】
現在のモード１８０１が「追加モード」である場合には、制御データ記憶部１６０９に設けられている既存インデックス域用ポインタ１８０５、新規インデックス域用ポインタ１８０７及び新規インデックスの完成時刻１８０９が用いられる。既存インデックス域用ポインタ１８０５は、追加モードにおいて既存インデックス域７０１にアクセスする場合に用いられる。新規インデックス域用ポインタ１８０７は、追加モードにおいて新規インデックス域５０３にアクセスする場合に用いられる。新規インデックスの完成時刻１８０９は、新規インデックス域５０３が有効になった時点を指す。
【００６２】
図１９に、実行部２０５の構成例を示す。実行部２０５は、制御部１９０１及び操作部１９１１を有している。制御部１９０１は、トランザクションを制御する。制御部１９０１は、開始部１９０３、完了部１９０５及び取消部１９０７を有している。開始部１９０３は、トランザクション開始処理を実行する。完了部１９０５は、トランザクション完了処理を実行する。取消部１９０７は、トランザクション取消処理を実行する。
【００６３】
操作部１９１１は、テーブルに含まれるレコードを操作する。操作部１９１１は、第１抽出部１９１３、挿入部１９１５、削除部１９１７、更新部１９１９及び判定部１９２１を有している。第１抽出部１９１３は、レコード抽出処理を実行する。挿入部１９１５は、レコード挿入処理を実行する。削除部１９１７は、レコード削除処理を実行する。更新部１９１９は、レコード更新処理を実行する。判定部１９２１は、パターン判定処理を実行する。
【００６４】
上述した制御部１９０１、開始部１９０３、完了部１９０５、取消部１９０７、操作部１９１１、第１抽出部１９１３、挿入部１９１５、削除部１９１７、更新部１９１９及び判定部１９２１は、ハードウエア資源（例えば、図４２）と、以下で述べる処理をプロセッサに実行させるプログラムとを用いて実現される。
【００６５】
続いて、実行部２０５の処理について説明する。図２０に、実行部２０５のメイン処理フローを示す。第１受付部２０３は、ＢＥＧＩＮ文を受け付ける（Ｓ２００１）。ＢＥＧＩＮ文を受け付けると、開始部１９０３は、トランザクション開始処理を実行する（Ｓ２００３）。
【００６６】
図２１に、トランザクション開始処理フローを示す。開始部１９０３は、トランザクションテーブルに当該トランザクションのレコードを設け、当該トランザクションのレコードにおけるステータスのフィールドに「開始」を設定し、更に当該トランザクションのレコードにおける開始時刻のフィールドに現在時刻を設定する（Ｓ２１０１）。そして、開始部１９０３は、トランザクションの制御プロセスを起動する（Ｓ２１０３）。トランザクションの制御プロセスを起動させると、トランザクションの制御プロセスの終了を待たずに、開始部１９０３は、トランザクション開始処理を終える。そして、図２０のＳ２００１に戻る。
【００６７】
次に、トランザクションの制御プロセスにおける処理について説明する。図２２に、トランザクションの制御プロセスにおける処理フローを示す。第１受付部２０３は、当該トランザクションに係るＳＱＬ文６０１を受け付ける（Ｓ２２０１）。
【００６８】
そして、判定部１９２１は、パターン判定処理を実行する（Ｓ２２０２）。図２３に、パターン判定処理フローを示す。判定部１９２１は、制御データ記憶部１６０９から現在のモード１８０１を読む（Ｓ２３０１）。判定部１９２１は、現在のモード１８０１が「追加モード」であるか否かを判定する（Ｓ２３０３）。
【００６９】
現在のモード１８０１が「追加モード」ではないと判定した場合、つまり現在のモード１８０１が「通常モード」である場合には、判定部１９２１は、通常パターンであると判定する（Ｓ２３０５）。そして、パターン判定処理を終え、図２２に示したＳ２２０３の処理に戻る。
【００７０】
一方、現在のモード１８０１が「追加モード」であると判定した場合には、判定部１９２１は、制御データ記憶部１６０９から新規インデックスの完成時刻１８０９を読む（Ｓ２３０７）。そして、判定部１９２１は、新規インデックスが完成しているか否かを判定する（Ｓ２３０９）。具体的は、判定部１９２１は、新規インデックスの完成時刻１８０９が設定されている場合に、新規インデックスが完成していると判定する。また、判定部１９２１は、新規インデックスの完成時刻１８０９が未だ設定されていない場合に、新規インデックスが完成していないと判定する。
【００７１】
新規インデックスが完成していないと判定した場合には、判定部１９２１は、第１パターンであると判定する（Ｓ２３１１）。そして、パターン判定処理を終え、図２２に示したＳ２２０３の処理に戻る。
【００７２】
一方、Ｓ２３０９において、新規インデックスが完成していると判定した場合には、判定部１９２１は、トランザクションテーブル記憶部１６０５から、当該トランザクションの開始時刻を読む（Ｓ２３１３）。そして、判定部１９２１は、当該トランザクションの開始時刻が新規インデックスの完成時刻１８０９より前であるか否かを判定する（Ｓ２３１５）。
【００７３】
当該トランザクションの開始時刻が新規インデックスの完成時刻１８０９より前であると判定した場合には、判定部１９２１は、第２パターンであると判定する（Ｓ２３１７）。そして、パターン判定処理を終え、図２２に示したＳ２２０３の処理に戻る。
【００７４】
一方、Ｓ２３１５において、トランザクションの開始時刻が新規インデックスの完成時刻１８０９より前ではないと判定した場合、つまりトランザクションの開始時刻が新規インデックスの完成時刻１８０９より後である場合には、判定部１９２１は、第３パターンであると判定する（Ｓ２３１９）。そして、パターン判定処理を終え、図２２に示したＳ２２０３の処理に戻る。
【００７５】
図２２の説明に戻る。第１抽出部１９１３は、受け付けたＳＱＬ文６０１がＳＥＬＥＣＴ文であるか否かを判定する（Ｓ２２０３）。受け付けたＳＱＬ文６０１がＳＥＬＥＣＴ文であると判定した場合には、第１抽出部１９１３は、レコード抽出処理を実行する（Ｓ２２０５）。レコード抽出処理については、図２４を用いて後述する。レコード挿入処理を終えると、Ｓ２２０１に示した処理に戻る。
【００７６】
一方、受け付けたＳＱＬ文６０１がＳＥＬＥＣＴ文ではないと判定した場合には、挿入部１９１５は、受け付けたＳＱＬ文６０１がＩＮＳＥＲＴ文であるか否かを判定する（Ｓ２２０７）。受け付けたＳＱＬ文６０１がＩＮＳＥＲＴ文であると判定した場合には、挿入部１９１５は、レコード挿入処理を実行する（Ｓ２２０９）。レコード挿入処理については、図２５Ａ及び図２５Ｂを用いて後述する。レコード挿入処理を終えると、Ｓ２２０１に示した処理に戻る。
【００７７】
一方、受け付けたＳＱＬ文６０１がＩＮＳＥＲＴ文ではないと判定した場合には、削除部１９１７は、受け付けたＳＱＬ文６０１がＤＥＬＥＴＥ文であるか否かを判定する（Ｓ２２１１）。受け付けたＳＱＬ文６０１がＤＥＬＥＴＥ文であると判定した場合には、削除部１９１７は、レコード削除処理を実行する（Ｓ２２１３）。レコード削除処理については、図２６Ａ及び図２６Ｂを用いて後述する。レコード削除処理を終えると、Ｓ２２０１に示した処理に戻る。
【００７８】
一方、受け付けたＳＱＬ文６０１がＤＥＬＥＴＥ文ではないと判定した場合には、更新部１９１９は、受け付けたＳＱＬ文６０１がＵＰＤＡＴＥ文であるか否かを判定する（Ｓ２２１５）。受け付けたＳＱＬ文６０１がＵＰＤＡＴＥ文であると判定した場合には、更新部１９１９は、レコード更新処理を実行する（Ｓ２２１７）。レコード更新処理については、図２７Ａ乃至図２７Ｄを用いて後述する。レコード更新処理を終えると、Ｓ２２０１に示した処理に戻る。
【００７９】
一方、受け付けたＳＱＬ文６０１がＵＰＤＡＴＥ文ではないと判定した場合には、完了部１９０５は、受け付けたＳＱＬ文６０１がＣＯＭＭＩＴ文であるか否かを判定する（Ｓ２２１９）。受け付けたＳＱＬ文６０１がＣＯＭＭＩＴ文であると判定した場合には、完了部１９０５は、トランザクション完了処理を実行する（Ｓ２２２１）。トランザクション完了処理については、図２８を用いて後述する。トランザクション完了処理を終えると、トランザクションの制御プロセスは終了する。
【００８０】
一方、受け付けたＳＱＬ文６０１がＣＯＭＭＩＴ文ではないと判定した場合には、取消部１９０７は、受け付けたＳＱＬ文６０１がＲＯＬＬＢＡＣＫ文であるか否かを判定する（Ｓ２２２３）。受け付けたＳＱＬ文６０１がＲＯＬＬＢＡＣＫ文であると判定した場合には、取消部１９０７は、トランザクション取消処理を実行する（Ｓ２２２５）。トランザクション取消処理については、図２９を用いて後述する。トランザクション取消処理を終えると、トランザクションの制御プロセスは終了する。
【００８１】
一方、受け付けたＳＱＬ文６０１がＲＯＬＬＢＡＣＫ文ではないと判定した場合には、この例ではＳ２２０１に示した処理に戻る。
【００８２】
次に、レコード抽出処理について説明する。図２４に、レコード抽出処理フローを示す。図２２のＳ２２０２に示したパターン判定処理において第１パターンであると判定したか否かによって、第１抽出部１９１３による処理が分岐する（Ｓ２４０１）。第１パターンであると判定した場合には、第１抽出部１９１３は、既存インデックス域７０１を参照し、既存データ域５０５からレコードを抽出する（Ｓ２４０３）。そして、第１抽出部１９１３は、抽出されたレコードをアプリケーション部１０９へ返す（Ｓ２４１５）。
【００８３】
一方、第１パターンではない場合には、図２２のＳ２２０２に示したパターン判定処理において第２パターンであると判定したか否かによって、第１抽出部１９１３による処理が分岐する（Ｓ２４０５）。第２パターンであると判定した場合には、第１抽出部１９１３は、既存インデックス域７０１を参照し、既存データ域５０５からレコードを抽出する（Ｓ２４０７）。そして、第１抽出部１９１３は、抽出されたレコードをアプリケーション部１０９へ返す（Ｓ２４１５）。
【００８４】
一方、第２パターンでもない場合には、図２２のＳ２２０２に示したパターン判定処理において第３パターンであると判定したか否かによって、第１抽出部１９１３による処理が分岐する（Ｓ２４０９）。第３パターンであると判定した場合には、第１抽出部１９１３は、新規インデックス域５０３を参照し、既存データ域５０５又は新規データ域５０１からレコードを抽出する（Ｓ２４１１）。このとき、例えばＴＩＤに従って、既存データ域５０５又は新規データ域５０１のいずれかが特定される。そして、第１抽出部１９１３は、抽出されたレコードをアプリケーション部１０９へ返す（Ｓ２４１５）。
【００８５】
更に、第３パターンでもない場合、つまり図２２のＳ２２０２に示したパターン判定処理において通常パターンであると判定した場合には、第１抽出部１９１３は、通常モードのインデックス域を参照し、通常モードのデータ域からレコードを抽出する（Ｓ２４１３）。そして、第１抽出部１９１３は、抽出されたレコードをアプリケーション部１０９へ返す（Ｓ２４１５）。
【００８６】
抽出されたレコードをアプリケーション部１０９へ返すと、レコード抽出処理は終わる。
【００８７】
次に、レコード挿入処理について説明する。図２５Ａ及び図２５Ｂに、レコード挿入処理フローを示す。図２２のＳ２２０２に示したパターン判定処理において第１パターンであると判定したか否かによって、挿入部１９１５による処理が分岐する（Ｓ２５０１）。第１パターンであると判定した場合には、挿入部１９１５は、既存インデックス域７０１を参照し、既存データ域５０５にレコードを追加する（Ｓ２５０３）。そして、挿入部１９１５は、追加したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１に追加する（Ｓ２５０５）。そして、端子Ａを介して、図２５Ｂに示したＳ２５２９の処理に移る。
【００８８】
一方、第１パターンではない場合には、図２２のＳ２２０２に示したパターン判定処理において第２パターンであると判定したか否かによって、挿入部１９１５による処理が分岐する（Ｓ２５０７）。第２パターンであると判定した場合には、挿入部１９１５は、既存インデックス域７０１を参照し、既存データ域５０５にレコードを追加する（Ｓ２５０９）。そして、挿入部１９１５は、追加したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１に追加する（Ｓ２５１１）。更に、挿入部１９１５は、追加したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３にも追加する（Ｓ２５１３）。そして、端子Ａを介して、図２５Ｂに示したＳ２５２９の処理に移る。
【００８９】
一方、第２パターンでもない場合には、端子Ｂを介して、図２５Ｂに示したＳ２５１５の処理に移る。図２２のＳ２２０２に示したパターン判定処理において第３パターンであると判定したか否かによって、挿入部１９１５による処理が分岐する（Ｓ２５１５）。第３パターンであると判定した場合には、挿入部１９１５は、新規インデックス域５０３を参照し、新規データ域５０１又は既存データ域５０５にレコードを追加する（Ｓ２５１７）。このとき、例えばＴＩＤに従って、既存データ域５０５又は新規データ域５０１のいずれかが特定される。挿入部１９１５は、追加したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３に追加する（Ｓ２５１９）。そして、挿入部１９１５は、既存データ域５０５にレコードを追加したか否かを判定する（Ｓ２５２１）。既存データ域５０５にレコードを追加したと判定した場合には、挿入部１９１５は、更に、追加したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１にも追加する（Ｓ２５２３）。一方、既存データ域５０５にレコードを追加していないと判定した場合、つまり新規データ域５０１にレコードを追加した場合には、既存インデックス域７０１にノードを追加しない。そして、Ｓ２５２９の処理に移る。
【００９０】
Ｓ２５１５における分岐の説明に戻る。第３パターンでもない場合、つまり図２２のＳ２２０２に示したパターン判定処理において通常パターンであると判定した場合には、挿入部１９１５は、通常モードのインデックス域を参照し、通常モードのデータ域にレコードを追加する（Ｓ２５２５）。そして、挿入部１９１５は、追加したレコードのキー値とＴＩＤとの組を保持するノードを通常モードのインデックス域に追加する（Ｓ２５２７）。
【００９１】
上述したように、いずれかのパターンによるレコードの追加とノードの追加とを終えると、記録処理部２１５は、アーカイブログ７０７にレコード挿入処理の内容を記録する（Ｓ２５２９）。このとき記録されるデータは、追加したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「挿入」とである。記録処理部２１５は、取消用ログにレコード挿入処理に対する取消処理の内容を記録する（Ｓ２５３１）。このとき記録されるデータは、追加したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「削除」とである。
【００９２】
次に、レコード削除処理について説明する。図２６Ａ及び図２６Ｂに、レコード削除処理フローを示す。図２２のＳ２２０２に示したパターン判定処理において第１パターンであると判定したか否かによって、削除部１９１７による処理が分岐する（Ｓ２６０１）。第１パターンであると判定した場合には、削除部１９１７は、既存インデックス域７０１を参照し、既存データ域５０５からレコードを削除する（Ｓ２６０３）。そして、削除部１９１７は、削除したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１から削除する（Ｓ２６０５）。そして、端子Ｃを介して、図２６Ｂに示したＳ２６２９の処理に移る。
【００９３】
一方、第１パターンではない場合には、図２２のＳ２２０２に示したパターン判定処理において第２パターンであると判定したか否かによって、削除部１９１７による処理が分岐する（Ｓ２６０７）。第２パターンであると判定した場合には、削除部１９１７は、既存インデックス域７０１を参照し、既存データ域５０５からレコードを削除する（Ｓ２６０９）。そして、削除部１９１７は、削除したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１から削除する（Ｓ２６１１）。更に、削除部１９１７は、削除したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３からも削除する（Ｓ２６１３）。そして、端子Ｃを介して、図２６Ｂに示したＳ２６２９の処理に移る。
【００９４】
一方、第２パターンでもない場合には、端子Ｄを介して、図２６Ｂに示したＳ２６１５の処理に移る。図２２のＳ２２０２に示したパターン判定処理において第３パターンであると判定したか否かによって、削除部１９１７による処理が分岐する（Ｓ２６１５）。第３パターンであると判定した場合には、削除部１９１７は、新規インデックス域５０３を参照し、新規データ域５０１又は既存データ域５０５からレコードを削除する（Ｓ２６１７）。このとき、例えばＴＩＤに従って、既存データ域５０５又は新規データ域５０１のいずれかが特定される。削除部１９１７は、削除したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３から削除する（Ｓ２６１９）。そして、削除部１９１７は、既存データ域５０５からレコードを削除したか否かを判定する（Ｓ２６２１）。既存データ域５０５からレコードを削除したと判定した場合には、削除部１９１７は、更に、削除したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１から削除する（Ｓ２６２３）。一方、既存データ域５０５からレコードを削除していないと判定した場合、つまり新規データ域５０１からレコードを削除した場合には、既存インデックス域７０１からノードを削除しない。そして、Ｓ２６２９の処理に移る。
【００９５】
Ｓ２６１５における分岐の説明に戻る。第３パターンでもない場合、つまり図２２のＳ２２０２に示したパターン判定処理において通常パターンであると判定した場合には、削除部１９１７は、通常モードのインデックス域を参照し、通常モードのデータ域からレコードを削除する（Ｓ２６２５）。そして、削除部１９１７は、削除したレコードのキー値とＴＩＤとの組を保持するノードを通常モードのインデックス域から削除する（Ｓ２６２７）。
【００９６】
上述したように、いずれかのパターンによるレコードの削除とノードの削除とを終えると、記録処理部２１５は、アーカイブログ７０７にレコード削除処理の内容を記録する（Ｓ２６２９）。このとき記録されるデータは、削除したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「削除」とである。記録処理部２１５は、取消用ログにレコード削除処理に対する取消処理の内容を記録する（Ｓ２６３１）。このとき記録されるデータは、削除したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「挿入」とである。
【００９７】
次に、レコード更新処理について説明する。図２７Ａ乃至図２７Ｄに、レコード更新処理フローを示す。図２２のＳ２２０２に示したパターン判定処理において第１パターンであると判定したか否かによって、更新部１９１９による処理が分岐する（Ｓ２７０１）。第１パターンであると判定した場合には、更新部１９１９は、既存インデックス域７０１を参照し、既存データ域５０５から更新前レコードを削除する（Ｓ２７０３）。更新部１９１９は、削除したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１から削除する（Ｓ２７０５）。また、更新部１９１９は、既存インデックス域７０１を参照し、既存データ域５０５に更新後レコードを追加する（Ｓ２７０７）。そして、更新部１９１９は、追加したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１に追加する（Ｓ２７０９）。そして、端子Ｅを介して、図２７Ｄに示したＳ２７５１の処理に移る。
【００９８】
Ｓ２７０１における分岐の説明に戻る。第１パターンではない場合には、端子Ｆを介して、図２７Ｂに示したＳ２７１１の処理に移る。図２２のＳ２２０２に示したパターン判定処理において第２パターンであると判定したか否かによって、更新部１９１９による処理が分岐する（Ｓ２７１１）。第２パターンであると判定した場合には、更新部１９１９は、既存インデックス域７０１を参照し、既存データ域５０５から更新前レコードを削除する（Ｓ２７１３）。更新部１９１９は、削除したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１から削除する（Ｓ２７１５）。更に、更新部１９１９は、削除したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックスからも削除する（Ｓ２７１７）。また、更新部１９１９は、既存インデックス域７０１を参照し、既存データ域５０５に更新後レコードを追加する（Ｓ２７１９）。更新部１９１９は、追加したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１に追加する（Ｓ２７２１）。そして、更新部１９１９は、追加したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３にも追加する（Ｓ２７２３）。そして、端子Ｅを介して、図２７Ｄに示したＳ２７５１の処理に移る。
【００９９】
Ｓ２７１１における分岐の説明に戻る。第２パターンでもない場合には、端子Ｇを介して、図２７Ｃに示したＳ２７２５の処理に移る。図２２のＳ２２０２に示したパターン判定処理において第３パターンであると判定したか否かによって、更新部１９１９による処理が分岐する（Ｓ２７２５）。第３パターンであると判定した場合には、更新部１９１９は、新規インデックス域５０３を参照し、新規データ域５０１又は既存データ域５０５から更新前レコードを削除する（Ｓ２７２７）。このとき、例えばＴＩＤに従って、既存データ域５０５又は新規データ域５０１のいずれかが特定される。更新部１９１９は、削除したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３から削除する（Ｓ２７２９）。そして、更新部１９１９は、既存データ域５０５からレコードを削除したか否かを判定する（Ｓ２７３１）。既存データ域５０５からレコードを削除したと判定した場合には、更新部１９１９は、削除したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１からも削除する（Ｓ２７３３）。一方、既存データ域５０５からレコードを削除していないと判定した場合、つまり新規データ域５０１からレコードを削除した場合には、既存インデックス域７０１からノードを削除しない。
【０１００】
更に、更新部１９１９は、新規インデックス域５０３を参照し、新規データ域５０１又は既存データ域５０５に更新後レコードを追加する（Ｓ２７３５）。このとき、例えばＴＩＤに従って、既存データ域５０５又は新規データ域５０１のいずれかが特定される。更新部１９１９は、追加したレコードのキー値とＴＩＤとの組を保持するノードを新規インデックス域５０３に追加する（Ｓ２７３７）。そして、更新部１９１９は、既存データ域５０５にレコードを追加したか否かを判定する（Ｓ２７３９）。既存データ域５０５にレコードを追加したと判定した場合には、更新部１９１９は、追加したレコードのキー値とＴＩＤとの組を保持するノードを既存インデックス域７０１にも追加する（Ｓ２７４１）。一方、既存データ域５０５にレコードを追加していないと判定した場合、つまり新規データ域５０１にレコードを追加した場合には、既存インデックス域７０１にノードを追加しない。そして、端子Ｅを介して、図２７Ｄに示したＳ２７５１の処理に移る。
【０１０１】
Ｓ２７２５における分岐の説明に戻る。第３パターンでもない場合、つまり図２２のＳ２２０２に示したパターン判定処理において通常パターンであると判定した場合には、端子Ｈを介して、図２７Ｄに示したＳ２７４３の処理に移る。
【０１０２】
更新部１９１９は、通常モードのインデックス域を参照し、通常モードのデータ域から更新前レコードを削除する（Ｓ２７４３）。更新部１９１９は、削除したレコードのキー値とＴＩＤとの組を保持するノードを通常モードのインデックス域から削除する（Ｓ２７４５）。更新部１９１９は、通常モードのインデックス域を参照し、通常モードのデータ域に更新後レコードを追加する（Ｓ２７４７）。更新部１９１９は、追加したレコードのキー値とＴＩＤとの組を保持するノードを通常モードのインデックス域に追加する（Ｓ２７４９）。
【０１０３】
上述したように、いずれかのパターンによるレコードの削除とノードの削除とレコードの追加とノードの追加とを終えると、記録処理部２１５は、アーカイブログ７０７にレコード削除処理の内容を記録する（Ｓ２７５１）。このとき記録されるデータは、削除したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「削除」とである。記録処理部２１５は、取消用ログにレコード削除処理に対する取消処理の内容を記録する（Ｓ２７５３）。このとき記録されるデータは、削除したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「挿入」とである。記録処理部２１５は、アーカイブログ７０７にレコード挿入処理の内容を記録する（Ｓ２７５５）。このとき記録されるデータは、追加したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「挿入」とである。記録処理部２１５は、取消用ログにレコード挿入処理に対する取消処理の内容を記録する（Ｓ２７５７）。このとき記録されるデータは、追加したレコードのキー値とＴＩＤとの組と、ノード操作種別としての「削除」とである。
【０１０４】
次に、トランザクション完了処理について説明する。図２８に、トランザクション完了処理フローを示す。完了部１９０５は、トランザクションテーブルにおいて完了させるトランザクションのレコードを特定し、当該レコードにおけるステータスのフィールドに「完了」を設定する（Ｓ２８０１）。記録処理部２１５は、当該トランザクションの取消用ログを消去する（Ｓ２８０３）。これ以降、当該トランザクションのロールバックが行なわれることはないからである。そして、記録処理部２１５は、アーカイブログ７０７にトランザクション完了処理を記録する（Ｓ２８０５）。トランザクション完了処理を終えると、図２２に示したトランザクションの制御プロセスは終了する。
【０１０５】
次に、トランザクション取消処理について説明する。図２９に、トランザクション取消処理フローを示す。取消部１９０７は、トランザクションテーブルにおいて取り消されるトランザクションのレコードを特定し、当該レコードにおけるステータスのフィールドに「取消」を設定する（Ｓ２９０１）。取消部１９０７は、取消用ログに従ってロールバックを行なう（Ｓ２９０３）。取消部１９０７は、取消用ログを削除する（Ｓ２９０５）。そして、取消部１９０７は、アーカイブログ７０７にトランザクション取消処理の内容を記録する（Ｓ２９０７）。トランザクション取消処理を終えると、図２２に示したトランザクションの制御プロセスは終了する。以上で、実行部２０５についての説明を終える。
【０１０６】
次に、一括追加部２１３について説明する。図３０に、一括追加部２１３の構成例を示す。一括追加部２１３は、格納処理部３００１、切替部３００３、第２抽出部３００５、検証部３００７、生成部３００９、反映部３０１１、判定部３０１３、待機部３０１５及び除去部３０１７を有している。
【０１０７】
格納処理部３００１は、例えば追加データ域５０７に追加データを格納する。切替部３００３は、モードの切り替えを行なう。第２抽出部３００５は、追加データから要素列７０９を抽出する。検証部３００７は、例えばデータベースにおける一意性に関する検証を行なう。生成部３００９は、生成処理を実行する。反映部３０１１は、反映処理を実行する。判定部３０１３は、新規インデックスが完成した時点を判定する。待機部３０１５は、待機処理を実行する。除去部３０１７は、不要になったデータを除去する。
【０１０８】
上述した格納処理部３００１、切替部３００３、第２抽出部３００５、検証部３００７、生成部３００９、反映部３０１１、判定部３０１３、待機部３０１５及び除去部３０１７は、ハードウエア資源（例えば、図４２）と、以下で述べる処理をプロセッサに実行させるプログラムとを用いて実現される。
【０１０９】
続いて、一括追加部２１３により実行される一括追加処理について説明する。図３１及び図３２に、一括追加処理フローを示す。第２受付部２１１は、追加要求を受け付ける（Ｓ３１０１）。格納処理部３００１は、追加データ域５０７に追加データを格納する（Ｓ３１０３）。この例における追加データは、データベースにおけるテーブルに追加される複数のレコードを含んでいる。格納処理部３００１は、更に、新規インデックス域５０３を設ける（Ｓ３１０４）。
【０１１０】
切替部３００３は、追加モードへ切り替える（Ｓ３１０５）。このとき、切替部３００３は、制御データ記憶部１６０９における現在のモード１８０１のフィールドに「追加モード」を設定する。第２抽出部３００５は、追加データから要素列７０９を抽出する（Ｓ３１０７）。この例で抽出される要素は、新規リーフノード域５０９に追加すべきキー値とＴＩＤとの組を含んでいる。
【０１１１】
次に、検証部３００７は、追加データにおける一意性制約について検証する（Ｓ３１０９）。具体的は、検証部３００７は、要素列７０９に含まれる各キー値について、同じキー値が要素列７０９の中に２つ以上含まれているか否かを判定する。
【０１１２】
そして、検証部３００７は、追加データが一意性制約を満たすか否かを判定する（Ｓ３１１１）。検証部３００７は、要素列７０９の中に同じキー値が２つ以上含まれていない場合には、追加データが一意性制約を満たすと判定する。一方、検証部３００７は、要素列７０９の中に同じキー値が２つ以上含まれている場合には、追加データが一意性制約を満たさないと判定する。
【０１１３】
一意性制約を満たさないと判定した場合には、除去部３０１７は、追加データ域５０７と新規インデックス域５０３とを除去する（Ｓ３１１３）。このとき、除去部３０１７は、更に要素列７０９も除去する。切替部３００３は、制御データ記憶部１６０９における通常モードのインデックス域用ポインタ１８０３を設定して、現在のモード１８０１を「通常モード」に切り替える（Ｓ３１１５）。このとき、制御データ記憶部１６０９における通常モードのインデックス域用ポインタ１８０３には、制御データ記憶部１６０９における既存インデックス域用ポインタ１８０５がコピーされる。一括追加部２１３は、失敗を示す返り値をローダ部１０７へ返す（Ｓ３１１７）。そして、一括追加部２１３は、一括追加処理を終える。
【０１１４】
一方、Ｓ３１１１において、一意性制約を満たすと判定した場合には、記録処理部２１５は、アーカイブログ記憶部１６０３に記憶されているアーカイブログ７０７にチェックポイントを追加する（Ｓ３１１９）。チェックポイントは、生成処理を開始した時点以降のレコードを特定するために用いられる。
【０１１５】
そして、生成部３００９は、生成処理を実行する（Ｓ３１２１）。生成部３００９は、生成処理において、図７のＳ７５７に示したように、既存リーフノード域７０３のノードと要素列７０９の要素とをマージして、新規リーフノード域５０９を生成する。以下、生成処理について、図３３乃至図３５を用いて説明する。
【０１１６】
図３３に、生成処理フローを示す。生成部３００９は、既存リーフノード域７０３の先頭（最初のノードの順位）に第１ポインタを設定する（Ｓ３３０１）。第１ポインタは、既存リーフノード域７０３における比較対象のノードを特定するために用いられる。第１ポインタは、ノードを指すが、当該ノードにおけるキー値を指しているとも解される。生成部３００９は、追加データから抽出された要素列７０９の先頭（最初の要素の順位）に第２ポインタを設定する（Ｓ３３０３）。第２ポインタは、要素列７０９おける比較対象の要素を特定するために用いられる。第２ポインタは、要素を指すが、当該要素におけるキー値を指しているとも解される。
【０１１７】
生成部３００９は、第１ポインタが指すキー値が、第２ポインタが指すキー値より小さいか否かを判定する（Ｓ３３０５）。第１ポインタが指すキー値が、第２ポインタが指すキー値より小さいと判定した場合には、生成部３００９は、第１ポインタが指すノードを新規リーフノード域５０９に追加する（Ｓ３３０７）。そして、生成部３００９は、第１ポインタが既存リーフノード域７０３の末尾（最後のノードの順位）を指しているか否かを判定する（Ｓ３３０９）。
【０１１８】
第１ポインタが既存リーフノード域７０３の末尾を指していると判定した場合には、生成部３００９は、第２ポインタが指す要素から最後の要素までを新たなノードとして新規リーフノード域５０９に追加する（Ｓ３３１１）。そして、生成処理を終え、図３１に示した端子Ｉを介して、図３２に示したＳ３２０１の処理に移る。
【０１１９】
一方、Ｓ３３０９において第１ポインタが既存リーフノード域７０３の末尾を指していないと判定した場合には、生成部３００９は、第１ポインタを次のノードに設定する（Ｓ３３１３）。そして、Ｓ３３０５の処理に戻る。
【０１２０】
Ｓ３３０５において、第１ポインタが指すキー値が第２ポインタが指すキー値より小さくないと判定した場合には、端子Ｋを介して、図３４に示したＳ３４０１の処理に移る。
【０１２１】
生成部３００９は、第２ポインタが指すキー値が、第１ポインタが指すキー値より小さいか否かを判定する（Ｓ３４０１）。第２ポインタが指すキー値が、第１ポインタが指すキー値より小さいと判定した場合には、生成部３００９は、第２ポインタが指す要素を新たなノードとして新規リーフノード域５０９に追加する（Ｓ３４０３）。そして、生成部３００９は、第２ポインタが要素列７０９の末尾（最後の要素の順位）を指しているか否かを判定する（Ｓ３４０５）。
【０１２２】
第２ポインタが要素列７０９の末尾を指していると判定した場合には、生成部３００９は、第１ポインタが指すノードから最後のノードまでを新規リーフノード域５０９に追加する（Ｓ３４０７）。そして、生成処理を終え、図３１に示した端子Ｉを介して、図３２に示したＳ３２０１の処理に移る。
【０１２３】
他方、第２ポインタが要素列７０９の末尾を指していないと判定した場合には、生成部３００９は、第２ポインタを次の要素に設定する（Ｓ３４０９）。そして、端子Ｌを介して図３３に示したＳ３３０５の処理に戻る。
【０１２４】
Ｓ３４０１において、第２ポインタが指すキー値が、第１ポインタが指すキー値より小さくないと判定した場合、つまり第１ポインタが指すキー値と第２ポインタが指すキー値とが等しい場合には、生成部３００９は、第１ポインタが指すノードを新規リーフノード域５０９に追加する（Ｓ３４１１）。更に、生成部３００９は、第２ポインタが指す要素を新たなノードとして新規リーフノード域５０９に追加する（Ｓ３４１３）。そして、生成部３００９は、重複リスト１４０１にキー値を追加する（Ｓ３４１５）。生成部３００９は、重複数に１を設定する（Ｓ３４１７）。Ｓ３４１５とＳ３４１７の処理によって、例えば図１４に示したように重複リスト１４０１が生成される。端子Ｍを介して、図３５に示したＳ３５０１の処理に移る。
【０１２５】
そして、生成部３００９は、第１ポインタが既存リーフノード域７０３の末尾を指しているか否かを判定する（Ｓ３５０１）。第１ポインタが既存リーフノード域７０３の末尾を指していると判定した場合には、生成部３００９は、第２ポインタが指す要素から最後の要素までを新たなノードとして新規リーフノード域５０９に追加する（Ｓ３５０３）。そして、生成処理を終え、図３１に示した端子Ｉを介して、図３２に示したＳ３２０１の処理に移る。
【０１２６】
一方、Ｓ３５０１において、第１ポインタが既存リーフノード域７０３の末尾を指していないと判定した場合には、生成部３００９は、第２ポインタが要素列７０９の末尾を指しているか否かを判定する（Ｓ３５０５）。第２ポインタが要素列７０９の末尾を指していると判定した場合には、生成部３００９は、第１ポインタが指すノードから最後のノードまでを新規リーフノード域５０９に追加する（Ｓ３５０７）。そして、生成処理を終え、図３１に示した端子Ｉを介して、図３２に示したＳ３２０１の処理に移る。
【０１２７】
Ｓ３５０５において、第２ポインタが要素列７０９の末尾を指していないと判定した場合には、生成部３００９は、第１ポインタを次のノードに設定する（Ｓ３５０９）。更に、生成部３００９は、第２ポインタを次の要素に設定する（Ｓ３５１１）。そして、端子Ｌを介して、図３３に示したＳ３３０５の処理に戻る。
【０１２８】
図３１に示したように、生成処理（Ｓ３１２１）を終えると、端子Ｉを介して、図３２に示したＳ３２０１の処理に移る。
【０１２９】
反映部３０１１は、反映処理を実行する（Ｓ３２０１）。反映部３０１１は、反映処理において、図７のＳ７５９に示したようにアーカイブログ７０７を新規リーフノード域５０９に適用する。以下、反映処理について、図３６乃至図３８を用いて説明する。
【０１３０】
図３６に、反映処理フローを示す。反映部３０１１は、アーカイブログ７０７においてチェックポイントの次のレコードを特定する（Ｓ３６０１）。反映部３０１１は、Ｓ３６０１又はＳ３６１３で特定されたレコードにおけるノード操作種別が「挿入」であるか否かを判定する（Ｓ３６０３）。上記特定されたレコードにおけるノード操作種別が「挿入」であると判定した場合には、反映部３０１１は、第１サブルーチン処理を実行する（Ｓ３６０５）。反映部３０１１は、第１サブルーチン処理において、データベースにおけるテーブルへのレコードの挿入に相当する適用の処理を行なう。
【０１３１】
図３７に、第１サブルーチン処理フローを示す。反映部３０１１は、図３６のＳ３６０１又はＳ３６１３において特定されたレコードのキー値及びＴＩＤと一致するキー値及びＴＩＤを有するノードがあるか否かを判定する（Ｓ３７０１）。上記特定されたレコードのキー値及びＴＩＤと一致するキー値及びＴＩＤを有するノードがあると判定した場合には、既にデータベースのテーブルにおけるレコードの挿入に相当する処理が済んでいるので、第１サブルーチン処理を終え、図３６に示したＳ３６１１の処理に戻る。この処理は、例えば図９のキー値「１０」且つＴＩＤ「５００」のレコード９０３の扱いに相当する。
【０１３２】
一方、Ｓ３７０１において上記特定されたレコードのキー値及びＴＩＤと一致するキー値及びＴＩＤを有するノードがないと判定した場合には、未だデータベースのテーブルにおけるレコードの挿入に相当する処理が済んでいないので、反映部３０１１は、レコードと同じキー値及びＴＩＤのノードを挿入する（Ｓ３７０３）。この処理は、例えば図９のキー値「７」且つＴＩＤ「２０００」のレコード９０１の扱いに相当する。
【０１３３】
そして、反映部３０１１は、上記特定されたレコードのキー値と一致するキー値を有するノードがあるか否かを判定する（Ｓ３７０５）。上記特定されたレコードのキー値と一致するキー値を有するノードがないと判定した場合には、キー値が重複していないので、第１サブルーチン処理を終え、図３６に示したＳ３６１１の処理に戻る。
【０１３４】
一方、上記特定されたレコードのキー値と一致するキー値を有するノードがあると判定した場合には、キー値が重複しているので、重複リスト１４０１に記録する。そのため、反映部３０１１は、当該キー値が重複リスト１４０１に既に記録されているか否かを判定する（Ｓ３７０７）。当該キー値が重複リスト１４０１に記録されていると判定した場合には、反映部３０１１は、重複数に１を加える（Ｓ３７０９）。
【０１３５】
一方、当該キー値が重複リスト１４０１に記録されていないと判定した場合には、反映部３０１１は、重複リスト１４０１にキー値を追加し（Ｓ３７１１）、反映部３０１１は、当該キー値に対応する重複数に１を設定する（Ｓ３７１３）。Ｓ３７１１とＳ３７１３との処理によって、例えば図１５の下段に示したように、重複リスト１４０１が更新される。第１サブルーチン処理を終えると、図３６に示したＳ３６１１の処理に戻る。
【０１３６】
図３６の説明に戻る。反映部３０１１は、Ｓ３６０１又はＳ３６１３で特定されたレコードにおけるノード操作種別が「削除」であるか否かを判定する（Ｓ３６０７）。上記特定されたレコードにおけるノード操作種別が「削除」であると判定した場合には、反映部３０１１は、第２サブルーチン処理を実行する（Ｓ３６０９）。反映部３０１１は、第２サブルーチン処理において、データベースにおけるテーブルからのレコードの削除に相当する適用の処理を行なう。尚、Ｓ３６０７において、上記特定されたレコードにおけるノード操作種別が「削除」ではないと判定した場合には、Ｓ３６１１の処理に移る。
【０１３７】
図３８に、第２サブルーチン処理フローを示す。反映部３０１１は、図３６のＳ３６０１又はＳ３６１３で特定されたレコードのキー値及びＴＩＤと一致するキー値及びＴＩＤを有するノードがあるか否かを判定する（Ｓ３８０１）。
【０１３８】
上記特定されたレコードのキー値及びＴＩＤと一致するキー値及びＴＩＤを有するノードがないと判定した場合には、既にデータベースのテーブルにおけるレコードの削除に相当する処理が済んでいるので、第２サブルーチン処理を終え、図３６に示したＳ３６１１の処理に戻る。この処理は、例えば図９のキー値「３０」且つＴＩＤ「１８００」のレコード９０５の扱いに相当する。
【０１３９】
一方、Ｓ３８０１において、上記特定されたレコードのキー値及びＴＩＤと一致するキー値及びＴＩＤを有するノードがあると判定した場合には、未だデータベースのテーブルにおけるレコードの削除に相当する処理が済んでいないので、反映部３０１１は、上記特定されたレコードと同じキー値及びＴＩＤのノードを削除する（Ｓ３８０３）。この処理は、例えば図９のキー値「２０」且つＴＩＤ「１０００」のレコード９０７の扱いに相当する。
【０１４０】
反映部３０１１は、上記特定されたレコードのキー値が重複リスト１４０１に記録されているか否かを判定する（Ｓ３８０５）。反映部３０１１は、上記特定されたレコードのキー値が重複リスト１４０１に記録されていないと判定した場合には、第２サブルーチン処理を終え、図３６に示したＳ３６１１の処理に戻る。
【０１４１】
一方、Ｓ３８０５において、上記特定されたレコードのキー値が重複リスト１４０１に記録されていると判定した場合には、反映部３０１１は、当該キー値に対応する重複数から１を引く（Ｓ３８０７）。反映部３０１１は、１を引かれた後の重複数が０であるか否かを判定する（Ｓ３８０９）。１を引かれた後の重複数が０であると判定した場合には、反映部３０１１は、重複リスト１４０１における当該キー値のレコードを削除する（Ｓ３８１１）。Ｓ３８０７〜Ｓ３８１１の処理によって、例えば図１５の中段に示したように、重複リスト１４０１が更新される。Ｓ３８０９において、１を引かれた後の重複数が０ではないと判定した場合には、第２サブルーチン処理を終える。第２サブルーチン処理を終えると、図３６に示したＳ３６１１の処理に戻る。
【０１４２】
図３６の説明に戻る。反映部３０１１は、Ｓ３６０１又はＳ３６１３で特定されたレコードが、最後のレコードであるか否かを判定する（Ｓ３６１１）。上記特定されたレコードが、最後のレコードではないと判定した場合には、反映部３０１１は、次のレコードを特定する（Ｓ３６１３）。そして、Ｓ３６０３の処理に戻る。
【０１４３】
一方、上記特定されたレコードが、最後のレコードであると判定した場合には、反映処理を終え、図３２に示したＳ３２０３の処理に戻る。
【０１４４】
図３２の説明に戻る。検証部３００７は、重複リスト１４０１に重複数が１以上のキー値が存在するか否かを判定する（Ｓ３２０３）。重複リスト１４０１に重複数が１以上のキー値が存在すると判定した場合には、除去部３０１７は、追加データと、新規インデックスとを除去する（Ｓ３２０５）。そして、切替部３００３は、制御データ記憶部１６０９における通常モードのインデックス域用ポインタ１８０３を設定して、現在のモード１８０１を「通常モード」に切り替える（Ｓ３２０７）。このとき、制御データ記憶部１６０９における通常モードのインデックス域用ポインタ１８０３には、制御データ記憶部１６０９における既存インデックス域用ポインタ１８０５がコピーされる。一括追加部２１３は、失敗を示す返り値をローダ部１０７へ返す（Ｓ３２０９）。そして、端子Ｊを介して図３１に示したＳ３１０１の処理に戻る。
【０１４５】
一方、Ｓ３２０３において、重複リスト１４０１に重複数が１以上のキーが存在しないと判定した場合には、検証部３００７は、取消検証処理を実行する（Ｓ３２１０）。トランザクション取消処理におけるロールバックによって取消用ログを適用する場合に、新規リーフノード域５０９においてノードの重複が生じないかを検証する。つまり、ロールバック後の新規リーフノード域５０９が一意性制約を満たすかを検証する。
【０１４６】
図３９に、取消用ログを適用する様子を示す。レコード３９０１は、キー値「１２０」及びＴＩＤ「３９００」を保持するノードを既存リーフノード域７０３から削除した際に生成された取消処理の内容を記録している。レコード３９０３は、キー値「１１０」及びＴＩＤ「３５００」を保持するノードを既存リーフノード域７０３に挿入した際に生成された取消処理の内容を記録している。レコード３９０５は、キー値「１３０」及びＴＩＤ「４１００」を保持するノードを既存リーフノード域７０３から削除した際に生成された取消処理の内容を記録している。
【０１４７】
レコード３９０１を新規リーフノード域５０９に適用する場合には、キー値「１２０」及びＴＩＤ「３９００」を保持するノードを新規リーフノード域５０９に追加する。但し、キー値「１２０」及びＴＩＤ「１４０００」を保持するノードが既に新規リーフノード域５０９に存在するので、同じキー値「１２０」を保持するノードが重複することになる。図３９の例で、ノードの重複が生じる適用例には、バツ印を付している。
【０１４８】
また、新規リーフノード域５０９には、キー値「１１０」及びＴＩＤ「３５００」を保持するノードが存在する。レコード３９０３を新規リーフノード域５０９に適用する場合には、このノードを新規リーフノード域５０９から削除する。この適用例では、ノードの重複は生じない。図３９の例で、ノードの重複が生じない適用例には、丸印を付している。
【０１４９】
更に、レコード３９０５を新規リーフノード域５０９に適用する場合には、キー値「１３０」及びＴＩＤ「４１００」を保持するノードを新規リーフノード域５０９に追加する。キー値「１３０」を保持するノードは新規リーフノード域５０９に存在しないので、ノードの重複は生じない。
【０１５０】
取消用ログの適用において、レコード３９０１の適用例に示したように、新規リーフノード域５０９にノードを挿入するタイプの取消処理、つまりノード操作種別が「挿入」である取消処理を行なうと、ノードの重複が生じる場合がある。取消検証処理では、このようなノードの重複が生じないかを検証する。
【０１５１】
図４０に、取消検証処理フローを示す。検証部３００７は、取消用ログから未処理のレコード、つまりＳ４００３以降の処理対象となっていないレコードを１つ特定する（Ｓ４００１）。検証部３００７は、特定されたレコードにおけるノード操作種別が「挿入」であるか否かを判定する（Ｓ４００３）。
【０１５２】
特定されたレコードにおけるノード操作種別が「挿入」であると判定した場合には、検証部３００７は、新規リーフノード域５０９に当該レコードのキー値と同じキー値を保持するノードが存在するか否かを判定する（Ｓ４００５）。
【０１５３】
新規リーフノード域５０９に当該レコードのキー値と同じキー値を保持するノードが存在すると判定した場合には、検証部３００７は、ノードの重複が発生すると判定する（Ｓ４００７）。取消検証処理を終えると、図３２に示したＳ３２１１の処理に戻る。
【０１５４】
一方、Ｓ４００３において、特定されたレコードにおけるノード操作種別が「挿入」ではないと判定した場合、つまり当該レコードにおけるノード操作種別が「削除」である場合には、検証部３００７は、取消用ログに未処理のレコードがあるか否かを判定する（Ｓ４００９）。
【０１５５】
また、Ｓ４００５において、新規リーフノード域５０９に当該レコードのキー値と同じキー値を保持するノードが存在しないと判定した場合にも、検証部３００７は、取消用ログに未処理のレコードがあるか否かを判定する（Ｓ４００９）。
【０１５６】
そして、取消用ログに未処理のレコードがあると判定した場合には、Ｓ４００１に戻って、上述した処理を繰り返す。
【０１５７】
一方、取消用ログに未処理のレコードがないと判定した場合には、検証部３００７は、ノードの重複が発生しないと判定する（Ｓ４０１１）。取消検証処理を終えると、図３２に示したＳ３２１１の処理に戻る。
【０１５８】
図３２の説明に戻る。取消検証処理において、ノードの重複が発生すると判定したか否かによって、次の処理が分かれる（Ｓ３２１１）。検証部３００７が、取消検証処理において、ノードの重複が発生すると判定した場合には、Ｓ３２０５に移り、上述した処理を行なう。一方、検証部３００７が、取消検証処理において、ノードの重複が発生しないと判定した場合には、この時点で新規インデックスが完成したことになる。そして、判定部３０１３は、制御データ記憶部１６０９における新規インデックス域用ポインタ１８０７を設定して、新規インデックスの完成時刻１８０９を記録する（Ｓ３２１２）。
【０１５９】
続いて、待機部３０１５は、待機処理を実行する（Ｓ３２１３）。待機処理では、新規インデックスが完成する前に開始したトランザクションが残らず終了するまで待って、それらのトランザクションが残らず終了すると復帰する。
【０１６０】
図４１に、待機処理フローを示す。待機部３０１５は、制御データ記憶部１６０９における新規インデックスの完成時刻１８０９と、トランザクションテーブル記憶部１６０５の各レコードにおける開始時刻を比較することによって、新規インデックスの完成よりも早く開始したトランザクションを特定する（Ｓ４１０１）。トランザクションテーブル記憶部１６０５のレコードにおける開始時刻が、制御データ記憶部１６０９における新規インデックスの完成時刻１８０９よりも前であれば、当該レコードに係るトランザクションは、新規インデックスの完成よりも早く開始したことになる。
【０１６１】
そして、待機部３０１５は、Ｓ４１０１において特定されたトランザクションがすべて動作を終えたか否かを判定する（Ｓ４１０３）。具体的には、待機部３０１５は、トランザクションテーブル記憶部１６０５において、当該トランザクションのレコードにおけるステータスのフィールドに「完了」又は「取消」が設定されている場合には、当該トランザクションの動作を終えたと判定する。特定されたトランザクションのうち、いずれかが未だ動作を終えていなければ、Ｓ４１０３の処理を繰り返す。特定されたトランザクションが残らず動作を終えると、待機処理を終え、図３２のＳ３２１５に戻る。
【０１６２】
図３２の説明に戻る。切替部３００３は、制御データ記憶部１６０９における通常モードのインデックス域用ポインタ１８０３を設定して、現在のモード１８０１を「通常モード」に切り替える（Ｓ３２１５）。このとき、制御データ記憶部１６０９における通常モードのインデックス域用ポインタ１８０３には、制御データ記憶部１６０９における新規インデックス域用ポインタ１８０７がコピーされる。除去部３０１７は、既存インデックス域７０１を除去する（Ｓ３２１７）。一括追加部２１３は、成功を示す返り値をローダ部１０７に返す（Ｓ３２１９）。そして、端子Ｊを介して図３１に示したＳ３１０１の処理に戻る。
【０１６３】
本実施の形態によれば、生成処理中の個別更新によるインデックスの更新についても、履歴を介して新たなインデックスに反映させるので、一括更新中も個別更新を行なえるようになる。
【０１６４】
また、新たなインデックスが完成する前に開始されたトランザクションに対する原子性を担保することができる。
【０１６５】
また、新たなインデックスにおける重複を防げる。
【０１６６】
また、一括更新後におけるデータベースの一意性を担保できる。
【０１６７】
更に、ロールバックに対してもデータベースの一意性を保証できる。
【０１６８】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上述の機能ブロック構成はプログラムモジュール構成に一致しない場合もある。
【０１６９】
また、上で説明した各記憶領域の構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、処理と並列に実行させるようにしても良い。
【０１７０】
なお、上で述べたデータベースサーバ１０１は、コンピュータ装置であって、図４２に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０１７１】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【０１７２】
本実施の形態に係る更新方法は、データベースの個別のレコードへの更新内容の履歴を記録し、データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置をデータベースにおける第１のインデックスに適用した第２のインデックスを生成し、第２のインデックスに、少なくとも第２のインデックスの生成の開始以降の上記履歴に含まれる更新内容を反映させる処理を含む。
【０１７３】
このように、第２のインデックスの生成の開始以降におけるデータベースへの個別更新についても、履歴を介して第２のインデックスに反映させれば、データベースへの一括更新中も個別更新を行なえるようになる。
【０１７４】
更に、第２のインデックスが完成した後、第２のインデックスが完成する前に開始されたトランザクションが終了するまで、個別のレコードへの更新に伴い、第１のインデックスと第２のインデックスとを更新する処理を含むようにしてもよい。
【０１７５】
このようにすれば、第２のインデックスが完成する前に開始されたトランザクションに対する原子性を担保することができる。
【０１７６】
更に、上記更新内容に対するロールバックを行なうためのログを記録するようにしてもよい。また、当該ログに基づいてロールバックを行なった場合にキー値に重複が生じないかを検証するようにしてもよい。
【０１７７】
このようにすれば、第２のインデックスにおける重複を防げる。
【０１７８】
上記生成する処理において、各レコードの格納位置とともに当該レコードのキー値を抽出し、各レコードの格納位置とともに当該キー値を、第１のインデックスに適用し、更に第２のインデックスにおけるキー値の重複を検出するようにしてもよい。また、上記反映させる処理において、更新内容の適用によって生じるキー値の重複を検出するようにしてもよい。更に、上記キー値の重複が無い場合に、第２のインデックスが完成したと判定する処理を含むようにしてもよい。
【０１７９】
このようにすれば、一括更新後におけるデータベースの一意性を担保できる。
【０１８０】
上記記録する処理において、ロールバックを行なうためのログを記録するようにしてもよい。更に、ロールバックを行なった場合に、キー値に重複が生じないかを検証する処理を含むようにしてもよい。
【０１８１】
このようにすれば、ロールバックに対してもデータベースの一意性を保証できる。
【０１８２】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納されるようにしてもよい。尚、中間的な処理結果は、一般的にメインメモリ等の記憶装置に一時保管される。
【０１８３】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１８４】
（付記１）
データベースの個別のレコードへの更新内容の履歴を記録し、
前記データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置を前記データベースにおける第１のインデックスに適用した第２のインデックスを生成し、
前記第２のインデックスに、少なくとも前記第２のインデックスの生成の開始以降の前記履歴に含まれる前記更新内容を反映させる
処理をコンピュータに実行させる更新プログラム。
【０１８５】
（付記２）
付記１記載の更新プログラムであって、
前記第２のインデックスが完成した後、前記第２のインデックスが完成する前に開始されたトランザクションが終了するまで、前記個別のレコードへの更新に伴い、前記第１のインデックスと前記第２のインデックスとを更新する
処理をコンピュータに実行させる更新プログラム。
【０１８６】
（付記３）
付記１又は２記載の更新プログラムであって、
前記記録する処理において、前記開始を前記履歴に記録し、
前記反映させる処理において、前記開始以降の前記更新内容のうち、前記第２のインデックスに反映されていない更新内容を適用する
更新プログラム。
【０１８７】
（付記４）
付記１乃至３いずれか１つ記載の更新プログラムであって、
前記生成する処理において、前記各レコードの格納位置とともに当該レコードのキー値を抽出し、前記各レコードの格納位置とともに当該キー値を、前記第１のインデックスに適用し、更に前記第２のインデックスにおけるキー値の重複を検出し、
前記反映させる処理において、前記更新内容の適用によって生じるキー値の重複を検出し、
前記キー値の重複が無い場合に、前記第２のインデックスが完成したと判定する
処理をコンピュータに実行させる更新プログラム。
【０１８８】
（付記５）
付記１乃至４いずれか１つ記載の更新プログラムであって、
前記更新内容に対するロールバックを行なうためのログを記録し、
前記ログに基づいて前記ロールバックを行なった場合にキー値に重複が生じないかを検証する
処理をコンピュータに実行させる更新プログラム。
【０１８９】
（付記６）
データベースの個別のレコードへの更新内容の履歴を記録し、
前記データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置を前記データベースにおける第１のインデックスに適用した第２のインデックスを生成し、
前記第２のインデックスに、少なくとも前記第２のインデックスの生成の開始以降の前記履歴に含まれる前記更新内容を反映させる
処理をコンピュータに実行させる更新方法。
【０１９０】
（付記７）
データベースの個別のレコードへの更新内容の履歴を記録する記録処理部と、
前記データベースにおける複数のレコードを一括して更新させるための更新データから、各レコードの格納位置を抽出し、抽出された当該各レコードの格納位置を前記データベースにおける第１のインデックスに適用した第２のインデックスを生成する生成部と、
前記第２のインデックスに、少なくとも前記第２のインデックスの生成の開始以降の前記履歴に含まれる前記更新内容を反映させる反映部と
を含む更新装置。
【符号の説明】
【０１９１】
１０１  データベースサーバ  １０３  アプリケーションサーバ
１０５  データベース管理システム  １０７  ローダ部
１０９  アプリケーション部  ２０１  第１インターフェース
２０３  第１受付部  ２０５  実行部
２０７  データ記憶部  ２０９  第２インターフェース
２１１  第２受付部  ２１３  一括追加部
２１５  記録処理部  ５０１  新規データ域
５０３  新規インデックス域  ５０５  既存データ域
５０７  追加データ域  ５０９  新規リーフノード域
５１１  新規上位ノード域  ６０１  ＳＱＬ文
６０３  結果  ６０５  追加要求
６０７  結果  ７０１  既存インデックス域
７０３  既存リーフノード域  ７０５  既存上位ノード域
７０７  アーカイブログ  ７０９  要素列
８０１  ノード  ８０３  ノード
８０５  ノード  ８０７  ノード
９０１  レコード  ９０３  レコード
９０５  レコード  ９０７  レコード
１００１  時点  １００３  時点
１００５  時点  １１０１  矢印
１１０３  矢印  １１０５  矢印
１２０１  矢印  １２０３  矢印
１２０５  矢印  １２０７  矢印
１３０１  矢印  １３０３  矢印
１３０５  矢印  １３０７  矢印
１３０９  矢印  １３１１  矢印
１３１３  矢印  １４０１  重複リスト
１６０１  テーブル記憶部  １６０３  アーカイブログ記憶部
１６０５  トランザクションテーブル記憶部  １６０７  重複リスト記憶部
１６０９  制御データ記憶部  １６１１  取消用ログ記憶部
１８０１  現在のモード  １８０３  通常モードのインデックス域用ポインタ
１８０５  既存インデックス域用ポインタ  １８０７  新規インデックス域用ポインタ
１８０９  新規インデックスの完成時刻  １９０１  制御部
１９０３  開始部  １９０５  完了部
１９０７  取消部  １９１１  操作部
１９１３  第１抽出部  １９１５  挿入部
１９１７  削除部  １９１９  更新部
１９２１  判定部  ３００１  格納処理部
３００３  切替部  ３００５  第２抽出部
３００７  検証部  ３００９  生成部
３０１１  反映部  ３０１３  判定部
３０１５  待機部  ３０１７  除去部
３９０１  レコード  ３９０３  レコード
３９０５  レコード
【図１】
2016066224.tif 000003
【図２】
2016066224.tif 000004
【図３】
2016066224.tif 000005
【図４】
2016066224.tif 000006
【図５】
2016066224.tif 000007
【図６】
2016066224.tif 000008
【図７】
2016066224.tif 000009
【図８】
2016066224.tif 000010
【図９】
2016066224.tif 000011
【図１０】
2016066224.tif 000012
【図１１】
2016066224.tif 000013
【図１２】
2016066224.tif 000014
【図１３】
2016066224.tif 000015
【図１４】
2016066224.tif 000016
【図１５】
2016066224.tif 000017
【図１６】
2016066224.tif 000018
【図１７】
2016066224.tif 000019
【図１８】
2016066224.tif 000020
【図１９】
2016066224.tif 000021
【図２０】
2016066224.tif 000022
【図２１】
2016066224.tif 000023
【図２２】
2016066224.tif 000024
【図２３】
2016066224.tif 000025
【図２４】
2016066224.tif 000026
【図２５Ａ】
2016066224.tif 000027
【図２５Ｂ】
2016066224.tif 000028
【図２６Ａ】
2016066224.tif 000029
【図２６Ｂ】
2016066224.tif 000030
【図２７Ａ】
2016066224.tif 000031
【図２７Ｂ】
2016066224.tif 000032
【図２７Ｃ】
2016066224.tif 000033
【図２７Ｄ】
2016066224.tif 000034
【図２８】
2016066224.tif 000035
【図２９】
2016066224.tif 000036
【図３０】
2016066224.tif 000037
【図３１】
2016066224.tif 000038
【図３２】
2016066224.tif 000039
【図３３】
2016066224.tif 000040
【図３４】
2016066224.tif 000041
【図３５】
2016066224.tif 000042
【図３６】
2016066224.tif 000043
【図３７】
2016066224.tif 000044
【図３８】
2016066224.tif 000045
【図３９】
2016066224.tif 000046
【図４０】
2016066224.tif 000047
【図４１】
2016066224.tif 000048
【図４２】
2016066224.tif 000049