以下、本発明について実施形態をもって説明するが、本発明は、後述する実施形態に限定されるものではない。なお、以下の本発明の実施形態では、階層型データベースに対し定義される索引データベースの整合性検証機能を実現するデータベース管理装置を例として説明する。
図1は、本発明の実施形態におけるデータベース管理装置10の機能ブロック図である。データベース管理装置10は、概ねメインフレームなどの大型汎用コンピュータとして構成され、データベース12に対しアクセスするとともに、データベース12の整合性を検証する。図1に示すデータベース管理装置10に含まれる各機能部(詳細は後述する。)は、メモリ上にプログラムを展開し、プログラムの実行により各ハードウェア資源を動作制御することによって、データベース管理装置10上に実現される。
データベース12は、データを木構造で表したデータモデルに従う階層型データベースとして構成されており、IMSなどのデータベース管理システム(DBMS)により管理されている。データベース12は、I/Oインタフェースを介してデータベース管理装置10に接続されたディスク装置など、ストレージ・デバイスの記憶領域により提供される。データベース12中のデータは、セグメント・オカレンス(以下、単にセグメントとして参照する。)と呼ばれるデータ群から構成されている。そして、各セグメントは、他のセグメントに対するポインタ値と、適宜キー値を含むデータ・エレメントとを含んで構成されている。
以下、図2および図3を参照して、データベース12内のデータ構造を説明する。図2は、階層型データベースのデータ構造を示す。階層型データベース100は、複数のセグメントを記録している。図2に示すセグメント110は、ルート部分を示すルート・アンカー・ポイント(RAP;Root Anchor Point)102から指されており、ルートセグメントと呼ばれる。セグメント110は、接頭部とデータ部とから構成されており、接頭部には、セグメントのタイプを識別するセグメント・コード(SC;Segment Code)を保持するSCフィールド110a、そのセグメントが削除されているか否かを示す削除ビットと、そのセグメントがスプリットされているか否かを示すスプリット・ビットとを含む削除バイト(DB;Delete Byte)を保持するDBフィールド110b、およびポインタ域フィールド110cを有している。データ部には、1以上のデータ・エレメントを収容するデータ・フィールド110dを有している。
セグメント110は、所定の保存先アドレスにて示される保存位置を開始点としてディスク上に保存されている。ここで、保存先アドレスとは、例えば、データベース12の所定の基準アドレスと比較したセグメント110の先頭アドレスの位置、つまり相対バイトアドレス(RBA;Relative Byte Address)をいう。図2に示すセグメント110のポインタ域フィールド110cには、それぞれセグメント120−1およびセグメント120−2など他のセグメントを指すポインタ値(保存先アドレス)を含んでいる。
通常、単一のセグメントの接頭部とデータ部とは、連続してディスク上に保存される。しかしながら、データベース管理システムは、可変長フォーマットにおいて、更新によりデータ部の長さが変更され、アロケートされたサイズを超えてしまう場合などには、セグメントを分割して、スプリット・セグメントを生成する。図2には、スプリット・セグメント130が示されている。セグメントを構成する接頭部132とデータ部134とは、ディスク上の離間した位置に保存されている。スプリット・セグメント130では、接頭部において、SCフィールド132a、DBフィールド134bおよびポインタ域フィールド132cの直後に、分割先のデータ部134の保存先アドレスを指すVLS(Variable Length Segment)ポインタ値を保持するVLSポインタ・フィールド132dが付加されている。そして、データ部134は、SCフィールド134a、DBフィールド134b、およびデータ・フィールド134cを含んで構成される。データ部134のDBフィールド134bは、分割先のデータ部であることを示す値が書き込まれている。
本実施形態のデータベース12では、各セグメントの接頭部に記録されたポインタ値を辿ることにより、順次、他のセグメントにアクセスすることができる階層構造を構成しており、また各スプリット・セグメントの接頭部の直後に付されたVLSポインタ値を辿ることにより、分割先のデータ部にアクセスすることができる構造を構成している。
セグメントが削除される場合、DBMSは、セグメントのDBフィールド中の削除ビットの値を、削除を示す値(ON)に書き換えるか、またはセグメントの記憶領域をフリー・スペースとして開放して、削除を実施する。そして、上記スプリット・セグメント130が削除される場合、DBMSは、スプリット・セグメント130の接頭部132については、削除を実施するが、接頭部が削除されていればデータ部には辿られないため、トランザクションのパフォーマンスを優先させる観点から、スプリット・セグメント130のデータ部134についてまで削除処理を実施しない場合がある。
図3は、索引が定義されるデータベースおよび該データベースに対し定義される索引データベースのデータ構造を一例として示す図である。図3には、索引付けされたデータベース(以下、索引付きデータベースとして参照する。)140と、該索引付きデータベース140に対して定義された索引データベース150とが示されている。図3は、索引を用いたセグメントのアクセス方法についても示す。
図3に示す索引付きデータベース140には、ルート・セグメントであるCOURSEセグメント142、その従属セグメントであるCLASSセグメント144、さらにそれに従属するINSTRセグメント146およびSTUDENTセグメント148による階層構造が示されている。ここで、「COURSE」、「CLASS」、「INSTR」および「STUDENT」は、セグメントのタイプを示し、それぞれ異なるセグメント・コードが割り当てられる。ここで、セグメント・コードは、各セグメントのタイプに割り当てられる番号である。また、例えば「CLASS」タイプのセグメントには、「Math」、「Chemistry」など、特定のセグメント・オカレンスが含まれている。図3に示す索引データベース150には、索引を構成するセグメント152−1〜3が示されている。
DBMSは、索引を設けるために、インデックス・ソース・セグメント(ISS:Index Source Segment)、インデックス・ターゲット・セグメント(ITS:Index Target Segment)、およびインデックス・ポインタ・セグメント(IPS;Index Pointer Segment)を定義付ける。図3に示すデータ構造では、CURSEセグメント142がITS、STUDENTセグメントがISS、索引データベース150内のセグメント152−1〜3がIPSとなる。
IPS152は、その接頭部に、DBフィールド152aおよび索引ポインタ・フィールド152bを有し、そのデータ部に、検索のためのキー値を格納する索引キー・フィールド152cを有する。IPS152の索引ポインタ・フィールド152bは、データベース12を利用するアプリケーションが、索引付きデータベース140から取り出そうとしているセグメントを指す保存先アドレスを索引ポインタ値として保持する。IPS152の索引キー・フィールド152cは、アプリケーションが呼び出し中に修飾子として使用する索引キー値を保持する。
なお、図3に示す例では、保存先アドレス(RBA)を用いる直接ポインタにより索引付けする場合を例示しているが、シンボリック・ポインタを用いることもできる。その場合には、接頭部の索引ポインタ・フィールド152bの代わりに、取り出そうとしているセグメントを指すシンボリック・ポインタを保持する連結キー・フィールドをデータ部に含んでいてもよい。また、IPS152のデータ部には、図3に示したもの以外の他のフィールドを適宜付加することもできる。なお、以下の説明では、保存先アドレス(RBA)を用いる場合の実施形態を用いて説明する。
ITSは、索引対象となる索引付きデータベース140の中に存在し、アプリケーションが取り出す必要のあるセグメントであり、IPSが指すセグメントである。ITSは、保存先アドレスまたはシンボリック・ポインタを用いて直接アクセスされる。ISSも、索引対象となる索引付きデータベース140の中に存在し、IPSが持つ索引キー・フィールドに対応するフィールドを有している。索引付けにより、ISSのデータ部からキー値がコピーされて、IPSの索引キー・フィールドに置かれる。IPS内の索引キー値によりISSとIPSとが関連付けられ、IPS内の索引ポインタ値によりITSとIPSとが関連付けられ、これによりISSからITSへのチェインが張られる。
再び図1を参照すると、本発明の実施形態のデータベース管理装置10は、整合性を検証するために、データベース12を構成するセグメントを読み込んで、後述する各種ワークレコードを作成する読込部20と、セグメントが含むポインタ値の整合性を検証するポインタ検証部22と、セグメントが含むキー値の整合性を検証する索引キー検証部24と、エラー出力部26とを含んで構成される。各種ワークレコードは、データベース管理装置10の主記憶装置やディスク装置などの記憶領域に格納されることとなる。
ポインタ検証部22は、より具体的には、通常ポインタ検証部28と、索引ポインタ検証部30と、分割ポインタ検証部32とを含んで構成される。通常ポインタ検証部28は、索引付きデータベース140を含む検索対象となり得るデータベースにおいて、セグメント間のポインタの整合性を検証し、一方、分割ポインタ検証部32は、スプリット・セグメントにおける接頭部−データ部間のポインタの整合性を検証する。索引ポインタ検証部30は、上記索引付きデータベース140および上記索引データベース150間での索引ポインタの整合性を検証する。
上記読込部20は、索引付きデータベース140を構成するセグメントを含むブロックを順次読み込んで、セグメントを識別し、有効なセグメントの保存先アドレスおよびセグメント・コードを含むワークレコード(以下、セグメント・レコードとして参照する。)を作成し、通常ポインタ検証部28および索引ポインタ検証部30へ渡す。また、読込部20は、識別したセグメントから、そのセグメントの接頭部にあるポインタ域フィールドに保持されるポインタ値、および該ポインタ値が指すセグメント(以下、ポイント先セグメントとして参照する。)のセグメント・コードを含むワークレコード(以下、ポインタ・レコードとして参照する。)を作成し、通常ポインタ検証部28へ渡す。通常ポインタ検証部28は、渡された上記ワークレコードを用いてセグメント間のポインタの整合性を検証する。読込部20は、さらに、セグメントがISSである場合には、そのセグメント・コード、およびデータ・フィールドに収容されるキー値を含むワークレコード(キー・レコードとして参照する。)を作成し、索引キー検証部24へ渡す。
読込部20は、さらに、読み込み処理中、ON状態のスプリット・ビットを検出することによって有効なスプリット・セグメントの接頭部を見つけると、対応するデータ部の保存位置を指すVLSポインタ値およびセグメント・コードを含むワークレコード(以下、VLSポインタ・レコードとして参照する。)を作成し、分割ポインタ検証部32へ渡す。また、読込部20は、読み込み処理中、分割先のデータ部であることを示す値の削除バイトを検出することによってスプリット・セグメントのデータ部を見つけると、そのデータ部の保存先アドレス、セグメント・コード、および適宜データ部に収容されるキー値を含むワークレコード(以下、VLSセグメント・レコードとして参照する。)を作成し、分割ポインタ検証部32へ渡す。分割ポインタ検証部32は、渡された上記ワークレコードを用いて、スプリット・セグメントの接頭部およびデータ部間のVLSポインタの整合性を検証する。分割ポインタ検証部32は、整合性が認められ、且つ対応するセグメントがISSで有る場合には、VLSセグメント・レコードを索引キー検証部24へ渡す。
索引データベース150が定義される場合には、読込部20は、さらに、索引データベース150を構成するIPSを含むブロックを順次読み込んで、IPSの検索ポインタ・フィールド内の索引ポインタ値を含むワークレコード(IPSポインタ・レコードとして参照する。)を作成し、索引ポインタ検証部30へ渡す。また読込部20は、IPSのキー・フィールド内の索引キー値を含むワークレコード(IPSキー・レコードとして参照する。)を作成し、索引ポインタ検証部30へ渡す。索引ポインタ検証部30は、渡されたワークレコードを用いて、上記索引付きデータベース140および上記索引データベース150間での索引ポインタの整合性を検証する。
索引キー検証部24は、読込部20から渡されたキー・レコード、および分割ポインタ検証部32から渡されたVLSセグメント・レコードを用いて、索引データベースおよび索引付きデータベース間での索引キー値の整合性を検証する。
上記通常ポインタ検証部28、索引ポインタ検証部30、分割ポインタ検証部32、および索引キー検証部24は、それぞれ不整合を検出すると、検出したエラーをエラー出力部26へ通知する。エラー出力部26は、通知されたエラーをまとめて、例えば図示しない所定の管理端末にレポートとして報告する。
以下、図4〜図9を参照して、階層型データベース、および該階層型データベースに対し定義される索引データベースの整合性検証機能の詳細について説明する。図4〜図6は、本発明の実施形態のデータベース管理装置10が実行する整合性検証処理を示すフローチャートである。図4および図5は、ポイントAにより、図5および図6は、ポイントBにより、処理フローが連結されている。図4に示す処理は、例えば、図示しない管理端末からの整合性の検証処理の開始要求、または所与のスケジュールにより呼び出されて、ステップS100から開始される。
読込部20は、ステップS101では、索引付きデータベース140のブロックを読み込み、ステップS102では、読み込んだブロックからセグメントを識別する。ステップS103〜ステップS110の処理では、セグメントの種類に応じてワークレコードが作成される。図7は、図4に示したステップS103〜ステップS110によるワークレコードの作成処理を、用いるデータ構造とともに示す図である。図7には、通常のセグメント120、スプリット・セグメントの接頭部132、およびスプリット・セグメントのデータ部134が示されている。ステップS103では、削除ビットおよびスプリット・ビットを含む削除バイトの値を検査して、処理を分岐させる。
再び図4を参照すると、ステップS103で、識別されたセグメントが、スプリット・セグメントではない通常のセグメントである場合(非スプリット・セグメント)には、ステップS104へ処理が進められる。ステップS104では、識別されたセグメントのDBフィールド中の削除ビットの値が削除を示す値(ON)であるか、非削除を示す値(OFF)であるかを判定する。ステップS104で、非削除を示す値(OFF)であると判定された場合(YES)は、ステップS105へ処理を進める。ステップS105では、読込部20は、セグメントの保存先アドレスを取得し、またセグメントを、セグメントの接頭部のポインタ域フィールドに含まれるポインタ値に分解し、セグメント・レコードおよびポインタ・レコードを作成し、通常ポインタ検証部28および索引ポインタ検証部30へ渡す。
ステップS106では、さらに、データベースの構造を定義するスキーマを参照して、セグメントがISSであるか否かを判定する。セグメントの索引付けは、セグメント・コードを指定することによって行われる。したがって、セグメントの接頭部にあるセグメント・コードを調べることにより、そのセグメントがISSであるか否かが判定される。
ステップS106で、ISSであると判定された場合(YES)には、ステップS107へ処理を進める。ステップS107では、読込部20は、セグメントのデータ部のデータ・フィールドに含まれるキー値を取得し、キー・レコードを作成し、索引キー検証部24へ渡し、ステップS112へ処理を進める。一方、ステップS104で、削除を示す値(ON)であると判定された場合(NO)には、直接ステップS112へ処理を進められる。またステップS106で、ISSではないと判定された場合(NO)にも、同様に、直接ステップS112へ処理を進められる。
図7に示すように、本発明の実施形態による読込部20は、通常のセグメント120を識別して、その削除ビットが非削除を示す値(OFF)である場合には、セグメント間のポインタの整合性を検証するために、その開始位置RBAおよびSCフィールドの値からセグメント・レコード160を作成し、またポインタ域フィールドの値からポインタ・レコード162を作成する。なお、ポイント先セグメントのセグメント・コードは、好適には、ポインタ域フィールドのデータ構造から求めることができる。さらに、読込部20は、識別した通常のセグメント120がISSである場合には、SCフィールドの値、およびデータ・フィールドに収容されるキー値を取得し、キー・レコード164を作成する。
図4を再び参照すると、ステップS103で、識別されたセグメントが、スプリット・セグメントの接頭部である場合には、ステップS108へ処理が進められる。ステップS108では、スプリット・セグメントの接頭部内のDBフィールドを読み、削除ビットの値が削除を示す値(ON)であるか、非削除を示す値(OFF)であるかを判定する。ステップS108で、非削除を示す値(OFF)であると判定された場合(YES)は、ステップS109へ進める。読込部20は、ステップS109では、セグメントの接頭部のポインタ域フィールドに含まれるポインタ値に分解し、セグメント・レコードおよびポインタ・レコードを作成し、通常ポインタ検証部28および索引ポインタ検証部30へ渡す。さらに、ステップS110では、読込部20は、VLSポインタ・フィールドに保持されるVLSポインタ値を取得し、VLSポインタ・レコードを作成し、分割ポインタ検証部32に渡し、ステップS112へ処理を進める。一方、ステップS108で、削除を示す値(ON)であると判定された場合(NO)には、直接ステップS112へ処理を進められる。
図7に示すように、読込部20は、スプリット・セグメントの接頭部132を識別して、その削除ビットが非削除(OFF)を示す場合には、その開始位置RBAおよびSCフィールドの値を取得し、セグメント・レコード160を作成し、またポインタ域フィールドの値を取得し、ポインタ・レコード162を作成する。加えて読込部20は、スプリット・セグメントの接頭部132のSCフィールドおよびVLSポインタ・フィールドの値を取得し、VLSポインタ・レコード166を作成する。
図4を再び参照すると、ステップS103で、識別されたセグメントが、スプリット・セグメントのデータ部である場合には、ステップS111へ処理が進められる。ステップS111では、読込部20は、スプリット・セグメントのデータ部の保存先アドレス、SCフィールド、データ・フィールドの値からVLSセグメント・レコードを作成し、分割ポインタ検証部32へ渡し、ステップS112へ処理を進める。
図7に示すように、読込部20は、スプリット・セグメントのデータ部134を識別して、その開始位置RBA、SCフィールドの値、および適宜データ・フィールドが収容するキー値を取得し、VLSセグメント・レコード168を作成する。
図4を再び参照すると、ステップS112では、読込部20は、当該ブロックの中に、次に処理すべきセグメントが残されているか否かを判定する。ステップS112で、次に処理すべきセグメントが存在する場合(YES)には、ステップS102へループさせ、次のセグメントの処理へ進める。一方、ステップS112で、次に処理すべきセグメントがない場合(NO)には、ステップS113へ処理を進める。
ステップS113では、読込部20は、索引付きデータベース140に、次に処理すべきブロックが残されているか否かを判定する。ステップS113で、次に処理すべきブロックがある場合(YES)には、ステップS101へループさせ、次のブロックに対する処理へ進める。一方、ステップS113で、次に処理すべきセグメントがない場合(NO)には、ポイントAへ処理を進める。
図5は、図4に示したポイントA以降の処理フローを示す。ステップS200では、通常ポインタ検証部28は、渡されたセグメント・レコード160およびポインタ・レコード162とを用いて、索引付きデータベース140内のセグメント間のポインタの整合性を検証する。本発明の実施形態では、セグメント間のポインタの整合性検証する手法としては、特に限定されるわけではないが、好適には、セグメント・レコード160およびポインタ・レコード162を、セグメント・コードおよび保存先アドレスの値をソートキーとしてソートマージし、ポインタ値とセグメンの開始RBAの値とを比較し、これらの値が一致する組合せが見つかり、かつセグメント・コードが一致すれば、ポインタの整合性が有りとし、一方、一致する組合せが存在しないこと、およびセグメント・コードが一致しないことをもって、ポインタの不整合を検出するという手法を使用することができる。なお、セグメント間のポインタ整合性の検証処理自体の具体的実装ついては、これ以上の詳細な説明は省略する。
ステップS201〜ステップS214の処理では、分割ポインタ検証部32は、渡されたVLSセグメント・レコード168およびVLSポインタ・レコード166とを用いて、スプリット・セグメントの接頭部−データ部間のVLSポインタの整合性を検証する。本発明の実施形態では、接頭部−データ部間のVLSポインタの整合性を検証する手法としては、好適には、VLSセグメント・レコード168およびVLSポインタ・レコード166を、セグメント・コードおよび保存先アドレスの値をソートキーとしてソートマージして、分割ポインタ値と分割先の開始RBAの値とを比較し、この値に一致する組合せが見つかり、かつセグメント・コードが一致すれば、ポインタの整合性があり、これに対して、一致する組合せが存在しないこと、およびセグメント・コードが一致しないことをもって、不整合を検出するという手法を使用することができる。また、その際には、VLSセグメント・レコード168に対応するVLSポインタ・レコード166が存在しない場合には、そのスプリット・セグメントのデータ部がその接頭部において既に削除済みであるとして、エラーを報告せずに処理を進める。
以下、接頭部−データ部間の分割ポインタの整合性の検証処理について、より具体的に説明する。ステップS201では、分割ポインタ検証部32は、VLSセグメント・レコード168およびVLSポインタ・レコード166を、それぞれRBAおよびSCをソートキーとしてソートする。本実施形態では、RBAを主のソートキーとして、昇順にソートする。ステップS202では、ソートしたワークレコードの先頭の組合せから処理対象に設定する。ステップS203では、分割ポインタ検証部32は、処理対象の組合せを突き合わせて、VLSセグメント・レコード168が保持するデータ部の保存先アドレスと、VLSポインタ・レコード166が保持するVLSポインタ値とを比較する。
ステップS204では、突き合わせたデータ部の保存先アドレス(RBA)とVLSポインタ値(RBA)とが一致するか否かを判定する。ステップS204で、RBAの値が一致する場合(YES)には、ステップS205へ処理を進める。ステップS205では、処理対象の組合せにおいてセグメント・コードが一致するか否かを判定する。ステップS205で、セグメント・コードの値が一致すると判定された場合(YES)には、ステップS206へ処理を進める。ステップS206では、データベースの構造を定義するスキーマを参照して、対応するスプリット・セグメントがISSであるか否かを判定する。ステップS206で、ISSであると判定された場合(YES)には、ステップS207へ処理を進める。
ステップS207では、分割ポインタ検証部32は、処理対象のVLSセグメント・レコードを索引キー検証部24へ渡す。一方、ステップS206で、対応するスプリット・セグメントがISSではないと判定された場合(NO)には、直接ステップS208へ処理を進める。ステップS208では、VLSセグメント・レコード168およびVLSポインタ・レコード166を進めて、次ぎの組合せに処理対象を設定し、ステップS214へ処理を進める。ステップS214では、VLSセグメント・レコード168およびVLSポインタ・レコード166の処理対象の組合せが終端に達したか否かを判定する。ステップS214で、終端に達したと判定された場合(YES)には、ポイントBへ処理を渡し、一方、終端に達していないと判定された場合(NO)には、ステップS203へ処理をループさせ、次の組合せの処理対象に対する突き合わせを実行する。
ステップS205で、セグメント・コードが不一致であった場合(NO)には、ステップS209へ処理を進める。ステップS209では、分割ポインタ検証部32は、セグメント・コードが不一致であるとして、エラー出力部26にその旨ポインタ・エラーを報告し、ステップS208へ処理を進め、VLSセグメント・レコード168およびVLSポインタ・レコード166を進めて、次ぎの組合せに処理対象を設定し、ステップS214へ処理を進める。
一方、ステップS204で、RBAが不一致である場合(NO)には、ステップS210へ処理を進める。ステップS210では、VLSセグメント・レコード168側のRBAの値が小さいか否かを判定する。ここでは、処理対象のVLSセグメント・レコードに対応するVLSポインタ・レコード166が存在するか否かを判定している。ステップS210で、VLSセグメント・レコード168側のRBAの値が小さいと判定された場合(YES)、つまり、処理対象のVLSセグメント・レコード168に対応するVLSポインタ・レコード166が存在しないと判定された場合には、ステップS211へ処理を進める。ステップS211では、VLSセグメント・レコード168を進めて、次ぎの組合せへ処理対象を設定する。
一方、ステップS210で、VLSセグメント・レコード168側のRBAの値が大きいと判定された場合(NO)には、ステップS212へ処理を進める。この場合、ステップS211では、分割ポインタ検証部32は、ポインタが不整合であるとして、エラー出力部26にその旨ポインタ・エラーを報告する。ステップS213では、VLSポインタ・レコード166を進めて次ぎの組合せへ処理対象を設定し、ステップS214へ処理を進める。
ステップS201〜ステップS214に示した処理により、各VLSセグメント・レコードに含まれるキー値のうち、VLSポインタの整合性が確認されたキー値のみが、索引キー検証部24に渡されることとなる。
図6は、図5に示したポイントB以降の処理フローを示す。索引データベース150が定義される場合には、ステップS300〜ステップS304の処理により、索引データベース150内のIPSが読み込まれて、索引ポインタ値および索引キー値の整合性を検証するために、ワークレコードが作成される。
読込部20は、ステップS300では、索引データベース150のブロックを読み込み、ステップS301では、読み込んだブロックからIPSを識別する。読込部20は、ステップS302では、識別されたセグメントのDBフィールドを読み、削除ビットの値が非削除を示す値(OFF)であれば、索引付きデータベース140および索引データベース150間の索引ポインタおよび索引キー値の整合性を検証するために、IPSポインタ・レコードおよびIPSキー・レコードを作成し、それぞれ索引ポインタ検証部30および索引キー検証部24へ渡す。
図8は、図5に示したステップS302の処理によるワークレコードの作成処理を、用いるデータ構造とともに示す図である。図8に示すように、本発明の実施形態による読込部20は、IPS152を識別して、その削除ビットが非削除を示す値(OFF)である場合には、索引ポインタの整合性を検証するために、そのポインタ・フィールドの値からIPSポインタ・レコード170を作成し、またそのキー・フィールドの値からIPSキー・レコード172を作成する。
再び図6を参照すると、ステップS303では、読込部20は、当該ブロックの中に次に処理すべきIPSが残されているか否かを判定する。ステップS303で、次に処理すべきIPSが存在する場合(YES)には、ステップS301へループさせ、次のIPSの処理へ進める。一方、ステップS303で、次に処理すべきIPSがない場合(NO)には、ステップS304へ処理を進める。
ステップS304では、読込部20は、索引付きデータベース140に、次に処理すべきブロックが残されているか否かを判定する。ステップS304で、次に処理すべきブロックがある場合(YES)には、ステップS300へループさせ、次のブロックに対する処理へ進める。一方、ステップS304で、次に処理すべきセグメントがない場合(NO)には、ステップS305へ処理を進める。
ステップS305では、索引ポインタ検証部30は、読込部20から渡されたIPSポインタ・レコード170と、セグメント・レコード160のうちITSに対応するレコードとを用いて、索引ポインタの整合性を検証する。本発明の実施形態では、索引ポインタの整合性検証する手法としては、特に限定されるわけではないが、好適には、IPSポインタ・レコード170と、ITSのセグメント・レコード160とを、保存先アドレスの値をソートキーとしてソートマージし、索引ポインタ値とセグメントの開始RBAの値とを比較し、これらの値が一致する組合せが見つかれば、ポインタの整合性がありとし、一致する組合せが存在しないことをもって、ポインタの不整合を検出するという手法を使用することができる。なお、索引ポインタ自体の整合性検証処理の具体的実装ついては、これ以上の詳細な説明は省略する。
ステップS306〜ステップS310の処理では、索引キー検証部24は、図8に示すように、図4に示したステップS107の処理、および図5に示したステップS207の処理でそれぞれ渡されたキー・レコード164およびVLSセグメント・レコード168を用いて、索引付きデータベース140および索引データベース150間の索引キー値の整合性を検証する。本発明の実施形態では、索引キー値の整合性を検証する手法としては、好適には、渡されたVLSセグメント・レコード168およびキー・レコード164に含まれるキー値を比較し、この値に一致する組合せが見つかれば、ポインタの整合性があり、これに対して、一致する組合せが存在しないことをもって、不整合を検出するという手法を使用することができる。
以下、索引キー値の整合性の検証処理について、より具体的に説明する。ステップS306では、渡されたVLSセグメント・レコード168およびキー・レコード164中のキー値を処理対象に設定する。ステップS307では、索引キー検証部24は、処理対象のキー値と、IPSキー・レコード172に含まれる索引キー値とを順次比較する。ステップS308では、索引キー検証部24は、一致するキー値がIPSキー・レコード172中に処理対象に存在するか否かを判定する。ステップS308で、一致するキー値がIPSキー・レコード172中に存在しないと判定された場合(NO)には、ステップS309へ処理を進める。ステップS309では、索引キー検証部24は、索引キー値が不整合であるとして、その旨キー・エラーをエラー出力部26に報告し、ステップS310へ処理を進める。
一方、ステップS308で、一致するキー値がIPSキー・レコード中に存在すると判定された場合(YES)には、ステップS310へ処理を進める。ステップS310では、渡されたVLSセグメント・レコードおよびキー・レコード中に、次に処理すべきキー値が残っているか否かを判定する。ステップS310で、次に処理すべきキー値が残っていると判定された場合(YES)には、ステップS306へループさせ、次のキー値に対する処理を進める。一方、ステップS310で、次に処理すべきキー値が残っていないと判定された場合(NO)には、ステップS311で処理を終了させる。
図9は、本発明の実施形態の整合性検証処理のうち、索引キー値の整合性を検証する処理を、用いるデータ構造とともに示す図である。図9には、ITS180−1〜3、ISSであるスプリット・セグメントの接頭部182−1〜3、およびISSであるスプリット・セグメントのデータ部184−1〜4を含んで構成される索引付きデータベース140が示されている。ここで、データ部184−4は、DBMSによるセグメントの際に、削除処理が実施されず残されたデータ部に対応する。また図9には、IPS186−1〜3を含んで構成される索引データベース150が示されている。
図9に示す索引付きデータベース140が読み込まれると、VLSポインタ・レコードのセット190、およびVLSセグメント・レコードのセット192が作成される。VLSポインタ・レコードのセット190およびVLSセグメント・レコードのセット192がソートおよび突き合わせ処理されて、有効なペア194−1〜3と、削除済みレコード196と、その他、不整合レコードが特定される。本実施形態の索引キー検証処理では、そのうち有効なペア194のみが、有効キー値198−1〜3として索引データベース150内の索引キー値との整合性検証処理に渡される。引き続く索引キー値の整合性の検証処理では、削除済みにも関わらずエラー報告してしまうような不具合や、索引から削除されているべき索引キーを見逃してしまうような不具合が発生しない。すなわち、上述した実施形態の整合性検証処理では、スプリット・セグメントが存在する場合であっても、適切に索引キーの整合性の検証が実施可能となる。
なお、上述した実施形態における整合性検証処理では、セグメント間のポインタおよび分割ポインタの整合性を検証した後に、索引データベース150を読み込む構成としたが、その順序は特に限定されるものではなく、他の実施形態では、索引付きデータベース140の読み込みと連続して、索引データベース150を読み込む構成とすることもできる。さらに、他の実施形態では、階層型データベースに対し定義される索引データベースの整合性検証機能のみを実施する場合には、ISSやITSではないセグメントのワークレコードや、ポインタ・レコードの作成を省略することもできる。
図10は、データベース管理装置10のハードウェア構成を一例として示す。図10は、データベース管理装置10をメインフレーム50などの汎用大型コンピュータを用いて構成する場合を例に説明する。メインフレーム50は、少なくとも1つの中央処理装置52と、主記憶装置54と、記憶制御部56と、チャンネル・サブシステム58と、少なくとも1つの制御装置60と、少なくとも1つの入出力デバイス62a〜dとを含んで構成される。
主記憶装置54は、入出力デバイス62a〜dから入力されるデータおよびプログラムを記憶する。そして、主記憶装置54は、中央処理装置52およびチャンネル・サブシステム58からアドレスの指定を受けると、そのアドレスに記憶しているデータを中央処理装置52およびチャンネル・サブシステム58へ送出する。主記憶装置54は、記憶しているデータを高速に読書可能に構成されており、これにより、中央処理装置52による高速演算処理が可能とされる。
中央処理装置52は、メインフレーム50の全体を制御し、例えば、オペレーティング・システム53を動作させる。オペレーティング・システム53は、メインフレーム50におけるプログラムの実行および入出力処理を制御する。オペレーティング・システム53は、中央処理装置52上で動作する他のプログラムの実行を制御してもよい。例えば、本実施形態の整合性検証処理に対応するプログラムに加え、階層型データベースを管理するためのDBMSプログラムを実行することができる。また、オペレーティング・システム53は、入出力デバイス62a〜dのそれぞれにおけるデータ転送を制御することもできる。
記憶制御部56は、双方向または単方向に通信可能なバス64を介して中央処理装置52に接続される。記憶制御部56は、さらに、バス66を経由して、主記憶装置54に接続され、さらに、バス68を経由して、チャンネル・サブシステム58に接続される。記憶制御部56は、例えば、中央処理装置52またはチャンネル・サブシステム58から受領したアクセス要求を一時的に格納し、所定のタイミングでアクセス要求を主記憶装置54に送出する、所謂キューイング処理を行うことができる。
チャンネル・サブシステム58は、それぞれ制御装置60に対してデータ転送路76を介して接続される。チャンネル・サブシステム58は、入出力デバイス62a〜dおよび主記憶装置54間でのデータ転送を制御する。これにより、中央処理装置52が入出力デバイス62a〜dとの間で通信するための処理負荷が軽減されるため、中央処理装置52による演算処理と、入出力デバイス62a〜dによる入出力処理とを並列に実行させることができ、もって、メインフレーム50を効率的に動作させることが可能となる。
また、チャンネル・サブシステム58は、少なくとも1つのチャンネルパス72により、入出力デバイス62a〜dとのデータ転送を行う。それぞれのチャンネルパス72は、チャンネル・サブシステム58内に設けられたチャネル74を有する。また、それぞれのチャンネルパス72は、少なくとも1つの制御装置60と、データ転送路76とを有する。ここで、データ転送路76は、例えば、ESCON(登録商標;Enterprise Systems Connection Architecture)に基づくシリアルリンクとすることができる。また、データ転送路76は、ESCON(登録商標)に代えて、またはESCON(登録商標)に加えて、パラレルOEMIであってもよいし、FICON(登録商標;FIbre Connection)であってもよい。
制御装置60は、バス78を介して入出力デバイス62a〜dの少なくとも1つに接続し、入出力デバイス62a〜dの少なくとも1つを制御する。制御装置60は、入出力デバイス62a〜dのそれぞれにおけるデータ転送のタイミングを制御することができる。
入出力デバイス62a〜dのそれぞれは、制御装置60、チャンネル・サブシステム58、および記憶制御部56を順次経由して、主記憶装置54との間でデータ転送を行う。ここで、入出力デバイス62aは、具体的には、磁気テープドライブであり、入出力デバイス62b〜dは、ハードディスクドライブである。これに代えて、またはこれに加えて、入出力デバイス62a〜dのそれぞれは、パンチカードリーダ、ディスプレイ装置、キーボード、プリンタ、通信デバイス、各種センサ、またはその他の記憶装置であってもよい。入出力デバイス62のいずれか1つは、データベース12と接続され、アクセス制御を行うことができる。
なお、上述までは、データベース管理装置10は、メインフレーム50として構成される場合を例として説明してきた。しかしながら、データベース管理装置10は、その他、ミッドレンジ・コンピュータ、ワークステーション、パーソナル・コンピュータなどとして構成することもできる。
以上説明したように、本発明の実施形態によれば、データベース中に分割されたセグメント(スプリット・セグメント)が存在する場合であっても、階層型データベースの索引(索引データベース)について、正しくキー情報の不整合を検出可能な整合性検証処理を実行する情報処理装置、情報処理方法、プログラムおよび記録媒体が提供される。
上述したように、本発明の実施形態の構成によれば、セグメントが削除されたにもかかわらずそのデータ部を検出してしまった場合にも、その削除が正しく検知され、有効なキー情報のみが後続する索引キー情報の整合性を検証する処理に渡されることとなり、ひいては、スプリット・セグメントがデータベース中に存在する場合であっても、索引付きデータベース140に対して定義される索引データベース150において、データベースのオペレーションミスや、ソフトウェアまたはハードウェアの欠陥により発生し得る索引キー値の不整合を好適に検出することが可能となる。したがって、DBMSは、スプリット・セグメントを削除する際に、不整合の検証処理可能にその分割先データ部を残すことができ、トランザクションのパフォーマンスの低下を好適に防止することができる。
スプリット・セグメントに対応させて索引データベースの整合性を検証する処理としては、例えば、読み込み処理中、分割されたISSの接頭部のVLSポインタ、および分割されたISSのデータ部の保存先アドレスをメモリ上に確保したテーブルに別途それぞれコピーし、後にVLSポインタに一致する保存先アドレスを検索し、一致するものが見つかった場合にのみ、キー検証処理の対象とするという手法が考えられる。しかしながら、このメモリ上にテーブル展開する手法は、メモリ領域に関して限界を有し、スプリット・セグメントが数百万件となるケースでは、処理すべき索引付きデータベースおよび索引データベースが複数になると、さらに必要なメモリ領域が増大してしまい、大きな問題となる可能性がある。
これに対して、本発明の実施形態によれば、スプリット・セグメントにおける接頭部−データ部間のVLSポインタ情報の整合性を検証するために用意されるVLSセグメント・レコード中に、データ部に収容されるキー情報を含ませるのみで、削除済みのスプリット・セグメントのデータ部を正しく検出することが可能となる。そのため、スプリット・セグメントに対応するために確保しなければならない記憶領域の増加を、最小限に抑えることが可能とされる。
さらに本発明の実施形態によれば、VLSセグメント・レコードおよびVLSポインタ・レコードをソートして、突き合わせ処理するという、VLSポインタ情報の不整合を検出するためのロジックを利用して、検証処理に渡すべき有効なキー情報を判定しているため、削除済みであるか否かを別途調査する上記メモリ上にテーブル展開する手法と比較しても、テーブル検索やテーブルへのコピーなど、有効キーの判定のための余分なロジックを付加する必要がないという利点も備えているといえる。
なお、本発明につき、発明の理解を容易にするために各機能部および各機能部の処理を記述したが、本発明は、上述した特定の機能部が特定の処理を実行する外、処理効率や実装上のプログラミングなどの効率を考慮して、いかなる機能部に、上述した処理を実行するための機能を割当てることができる。
本発明の上記機能は、アセンブラ、C、C++、Java(登録商標)、Java(登録商標)Beans、Java(登録商標)Applet、Java(登録商標)Script、Perl、Rubyなどのレガシープログラミング言語またはオブジェクト指向プログラミング言語などで記述された装置実行可能なプログラムにより実現でき、装置可読な記録媒体に格納して頒布または伝送して頒布することができる。
これまで本発明を、特定の実施形態をもって説明してきたが、本発明は、実施形態に限定されるものではなく、他の実施形態、追加、変更、削除など、当業者が想到することができる範囲内で変更することができ、いずれの態様においても本発明の作用・効果を奏する限り、本発明の範囲に含まれるものである。
10…データベース管理装置、12…データベース、20…読込部、22…ポインタ検証部、24…索引キー検証部、26…エラー出力部、28…通常ポインタ検証部、30…索引ポインタ検証部、32…分割ポインタ検証部、50…メインフレーム、52…中央処理装置、53…オペレーティング・システム、54…主記憶装置、56…記憶制御部、58…チャンネル・サブシステム、60…制御装置、62…入出力デバイス、64,66,68,78…バス、72…チャンネルパス、74…チャネル、76…データ転送路、100…階層型データベース、102…RAP、110…セグメント、110a…SCフィールド、110b…DBフィールド、110c…ポインタ域フィールド、110d…データ・フィールド、120…セグメント、130…スプリット・セグメント、132…接頭部、132a…SCフィールド、132b…DBフィールド、132c…ポインタ域フィールド、132d…VLSポインタ・フィールド、134…データ部、134a…SCフィールド、134b…DBフィールド、134c…データ・フィールド、142,144,146,148…セグメント、150…索引データベース、152…IPS、152a…DBフィールド、152b…索引ポインタ・フィールド、152c…索引キー・フィールド、160…セグメント・レコード、162…ポインタ・レコード、164…キー・レコード、166…VLSポインタ・レコード、168…VLSセグメント・レコード、170…IPSポインタ・レコード、172…IPSキー・レコード、180…ITS、182…接頭部、184…データ部、186…IPS、190…VLSポインタ・レコード・セット、192…VLSセグメント・レコード・セット、194…有効ペア、196…削除済みレコード、198…有効キー