(57)【要約】【課題】データベースのトランザクションＩＤの整理をする際に発生する負荷を分散させたデータベース管理装置の提供を目的とする。【解決手段】複数のレコードを含むページによってデータベースとの間の読出しあるいは書き込みを行い、データベースに格納されたレコードのデータの値が変化する処理毎に新たなレコードを作成するデータベースの管理方法であって、読出しの対象となるレコードの識別番号情報を含むページを読出し、トランザクションに付された最新の識別番号よりもページのレコード識別番号が所定の値以上古いレコードをレコードの順序の判定の対象外とする。【選択図】図１
2008225693.tif 000002
【特許請求の範囲】
【請求項１】
データベース内のレコードの読出しあるいは書込みをトランザクションに応じて行い、該データベースに格納されたレコードのデータの値が変化する処理毎に新たなレコードを作成するデータベース管理装置によるデータベース管理方法であって、
該データベース管理装置が、
該トランザクションによって読出しあるいは書込みをされたレコードに該トランザクションの識別番号を対応付け、
該データベース内の処理の対象のレコードを含む該予め定めたデータ量の該データによって読出しあるいは書込み、
該読出しあるいは書込み処理の該トランザクションの識別番号と該読出されたデータ内のレコードに対応する該トランザクションの識別番号との差が所定の値以上のレコードをレコードの順序の判定の対象外とする
ことを特徴とするデータベースの管理方法。
【請求項２】
レコードの識別番号の取得できる領域を所定の範囲で区分して、該所定の範囲毎に世代情報を付し、該予め定めたデータ量の該データ内の最古のレコードの属する世代を該データの世代情報として取得し、該データの世代情報の値がトランザクションの識別番号に対応する世代情報の値よりも所定の値以上のときに、該データ内のレコードに付される識別番号毎のレコードをレコードの順序の判定の対象外とするか否かの判定処理を実行することを特徴とする請求項１に記載のデータベースの管理方法。
【請求項３】
読出される対象のレコードに格納されたデータに対する処理の前に実行することを特徴とする請求項１に記載のデータベースの管理方法。
【請求項４】
該レコードに対する処理が完結したときに付された識別番号が所定の値以上古いレコードの場合は、該レコードの記憶領域に新たなレコードを生成可能とすることを特徴とする請求項１に記載のデータベースの管理方法。
【請求項５】
レコードの識別番号の取得できる領域を区分する所定の範囲は４であることを特徴とする請求項２に記載のデータベースの管理方法。
【請求項６】
データベース内のレコードの読出しあるいは書込みをトランザクションに応じて行い、該データベースに格納されたレコードのデータの値が変化する処理毎に新たなレコードを作成するデータベース管理装置であって、
該トランザクションによって読出しあるいは書込みをされたレコードに該トランザクションの識別番号を対応付け、
該データベース内の処理の対象のレコードを含む該予め定めたデータ量の該データによって読出しあるいは書込み、
該読出しあるいは書込み処理の該トランザクションの識別番号と該読出されたデータ内のレコードに対応する該トランザクションの識別番号との差が所定の値以上のレコードをレコードの順序の判定の対象外とする
ことを特徴とするデータベースの管理装置。
【請求項７】
コンピュータをデータベース内のレコードの読出しあるいは書込みをトランザクションに応じて行い、該データベースに格納されたレコードのデータの値が変化する処理毎に新たなレコードを作成するデータベース管理装置として機能させるデータベース管理プログラムであって、該コンピュータに、
該トランザクションによって読出しあるいは書込みをされたレコードに該トランザクションの識別番号を対応付けるステップ、
該データベース内の処理の対象のレコードを含む該予め定めたデータ量のデータによって読出しあるいは書込むステップ、
該読出しあるいは書込み処理の該トランザクションの識別番号と該読出された該データ内のレコードに対応する該トランザクションの識別番号との差が所定の値以上のレコードをレコードの順序の判定の対象外とするステップ
を実行させることを特徴とするデータベースの管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はデータベースの管理に関する。
【背景技術】
【０００２】
データベース管理システムの一つにＰｏｓｔｇｒｅＳＱＬがある。ＰｏｓｔｇｒｅＳＱＬのデータベースは複数のテーブルを有し、テーブルは複数のレコードを有する。ＰｏｓｔｇｒｅＳＱＬはレコードを追記型構造によって格納する。追記型構造は、レコードの更新が発生した場合、更新後の新たなレコードを逐次追加する構造である。追記型構造はＭＶＣＣ（Ｍｕｌｔｉｖｅｒｓｉｏｎ  Ｃｏｎｃｕｒｒｅｎｃｙ  Ｃｏｎｔｒｏｌ）モデルを実現することが可能となる。ＭＶＣＣは、データベースからデータの取得を依頼するトランザクションを実行した時に、ある時点でのデータベースに格納されたデータの値の一貫性が保証されたデータを利用可能とする機能である。トランザクションは関連する複数の処理を一つの処理の単位とするものである。ＭＶＣＣを実現するためにはトランザクション毎にトランザクションを識別するための番号（トランザクションＩＤ）を付し、トランザクションに付された番号の大小によってレコードを特定する必要がある。
【０００３】
追加されたレコードは追記型構造では削除あるいは上書きされることがない。そのため追記型構造は、テーブルのデータ更新処理を行うアプリケーションの動作に伴い、有効レコードあるいは処理が完結した無効レコードの件数が増加する。データベースでは、データに関する処理をトランザクション単位で管理する。トランザクションＩＤの取得可能な個数は有限である。トランザクションＩＤがオーバーフローするとトランザクションＩＤの大小が不明となる。したがって追記型構造では、増加した有効レコードあるいは無効レコードの件数を整理する処理が必要である。ＰｏｓｔｇｒｅＳＱＬでは定期的なＶＡＣＵＵＭ処理によって無効レコードが存在しているデータ領域を再利用可能な状態に変更する（回収処理）。また、ＶＡＣＵＵＭ処理は、有効レコードの内、所定の値よりも古いトランザクションＩＤをトランザクションＩＤの大小の比較を行わない特殊なトランザクションＩＤに変更する（Ｆｒｅｅｚｅ処理）。従来技術として下記文献がある。
【０００４】
しかし、ＶＡＣＵＵＭ処理はデータベースのテーブルを単位として処理を実行する必要があるため、ＶＡＣＵＵＭ処理の実行によってデータベースシステムが受ける負荷は大きい。
【特許文献１】特開平１１−２１２８３１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明は、データベースのトランザクションＩＤの整理をするときに発生する負荷を分散させたデータベース管理装置の提供を目的とする。
【課題を解決するための手段】
【０００６】
本発明の第一の手段は以下となる。本発明は、データベース内のレコードの読出しあるいは書込みをトランザクションに応じて行い、データベースに格納されたレコードのデータの値が変化する処理毎に新たなレコードを作成するデータベースの管理方法であって、トランザクションによって読出しあるいは書込みをされたレコードにトランザクションの識別番号を対応付け、データベース内の処理の対象のレコードを含む予め定めたデータ量のデータによって読出しあるいは書込み、読出しあるいは書込み処理のトランザクションの識別番号と読出されたデータ内のレコードに対応するトランザクションの識別番号との差が所定の値以上のレコードをレコードの順序の判定の対象外とする。
【０００７】
また、本発明の第二の手段は第一の手段に更に以下を行う。レコードの識別番号の取得できる領域を所定の範囲で区分して、所定の範囲毎に世代情報を付し、予め定めたデータ量のデータ内の最古のレコードの属する世代をデータの世代情報として取得し、データの世代情報の値がトランザクションの識別番号に対応する世代情報の値よりも所定の値以上のときに、データ内のレコードに付される識別番号毎のレコードをレコードの順序の判定の対象外とするか否かの判定処理を実行する。
【０００８】
また、本発明の第三の手段は第一の手段に更に以下を行う。読出される対象のレコードに格納されたデータに対する処理の前に実行する。
【０００９】
また、本発明の第四の手段は第一の手段に更に以下を行う。レコードに対する処理が完結したときに付された識別番号が所定の値以上古いレコードの場合は、レコードの記憶領域に新たなレコードを生成可能とする。
【００１０】
また、本発明の第五の手段は第二の手段のレコードの識別番号の取得できる領域を区分する所定の範囲は４とする。
【発明の効果】
【００１１】
レコードを読み出す際の単位となるページ毎に不要なトランザクションＩＤの削除を行うため、データベースのトランザクションＩＤの整理の処理によって発生する負荷を分散させることが可能となる。その結果、ＶＡＣＵＵＭコマンドを実行することによるデータベースシステムの処理速度の低下を防ぐことが可能となる。
【発明を実施するための最良の形態】
【００１２】
（実施例）
図１は本実施例のハードウェア構成図である。
【００１３】
データベース管理装置１０は、制御部２１、メモリ２２、記憶部２３、入力部２４、出力部２５を有し、それぞれがバス１１接続された構成である。
【００１４】
制御部２１は当該データベース管理装置１０の全体を制御する。例えば、Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ（ＣＰＵ）である。また、制御部２１はメモリ２２に展開されたデータベース管理プログラム２３１を実行する。データベース管理プログラム２３１は制御部２１を新たなデータおよびコマンドを取得する入力モジュール、該当するレコードを検出する検出モジュール、ページ内のトランザクションＩＤの大小関係を比較する比較モジュールおよび更新したページを出力する出力モジュールとして機能させる。
【００１５】
メモリ２２は、記憶部２３に格納されたデータベース管理プログラム２３１が展開される記憶領域である。また、メモリ２２は制御部２１がデータベース管理プログラム２３１を実行する際に生成される種々の演算結果が格納される記憶領域である。例えば、データベースから読み出したページ、ページの内容が変更された結果としてデータベースに反映すべきデータとなったＤＩＲＴＹデータが一時格納される。メモリ２２は例えばＲａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ（ＲＡＭ）である。
【００１６】
入力部２４は他の利用者からの命令情報を受付ける。入力部２４は、例えば、キーボード、マウス、タッチパネル等である。出力部２５は、処理結果を出力する。出力部２５は、例えば、ディスプレイ等である。記憶部２３は、データベース管理プログラム２３１が格納される。記憶部２３は例えばハードディスク装置である。
【００１７】
データベース２６はデータベース管理装置１０が管理する対象のデータベースである。本実施例では、データベースの管理にＰｏｓｔｇｒｅＳＱＬを用いる場合を説明する。ＰｏｓｔｇｒｅＳＱＬは、データベースに対してトランザクション毎に処理を実行することでデータベースにデータを格納する。
【００１８】
データベースに格納されたデータの検索／更新等の処理が実行された場合、当該処理を実行したトランザクションに対して過去のデータか否かは、レコード内に格納されたデータに対応するトランザクションを識別する識別番号（以下ＸＩＤとする）の値および実行中のトランザクションに対応するＸＩＤの値の大小比較を行うことにより、判定される。
【００１９】
本実施例のＰｏｓｔｇｒｅＳＱＬでは、例えば、ＸＩＤは４バイトの符号なし整数として実装される。一方、ＸＩＤが４バイトの符号なし整数の範囲を超えるとＸＩＤの周回（オーバフロー）が発生する。ＸＩＤのオーバーフローが発生したままではＸＩＤの大小比較が正しく行われなくなる。
【００２０】
図２は本実施例のデータベース２６の構成例である。本実施例のデータベース２６は複数のテーブル２７を有する。またテーブル２７は複数のレコード２８が格納される。テーブル２７のカラム（列）は２つのトランザクションＩＤ（ＸＩＤｍｉｎ２９、ＸＩＤｍａｘ３０）、およびレコード２８のデータ（ｄａｔａ）３１によって構成される。ＸＩＤｍｉｎ２９は、新しくレコードを挿入するトランザクションが実行されたときに登録される。例えばＩＮＳＥＲＴコマンドが実行された場合にテーブルの空き領域に新たにレコード２８が追加され、ＸＩＤｍｉｎ２９列にＩＮＳＥＲＴコマンドに対応するトランザクションＩＤが登録される。また、ＵＰＤＡＴＥコマンドが実行された場合にテーブルの空き領域に新たに更新後のレコード２８が追加され、ＸＩＤｍｉｎ２９列にＵＰＤＡＴＥコマンドに対応するトランザクションＩＤが登録される。ＸＩＤｍａｘ３０は、レコードを削除するトランザクションが実行されたときに登録される。例えばＤＥＬＥＴＥコマンドが実行された場合に、ＸＩＤｍａｘ３０列にＤＥＬＥＴＥコマンドに対応するトランザクションＩＤが登録される。
【００２１】
次に本実施例でのページについて説明する。ページ３２は制御部２１がデータベース２６のテーブル２７からメモリ２２にデータを読み出すときのデータ量の単位である。例えば、１ページは８ｋｂｙｔｅの大きさである。図３はページ３２の構成図である。
【００２２】
ページ３２は複数のレコード２８を有する。ページ３２はページヘッダ３３を有する。ページヘッダ３３は世代識別番号（以下ＧＩＤとする）を有する。ＧＩＤはＸＩＤの世代を識別するための番号。世代は、ＸＩＤの値をとりうる領域を予め定めた複数の領域に分割し、各領域を越える毎に切り替わる。
【００２３】
ここで、ＸＩＤとＧＩＤとの関係について説明する。図４はＸＩＤとＧＩＤとの関係を示す図である。図４の円４１はＸＩＤのとりうる全領域を示す。本実施例では、ＸＩＤは３２ｂｉｔ長の整数であるとする。したがって、図４のＸＩＤは円４１で２の３２乗個のＩＤを取り得る。
【００２４】
世代は、ＸＩＤの値をとりうる領域を予め定めた複数の領域に分割し、各領域を越える毎に切り替わる。ＧＩＤは世代を特定する番号である。本実施例は、ＸＩＤの取り得る値を４つの領域に分割する。図４では、ＸＩＤを表す円４１が４つの領域（０，１，２，３）に分割される。
【００２５】
本実施例のＸＩＤは新しく識別番号を取得する度に１ずつ増加するものとする。ＸＩＤは２の３２乗の整数の範囲で値を取得するため、ＸＩＤを２進数で表記する場合、上位２ｂｉｔの変化よってＸＩＤの取り得る全ての数を４分割することが可能となる。ＸＩＤのとりうる値が４分割された領域を超えるＩＤをＸＩＤが取得する度にＧＩＤが変化する。したがって、ＸＩＤの上位２ｂｉｔが変化する度にＧＩＤを１ずつ増やせば良い。図４での円４１内の値はＸＩＤの上位２ｂｉｔの値を示す。ＸＩＤの上位２ｂｉｔの値は２進数表記では、「００」、「０１」、「１０」および「１１」）となる。ＸＩＤの上位２ｂｉｔが変化するたびにＧＩＤは１ずつ増加する関係は図４の下段の表で示される。図３のページ３２の構成の説明に戻る。
【００２６】
ページヘッダ３３にはＧＩＤｍｉｎ３４、ＧＩＤｍａｘ３５が格納される。例えば、ページ３２を初期化するとき、現在のトランザクションに付されたＸＩＤが属する世代に対応するＧＩＤがページヘッダ３３のＧＩＤｍｉｎ３４、ＧＩＤｍａｘ３５に設定される。ＧＩＤｍｉｎ３４はページ３２に含まれるレコードが有するＸＩＤｍｉｎ２９が属する世代の内最小の世代が格納される。ＧＩＤｍａｘ３５はページ３２に含まれるレコードが有するＸＩＤｍａｘ３０が属する世代の内最小の世代が格納される。
【００２７】
本実施例は、ＸＩＤを単に長くした構成ではない。例えばＧＩＤの領域を３２ｂｉｔとする場合、トランザクションの値はＸＩＤとＧＩＤとを合わせると６４ｂｉｔ長となる。データベースシステムは６４ｂｉｔ長をＸＩＤとすることで、トランザクションを一意に特定することが可能である。しかし、メモリ２２にデータを読み出すときのデータ量の単位であるページの容量は変わらないため、一度に読み出せるデータ量が低下する。その結果、データベースシステムのデータ読出し速度が低下する。したがって、ページヘッダにのみＧＩＤを付すことにより、一度にデータベース２６からメモリ２２に読み出し得るデータ量の低下を防ぐことが可能となる効果を生じる。
【００２８】
次にデータベースの管理について説明する。図５は、トランザクションＩＤ、世代ＩＤの識別番号の取得処理のフローチャートである。ＸＩＤは、新たなＸＩＤが必要となった場合に採番される。ＧＩＤは一つの世代に割当てられているＸＩＤがすべて消費された場合に、新たに採番される。制御部２１は、データベース２６にアクセスする処理を実行させるアプリケーションによって、データベース２６のレコードにアクセスするための処理依頼を受付ける。制御部２１は処理依頼に対応するレコードを含むページをメモリ２２に読み出す。
【００２９】
制御部２１は、現在の最新のトランザクションＩＤを一時退避する（Ｓ０１）。現在の最新のトランザクションＩＤは例えばメモリ２２に格納されている。退避することにより、以降の処理で制御部２１が現在の最新のトランザクションＩＤを演算に用いることが可能となる。
【００３０】
制御部２１は、アプリケーションからのデータベース２６へのアクセス要求に対するＸＩＤを新たに生成する（Ｓ０２）。新たに生成されたＸＩＤは、例えばＳ０１のトランザクションＩＤに１を加えた値である。
【００３１】
制御部２１はＳ０１のＸＩＤが属する世代とＳ０２で生成されたＸＩＤが属する世代が一致するか否かを判別する（Ｓ０３）。具体的には、制御部２１はＳ０１で退避したＸＩＤの領域を示す値とＳ０２で生成したＸＩＤの領域を示す値とが合致するか否かを判別する。本実施例では、図４で説明したようにＸＩＤを４つの領域に分割する。したがって、ＸＩＤの領域を示す値は、ＸＩＤの上位２ｂｉｔの値となる。制御部２１はＸＩＤの上位２ｂｉｔの値が一致するか否かを判別する。
【００３２】
制御部２１がＳ０１のＸＩＤが属する世代とＳ０２で生成されたＸＩＤが属する世代が一致しないと判定した場合（Ｓ０３：Ｎｏ）、制御部２１はＧＩＤを新たに生成する（Ｓ０４）。ＧＩＤの生成は、例えば、制御部２１が現在の最新のＧＩＤに１を加えて新たなＧＩＤとする。
【００３３】
次にページを初期化するときの処理について説明する。図６は、制御部２１がページを初期化する処理のフローチャートである。制御部２１は新たなページ３２の領域を取得する（Ｓ１１）。制御部２１はページヘッダ３３のＧＩＤを現在のトランザクションに付されたＸＩＤが属する世代のＧＩＤに更新する。制御部２１はＧＩＤｍｉｎ３４に現在のトランザクションに付されたＸＩＤが属する世代のＧＩＤの値を挿入し（Ｓ１２）、ＧＩＤｍａｘ３５に現在のトランザクションに付されたＸＩＤが属する世代のＧＩＤの値を挿入する（Ｓ１３）。
【００３４】
次に、データベース２６に格納されたページを読み出すときの処理について説明する。図７は、制御部２１がページを読み出すときの処理のフローチャートである。ページを読み込むときに制御部２１はページヘッダ３３に格納したＧＩＤｍｉｎ３４およびＧＩＤｍａｘ３５の値に応じて、処理を切り替える。
【００３５】
制御部２１はアプリケーションから要求されたデータベース２６の対象のレコード２８を読み出す。本実施例での制御部２１がテーブル２７から呼び出すデータの単位はページ３２である。したがって、制御部２１は対象のレコード２８を含むページ３２を読み出す（Ｓ２１）。
【００３６】
制御部２１は、ＧＩＤｍｉｎ３４がトランザクションに付された最新のＸＩＤが属する世代の値よりも「２」以上前か否かを判定する（Ｓ２２）。本実施例では、レコードの有効無効の判別を行う世代の値は「２」を基準とする。レコードの有効無効の判別を行う世代の値を「２」とすることによって、従来のＶＡＣＵＵＭ処理でのレコードの有効無効の判別を行う処理の結果との整合が図れる効果がある。従来のＶＡＣＵＵＭ処理では、ＸＩＤのとりうる値を最新のＸＩＤを基準として過去のＸＩＤと未来のＸＩＤとに２分割する方式のためである。
【００３７】
ＧＩＤｍｉｎ３４が最新のＸＩＤが属する世代の値よりも２以上前の場合（Ｓ２２：Ｙｅｓ）、制御部２１はページ３２に含まれるＸＩＤｍｉｎ２９の列のＦｒｅｅｚｅ処理を実行する（Ｓ２３）。
【００３８】
ここで、制御部２１がＳ２３にて実行するページ３２に含まれるＸＩＤｍｉｎ２９の列のＦｒｅｅｚｅ処理について詳細に説明する。図８は、ＸＩＤｍｉｎ２９の列のＦｒｅｅｚｅ処理のフローチャートである。
【００３９】
制御部２１は、現在のページ３２に含まれる全てのレコード２８についてＳ３２以降の処理が完了したか否かを判定する（Ｓ３１）。
現在のページ３２に含まれる全てのレコード２８についてＳ３２以降の処理が完了していない場合（Ｓ３１：Ｎｏ）、制御部２１はページ３２に含まれる処理の対象となるレコード２８を読み出す（Ｓ３２）。制御部２１は、Ｓ３２で読み出したレコードのＸＩＤｍｉｎ２９の列の世代の識別番号が最新の世代識別番号より２世代以上前か否かを判別する（Ｓ３３）。
【００４０】
Ｓ３２で読み出したレコードのＸＩＤｍｉｎ２９の列の世代の識別番号が最新の世代識別番号より２世代以上前の場合（Ｓ３３：Ｙｅｓ）、制御部２１はＳ３２で読み出したレコードのＸＩＤｍｉｎ２９の値をトランザクションの大小の比較において比較の対象外であることを示す値に更新する（Ｓ３４）。トランザクションの大小の比較において比較の対象外であることを示す値は、例えば、レコードが持つ十分古いＸＩＤを他のＸＩＤよりも古いと判定される特殊なＸＩＤ（Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ）である。制御部２１は特殊なＸＩＤ（Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ（ＦＴＩＤ））に置き換えるＦｒｅｅｚｅ処理を実行する。
【００４１】
一方、Ｓ３２で読み出したレコードのＸＩＤｍｉｎ２９の列の世代の識別番号が最新の世代識別番号より２世代以上前ではない場合（Ｓ３３：Ｎｏ）、制御部２１はＳ３２で読み出したレコードのＸＩＤｍｉｎ２９が１世代前の値か否かを判定する（Ｓ３５）。Ｓ３２で読み出したレコードのＸＩＤｍｉｎ２９が１世代前の値の場合（Ｓ３５：Ｙｅｓ）、制御部２１はページ３２内のＸＩＤｍｉｎ２９のレコードには１世代前の値を有するレコードが含まれている旨の情報を記憶する（Ｓ３６）。一方、Ｓ３２で読み出したレコードのＸＩＤｍｉｎ２９が１世代前ではない値の場合（Ｓ３５：Ｎｏ）、Ｓ３２で読み出したレコードのＸＩＤｍｉｎ２９の世代の値は現在の最新のＸＩＤが属する世代の値と同一であるため、特に処理を行わず、次のレコードについてＳ３１からの処理を実行する。
【００４２】
次にページ３２内の全てのレコード２８について処理が完了する（Ｓ３１：Ｙｅｓ）と、制御部２１はページ内の各レコード２８で最新の世代よりも１世代前のＸＩＤｍｉｎ２９を有するレコード２８があったか否かを判定する（Ｓ３７）。具体的にはＳ３６で制御部２１がページ３２内のＸＩＤｍｉｎ２９のレコードには１世代前の値を有するレコードが含まれている情報を記憶した否かを判別する。１世代前のレコードが含まれている場合（Ｓ３７：Ｙｅｓ）、制御部２１はＧＩＤｍｉｎ３４に最新のＧＩＤから１を引いた値を格納する（Ｓ３８）。一方、１世代前のレコードが含まれていない場合（Ｓ３７：Ｎｏ）、制御部２１はＧＩＤｍｉｎ３４に最新のＧＩＤの値を格納する（Ｓ３９）。図７のフローチャートの説明に戻る。
【００４３】
制御部２１は、ＧＩＤｍａｘ３５がトランザクションに付された最新のＸＩＤが属する世代の値よりも２以上前か否かを判定する（Ｓ２４）。本実施例では、レコードの有効無効の判別を行う世代の値は「２」を基準とする。レコードの有効無効の判別を行う世代の値を「２」とすることによって、従来のＶＡＣＵＵＭ処理でのレコードの有効無効の判別を行う処理の結果との整合が図れる効果がある。従来のＶＡＣＵＵＭ処理では、ＸＩＤのとりうる値を現在のＸＩＤを基準として過去のＸＩＤと未来のＸＩＤとに２分割する方式のためである。
【００４４】
なお、ＸＩＤｍａｘ３０についてＦｒｅｅｚｅ処理を実行することにより、処理が完結したレコードをページ３２上から削除することが可能となる。従来のＶＡＣＵＵＭ処理では、Ｆｒｅｅｚｅ処理と回収処理とが行われる。本実施例では、ＸＩＤｍｉｎ２９についてＦｒｅｅｚｅ処理を実行し、ＸＩＤｍａｘ３０については回収処理を実行することで空き領域とすることができる。
【００４５】
ＧＩＤｍａｘ３５がトランザクションに付された最新のＸＩＤが属する世代の値よりも２以上前の場合（Ｓ２４：Ｙｅｓ）、制御部２１はページ３２に含まれるＸＩＤｍａｘ３０の列のＦｒｅｅｚｅ処理を実行する（Ｓ２５）。
【００４６】
ここで、制御部２１がＳ２５にて実行するページ３２に含まれるＸＩＤｍａｘ３０の列のＦｒｅｅｚｅ処理について詳細に説明する。図９は、ＸＩＤｍａｘ３０の列のＦｒｅｅｚｅ処理のフローチャートである。
【００４７】
制御部２１は、現在のページ３２に含まれる全てのレコード２８についてＳ４２以降の処理が完了したか否かを判定する（Ｓ４１）。現在のページ３２に含まれる全てのレコード２８についてＳ４２以降の処理が完了していない場合（Ｓ４１：Ｎｏ）、制御部２１はページ３２に含まれる処理の対象となるレコード２８を読み出す（Ｓ４２）。制御部２１は、Ｓ４２で読み出したレコード２８のＸＩＤｍａｘ３０の列の世代の識別番号が最新の世代識別番号より２世代以上前か否かを判別する（Ｓ４３）。
【００４８】
Ｓ４２で読み出したレコードのＸＩＤｍａｘ３０の列の世代の識別番号が最新の世代識別番号より２世代以上前の場合（Ｓ４３：Ｙｅｓ）、制御部２１はＳ４２で読み出したレコードのＸＩＤｍａｘ３０の値をトランザクションの大小の比較において比較の対象外であることを示す値に更新する（Ｓ４４）。トランザクションの大小の比較において比較の対象外であることを示す値は、例えば、レコードが持つ十分古いＸＩＤを他のＸＩＤよりも古いと判定される特殊なＸＩＤ（Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ）である。制御部２１は特殊なＸＩＤ（Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ（ＦＴＩＤ））に置き換えるＦｒｅｅｚｅ処理を実行する。
【００４９】
一方、Ｓ４２で読み出したレコードのＸＩＤｍａｘ３０の列の世代の識別番号が最新の世代識別番号より２世代以上前ではない場合（Ｓ４３：Ｎｏ）、制御部２１はＳ４２で読み出したレコードのＸＩＤｍａｘ３０が１世代前の値か否かを判定する（Ｓ４５）。Ｓ４２で読み出したレコードのＸＩＤｍａｘ３０が１世代前の値の場合（Ｓ４５：Ｙｅｓ）、制御部２１はページ３２内のＸＩＤｍａｘ３０のレコードには１世代前の値を有するレコードが含まれている旨の情報を記憶する（Ｓ４６）。一方、Ｓ４２で読み出したレコードのＸＩＤｍａｘ３０が１世代前ではない値の場合（Ｓ４５：Ｎｏ）、Ｓ４２で読み出したレコードのＸＩＤｍａｘ３０の世代の値は現在の最新のＸＩＤが属する世代の値と同一であるため、特に処理を行わず、次のレコードについてＳ４１からの処理を実行する。
【００５０】
次にページ３２内の全てのレコード２８について処理が完了すると、制御部２１はページ内の各レコード２８で最新の世代よりも１世代前のＸＩＤｍａｘ３０を有するレコード２８があったか否かを判定する（Ｓ４７）。具体的にはＳ４６で制御部２１がページ３２内のＸＩＤｍａｘ３０のレコードには１世代前の値を有するレコードが含まれている情報を記憶した否かを判別する。１世代前のレコードが含まれている場合（Ｓ４７：Ｙｅｓ）、制御部２１はＧＩＤｍａｘ３５に最新のＧＩＤから１を引いた値を格納する（Ｓ４８）。一方、１世代前のレコードが含まれていない場合（Ｓ４７：Ｎｏ）、制御部２１はＧＩＤｍａｘ３５に最新のＧＩＤの値を格納する（Ｓ４９）。図７のフローチャートの説明に戻る。
【００５１】
制御部２１はページ３２の内容に変更が発生したか否かを判定する（Ｓ２６）。ページ３２の内容に変更が発生した場合（Ｓ２６：Ｙｅｓ）、制御部２１はＤＩＲＴＹフラグを設定する。ＤＩＲＴＹフラグは、データベースに反映すべきＤＩＲＴＹデータがメモリ２２上にある場合に立てられるフラグである。ＤＩＲＴＹデータはデータベース２６に反映すべきデータであるがメモリ２２上にのみあるデータである。例えば、ページ３２に新たなレコードが追加された場合には、制御部２１は更新されたページ３２をデータベース２６に反映する必要がある。そこで、制御部２１は、データベース２６に反映するための更新されたページ３２であるＤＩＲＴＹデータをメモリ２２に記憶する。制御部２１は、ログ情報を出力する。ログ情報は例えば、ページ３２の内容の変化等である。
【００５２】
次に図７乃至図９のフローチャートによって本実施例を適用した場合におけるページ３２内の状態の変化について具体例を用いて説明する。図１０はデータベース２６から読み出されたページ３２の構成を示す。図１１は制御部２１がＦｒｅｅｚｅ処理を実行した後のページ３２の構成を示す。
【００５３】
図１０のページ３２は、ページヘッダ３３と複数のレコード２８とを有する。ページヘッダ３３はＧＩＤｍｉｎ３４、ＧＩＤｍａｘ３５およびその他のデータを有する。各レコード２８はＸＩＤｍｉｎ２９列、ＸＩＤｍａｘ３０列およびデータ列３１を有する。
【００５４】
ここで、ページ３２に含まれる各レコードのＸＩＤｍｉｎ２９列の値は２進数表記で「００．．．１０００」、「０１．．．１０１１」およびページ３２内の空き領域である。ページ３２に含まれる各レコードのＸＩＤｍａｘ３０列の値は２進数表記で「００．．．１１１０」、「未設定」およびページ３２内の空き領域である。ページ３２に含まれるデータ列３１にはデータベースで管理する対象のデータが格納される。
【００５５】
ＧＩＤｍｉｎ３４はページ３２内の各レコード２８のＸＩＤｍｉｎ２９列から求めた世代番号の最小値が格納される。世代番号は、ＸＩＤｍｉｎ２９列を２進数で表した場合の上位２ｂｉｔ３６の値に対応する値であり、上位２ｂｉｔ３６が変化する毎に世代番号が増加する。図１０では、「００．．．１０００」によるＸＩＤｍｉｎ２９列の上位２ｂｉｔ３６の値は「００」であり、「０１．．．１０１１」によるＸＩＤｍｉｎ２９列の上位２ｂｉｔ３６の値は「０１」である。図４の関係から、上位２ｂｉｔ３６が「００」については世代番号「４」が対応し、上位２ｂｉｔ３６が「０１」については世代番号「５」が対応する。したがって、ＧＩＤｍｉｎ３４には、世代番号「４」が格納される。
【００５６】
ＧＩＤｍａｘ３５はページ３２内の各レコード２８のＸＩＤｍａｘ３０列から求めた世代番号の最小値が格納される。世代番号は、ＸＩＤｍａｘ３０列を２進数で表した場合の上位２ｂｉｔ３７の値に対応する値である。上位２ｂｉｔ３７が変化する毎に世代番号が増加する。図１０では、「００．．．１１１０」によるＸＩＤｍａｘ３０列の上位２ｂｉｔ３７の値は「００」である。図４の関係から上位２ｂｉｔ３７が「００」については世代番号「４」が対応する。したがって、ＧＩＤｍａｘ３５には、世代番号「４」が格納される。
【００５７】
次に、現在の最新の世代番号が「６」の場合において、図１０のページ３２が読み込まれた場合に、制御部２１が実行するＦｒｅｅｚｅ処理について説明する。
【００５８】
制御部２１は最新の世代ＩＤの値「６」と図１０のページ３２のＧＩＤｍｉｎ３４の値「４」とを比較する。この比較によって、最新の世代ＩＤよりも所定の世代以上前のＸＩＤを含むレコードがページ３２内に含まれるか否かを判別することができる。本実施例では制御部２１は２世代以上前の場合にＦｒｅｅｚｅ処理を実行する。したがってページ３２に格納されたＸＩＤｍｉｎ２９列のデータに２世代以上前のＸＩＤが含まれることとなる。
【００５９】
制御部２１はＸＩＤｍｉｎ２９の内、最新の世代よりも２世代以上前の値となるレコード２８のＸＩＤｍｉｎ２９の列を「Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ」とする。
【００６０】
ＧＩＤｍｉｎ３４の値「４」に対応するＸＩＤｍｉｎ２９の上位２ｂｉｔ３６の値は図４の関係から「００」である。したがって、制御部２１は図１０のＸＩＤｍｉｎ２９の上位２ｂｉｔ３６の値が「００」である「００．．．１０００」のレコード２８のＸＩＤｍｉｎ２９列を図１１のレコード２８１のＸＩＤｍｉｎ列２９のように「Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ」とする。
【００６１】
また制御部２１はページ３２に含まれる上位２ｂｉｔが最新の一つ前の世代となるＸＩＤｍｉｎ２９を検出する。図１０の場合、制御部２１は最新の世代番号「６」の一つ前の世代番号「５」に対応するＸＩＤｍｉｎ２９を検出する。図１０では制御部２１は図４の世代番号「５」に対応する「０１．．．１０１１」の上位２ｂｉｔの「０１」を検出する。制御部２１は図１０のページヘッダ３３のＧＩＤｍｉｎ３４を図１１のように一つ前の世代番号「５」で更新する。
【００６２】
また、制御部２１は現在の最新の世代ＩＤの値「６」と図１０のページ３２のＧＩＤｍａｘ３５の値「４」とを比較する。この比較によって、最新の世代ＩＤよりも所定の世代以上前のＸＩＤを含むレコードがページ３２内に含まれるか否かを判別することができる。本実施例では制御部２１は２世代以上前の場合にＦｒｅｅｚｅ処理を実行する。したがって制御部２１はページ３２に格納されたＸＩＤｍａｘ３０列のデータに２世代以上前のＸＩＤが含まれるため、Ｆｒｅｅｚｅ処理を実行する。制御部２１はＸＩＤｍａｘ３０の内、現在の世代よりも２世代以上前の値となるレコード２８のＸＩＤｍａｘ３０の列を「Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ」とする。なお、制御部２１は、ＸＩＤｍａｘ３０の内、最新の世代よりも２世代以上前の値となるレコード２８を回収する処理を行うことも可能である。ただし、回収処理は時間を要し、データベース２６からレコード２８を読み出すときの処理の負担になるため、本実施例では回収処理を行っていない。
【００６３】
ＧＩＤｍａｘ３５の値「４」に対応するＸＩＤｍａｘ３０の上位２ｂｉｔ３６の値は図４の関係から「００」である。したがって、制御部２１は図１０のＸＩＤｍｉｎ２９列の上位２ｂｉｔ３６の値が「００」である「００．．．１１１０」のレコード２８のＸＩＤｍａｘ３０列を図１１のレコード２８１のＸＩＤｍａｘ列３０のように「Ｆｒｏｚｅｎ  Ｔｒａｎｓａｃｔｉｏｎ  Ｉｄ」とする。
【００６４】
また、制御部２１はページ３２に含まれる上位２ｂｉｔが一つ前の世代となるＸＩＤｍａｘ３０を検出する。図１０の場合、制御部２１は現在の世代番号「６」の一つ前の世代番号「５」に対応するＸＩＤｍａｘ３０を検出する。図１０では制御部２１は検出しない。そこで、制御部２１は図１０のページヘッダ３３のＧＩＤｍａｘ３５を図１１のように現在の世代番号「６」で更新する。
【００６５】
なお、制御部２１はページ３２を読み出すときにページヘッダ３３に記録されたＧＩＤが最新の世代よりも２世代以上前か否かを判定するため、周回が異なるＸＩＤが混在することはない。
具体的には、ページ３２に含まれる各レコードが持つＸＩＤｍｉｎ２９の世代は、（ＧＩＤｍｉｎ３４）あるいは（ＧＩＤｍｉｎ３４＋１）のいずれかであることが保証される。また、ページ３２に含まれる各レコードが持つＸＩＤｍａｘ３０の世代は、（ＧＩＤｍａｘ３５）あるいは（ＧＩＤｍａｘ３５＋１）のいずれかであることが保証される。
【００６６】
以上の処理により、データベース２６から読み出してページ３２のレコード２８に対する実際の処理を行うときには、ページ３２内の各レコードが持つＸＩＤｍｉｎ２９およびＸＩＤｍａｘ３０は、従来のＶＡＣＵＵＭコマンドによってＦｒｅｅｚｅ処理が行われた場合と同等の状態となっている。したがって、ＸＩＤの周回が発生しても、制御部２１はＸＩＤ間の大小比較が可能となる。
【００６７】
以上、本実施例によって、ページ３２をデータベースから読み出す度にページ３２内の各レコード２８の内の古いレコードについてはＦｒｅｅｚｅ処理を実行することが可能となり、ＸＩＤのオーバーフローの回避を目的とする定期的なＶＡＣＵＵＭ処理が不要となる。その結果、データベース管理における運用性が向上する。また、データベースシステムに対するＶＡＣＵＵＭ処理の負荷が分散され、データベースを利用する業務アプリケーションのＶＡＣＵＵＭ処理時の性能低下が解消される。また、トランザクションＩＤのオーバーフローを回避するための定期的なＶＡＣＵＵＭ処理が不要となることによるデータベースシステムの運用性の向上が可能となる。
【００６８】
なお、本実施例ではＸＩＤを４つに分割したそれぞれを世代としたが、レコードの有効無効の判別を行う世代の値は他の値でも良い。例えば、ＸＩＤの上位「ｎ」個のｂｉｔによって世代を取得する方式としても良いし、上位「ｎ（ｎは自然数）」個のｂｉｔに拠らずに世代を決定しても良い。
【図面の簡単な説明】
【００６９】
【図１】本実施例のハードウェア構成図である。
【図２】本実施例のデータベース２６の構成例である。
【図３】ページ３２の構成図である。
【図４】ＸＩＤとＧＩＤとの関係を示す図である。
【図５】ＸＩＤ、ＧＩＤの識別番号の取得処理のフローチャートである。
【図６】制御部２１がページを初期化する処理のフローチャートである。
【図７】制御部２１がページを読み出すときの処理のフローチャートである。
【図８】ＸＩＤｍｉｎ２９の列のＦｒｅｅｚｅ処理のフローチャートである。
【図９】ＸＩＤｍａｘ３０の列のＦｒｅｅｚｅ処理のフローチャートである。
【図１０】データベース２６から読み出されたページ３２の構成である。
【図１１】制御部２１がＦｒｅｅｚｅ処理を実行した後のページ３２の構成である。
【符号の説明】
【００７０】
１０  データベース管理装置
１１  バス
２１  制御部
２２  メモリ
２３  記憶部
２４  入力部
２５  出力部
２６  データベース
２７  テーブル
３２  ページ
２８  レコード
２３１  データベース管理プログラム
【図１】
2008225693.tif 000003
【図２】
2008225693.tif 000004
【図３】
2008225693.tif 000005
【図４】
2008225693.tif 000006
【図５】
2008225693.tif 000007
【図６】
2008225693.tif 000008
【図７】
2008225693.tif 000009
【図８】
2008225693.tif 000010
【図９】
2008225693.tif 000011
【図１０】
2008225693.tif 000012
【図１１】
2008225693.tif 000013