(57)【特許請求の範囲】
【請求項１】
キー順に並べたレコードをブロック化して記録した複数のストリングから、上記ストリングの数と同数のバッファにブロックの先頭レコードのキー順にブロックを入力して、バッファ内のレコードを比較してキー順に出力するマージ処理装置であって、バッファの大きさがブロック長より小さいとき、
バッファ毎に、バッファ長に分割して順次入力するブロックの残りレコード部分を示すブロック内入力ポインタと、
上記キー順にレコードを出力して空きとなったバッファに対応するブロックを上記ブロック内入力ポインタが示す位置からバッファ長の部分をブロック入力するブロック入力手段と、
を備えることを特徴とするマージ処理装置。
【請求項２】
キー順に並べたレコードをブロック化して記録した複数のストリングから、上記ストリングの数と同数のバッファにブロックの先頭レコードのキー順にブロックを入力して、バッファ内のレコードを比較してキー順に出力するマージ処理プログラムであって、バッファの大きさがブロック長より小さいとき、
コンピュータに、
バッファ毎に、バッファ長に分割して順次入力するブロックの残りレコード部分を示すブロック内入力ポインタを管理する機能、
上記キー順にレコードを出力して空きとなったバッファに対応するブロックを上記ブロック内入力ポインタが示す位置からバッファ長の部分をブロック入力する機能、
を実現させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はソートマージ処理におけるマージ処理装置に関する。
【０００２】
【従来の技術】
図７にソートマージ処理の概要を示してある。
ソート処理では入力ファイルからレコードを入力し、複数のストリング（並べられたレコード列、複数のデータブロックからなる）とインデックス（一つのデータブロックに対して一つある、データブロックの先頭レコードをキーとして持つ）を作り作業ファイルへ出力する。マージ処理ではインデックスを参照しながら作業ファイルからストリング（データブロック）を入力し、複数のストリングを１本にして出力ファイルへ出力する。
【０００３】
【発明が解決しようとする課題】
従来のマージ処理は以下の問題がありその解決策が求められていた。
出願番号Ｓ６３−２２７９０８「マージ処理方法」ではデータのソートマージ処理に関し、マージ処理の処理効率を改善するマージ処理方法について、ストリング数と同じ個数のバッファがあればこれらのバッファ内のレコードのキーを比較して最も強いキーを出力して行くときにストリング中未入力のブロックの最強キーよりも強いキーのレコードの出力を行うことにより必ず空き作業バッファができるため効率よくマージ処理が実行できたが、ストリング数と同じ数の作業バッファが確保できるだけ十分に大きな領域が必要であるため動作条件を限定していた。
【０００４】
図８に従来技術の動作の説明図を示す。図８（ａ）においてＳ１〜Ｓ４は部分的にソートされた結果として得られたキー順に並べられブロック化されたレコードのストリングである。８１ａ、８１ｂはストリングＳ１の第１ブロックと第２ブロックであり、８２〜８４もＳ２〜Ｓ４に対応するものである。各ブロック内にある数字（１〜３２）はレコードのキーを表し数字の小さい方がキーが強いことを示している。各ブロックの先頭のレコードのキーを表す数字は○で囲んでありブロックの代表キーを示している。以下の説明においては上記キーを表す数字は○で囲んだものは「〔」と「〕」で囲んだ数字、その他のキーを表す数字は「（」と「）」で囲んで区別して示す。
【０００５】
図に示すように各ブロックの代表キーは各ストリング内において強さの順になっており、ブロック内のレコードのキーについても強さの順に並んでいる。マージ処理はこれらのストリング毎にキー順に並んだレコードをキー順に１つのレコードの並びとして出力することである。
【０００６】
図８（ｂ）には上記ストリングを同数のバッファを使用して入力してマージ処理するときのバッファＢ１〜Ｂ４上に読み込まれるブロックをブロックの代表キー番号で示している。（ａ）〜（ｅ）の５段階の状態を示し、各段階の移行に際してバッファの内容が変化することを下向き矢印「↓」で示してある。
【０００７】
最初にバッファＢ１〜Ｂ４には代表キーの大きさの順に〔１〕、〔２〕、〔３〕、〔５〕のブロックが読み込まれる。各バッファにあるレコードのキーの強い順にレコードが出力されて行きバッファＢ１内に読み込まれていたブロックの最後のレコード（キーが「９」）が出力完了するとバッファＢ１が空きとなり次のブロックを入力することができる。
【０００８】
そこで、次に読み込むブロックは各ストリングの未処理のブロックの中で代表キーの一番強い（数字の小さい）ブロックとなりＢ１にはＳ４のブロック（代表キー〔１４〕）が入力される（「↓」で示す）。すなわち、状態（ｂ）ではバッファＢ１〜Ｂ４にはブロック〔１４〕、〔２〕、〔３〕、〔５〕が入力された状態である。
【０００９】
同様にしてＢ２〜Ｂ４に残っているレコードと新規に読み込まれたＢ１のレコードのキーを比較して順次マージ出力し、状態（ｃ）、（ｄ）、（ｅ）の順に移行する。なお、ストリングと同数のバッファを使用したマージ処理では未入力のブロックの代表キーよりも強いキーのレコードを選択することにより必ずいずれかのバッファが空きになるので、バッファ上のレコードの比較のみで出力レコードを選択することができることは上記出願番号Ｓ６３−２２７９０８「マージ処理方法」に示されている。
【００１０】
また、出願番号Ｈ０６−１９２４８０「ソート処理方法および装置」では上記出願番号Ｓ６３−２２７９０８「マージ処理方法」のようにストリングと同じ個数の作業バッファが確保できない場合は、作業バッファ内のレコード移動を行って空き作業バッファを作っていたが、この方法はレコード移動が多くなったり、レコードを移動しても空き作業バッファができない場合は、作業ファイルへ書き戻して空き作業バッファを作ることで入出力処理が増えるという問題があった。
【００１１】
これら従来の方法は、ソート処理で出力したデータブロックの大きさとマージ処理で入力するデータブロックの大きさは入出力の単位であり同じであることが前提であったため、このような方法をとらざるを得なかった。
【００１２】
本発明はこのような点にかんがみて、
マージ処理で入力するデータブロックの大きさ、すなわち作業バッファの大きさを、ソート処理で出力したデータブロックの大きさより小さくできるようにすることで、十分に大きな領域がない場合でも、ストリングの数と同じ数の作業バッファを確保できるようにして、レコードの移動および入出力動作を少なくし、効率よくマージ処理ができるようにする手段を提供することを目的とする。
【００１３】
【課題を解決するための手段】
上記の課題は下記の如くに構成されたマージ処理装置によって解決される。
図１は、本発明の構成図である。
【００１４】
図において、２はキー順に並べたレコードをブロック化して記録した複数のストリングから、上記ストリングの数と同数のバッファにブロックの先頭レコードのキー順にブロックを入力する場合に、上記バッファの大きさがブロック長より小さいとき、分割して順次入力するブロックの残りレコード部分を示すブロック内入力ポインタであり、１は上記バッファに入力されたレコードをキー順に出力するマージ処理によりレコードが出力されて空きとなったバッファに入力されていたブロックに対応する上記ブロック内入力ポインタ２に基づいて上記ブロックの残りレコードを順次入力するブロック入力手段である。
【００１５】
【発明の実施の形態】
本実施の形態においては、パーソナルコンピュータ、ワークステーション等の汎用的な目的で使用される計算機上で実行するコンピュータプログラムにより実現する形態を示す。
【００１６】
本発明の画面対話処理装置は、処理装置、主記憶装置、補助記憶装置、入出力装置などから構成される計算機上で、コンピュータプログラムを実行して実現される。また、コンピュータプログラムは、フロッピーディスクやＣＤ−ＲＯＭ等の可搬型媒体やネットワーク接続された他の計算機の主記憶装置や補助記憶装置等に格納されて提供される。本発明の記録媒体は、上記可搬型媒体、主記憶装置、補助記憶装置に該当する。
【００１７】
提供されたコンピュータプログラムは、可搬型媒体から直接計算機の主記憶装置にロードされ、または、可搬型媒体から一旦補助記憶装置にコピーまたはインストール後に、主記憶装置にロードされて実行する。また、ネットワーク接続された他の装置に格納されて提供された場合も、他の装置からネットワークを経由して受信後に、補助記憶装置にコピー、主記憶装置にロードされ実行するものである。
【００１８】
図２に本発明のマージプログラムの動作の説明図を示す。構成を示す前に前記した従来技術のマージ処理との動作の違いを説明する。前記した図８に対応して同じレコードの並びを同じようにブロック化したストリングをマージ処理する場合について示している。図２（ａ）はストリングＳ１〜ストリングＳ４の４つのストリングのブロックの並びとブロック内のレコードの並びを示している。図８との違いは代表キー〔１〕のブロックの表示の仕方で例示すると、ブロック〔１〕は２１、２２で示す二つの部分に分けて表示し線で結合していることである。
【００１９】
これはブロック〔１〕はレコードキー〔１〕、レコードキー（４）、レコードキー（７）、レコードキー（９）を持った４つのレコードで構成されていることは図８と同様であるが、バッファに入力するとき２回の入力処理で２つの部分に分けて処理することを示している。すなわち、本発明の特徴であるバッファの大きさがソートで出力したストリングのブロックの大きさよりも小さいときでもストリングと同数のバッファがあるときには効率よくマージ処理できることを説明するためにバッファ長をブロック長の半分、１ブロックに４レコードのブロッキングのときバッファには２レコードが読み込まれることを前提としている。ブロックの前半部分にあるレコード〔１〕、レコード（４）と後半部分のレコード（７）、レコード（９）は同時にはバッファ上に存在しないことになることを示している。
【００２０】
図２（ｂ）にはしたがって図８での状態遷移とは異なりブロックの前半、後半のそれぞれがバッファに読み込む単位となっている。従来技術ではバッファの一つがマージ処理によって空になったとき未入力のブロックの中で一番強い代表キーを持ったブロックを読み込むようになっていたが、本発明の実施の形態においてはバッファが空きになったときにそれまでバッファに存在していたブロックの後半部分が未処理であった場合には無条件に空きになったバッファに後半部分を入力する。
【００２１】
図２（ｂ）においてＢ１〜Ｂ４は４つのバッファを示し、（ａ）〜（ｍ）はバッファへの新たな入力があったときの状態の変化を示す。下向き矢印「↓」はそのバッファにおいて入力が発生したことを示している。
【００２２】
状態（ａ）では各バッファにはストリングのブロック代表キーの強さの順に選ばれたブロックの前半２レコード分がまず入力されている。ブロック〔１〕においては２１の部分すなわちレコード〔１〕とレコード（４）が入力されている。バッファＢ２には同様にストリングＳ３のレコード〔２〕、レコード（６）が入力されている。Ｂ３、Ｂ４も同様である。
【００２３】
マージ処理ではキーの強さの順にバッファ上のレコードが順次〔１〕、（２）、（３）、（４）が出力されてブロック〔１〕の前半を入力していたバッファＢ１は空になり同じブロックの後半が未処理レコードとして残っているので２２で示す後半部分のレコード（７）、レコード（９）を読み込み状態（ｂ）のようになる。
【００２４】
つづいて、バッファ上のレコードを比較してキー順に出力が進みレコード（６）が出力されるとバッファＢ２が空きとなりブロック〔２〕の後半部分のレコード（１７）、レコード（２０）が入力される。以下同様にマージ処理が進むが状態（ｄ）から（ｅ）に移行するところではバッファＢ１からレコード（９）が出力されてバッファが空きになるがブロック〔１〕のレコードはすべて処理が済んだので新しいブロックの読み込みが必要になる。
【００２５】
ここでは従来技術と同様に未処理のブロックの代表キーを比較して最も強いキーを持ったブロック〔１４〕を選択してその前半部分のレコード〔１４〕とレコード（１９）を入力する。以下同様であるが、ストリングの最後の部分においては、ブロックに存在するレコードの数はブロック長すべてをみたすものとならない場合があり（ショートブロック）、残りのレコードの存在の有無でバッファへの入力すべきものを判定する。
【００２６】
図３には本発明の実施の形態の構成図（その１）、図４には本発明の実施の形態の構成図（その２）を示す。図３には上記図２において説明したような４つのストリングからなるソート結果を入力としたときのマージ処理装置の構成を示す。バッファの数と大きさについては、実際にはストリングの数はソート処理の結果として決まりマージ処理の実行パラメータとして与えられるのでバッファとして利用可能な領域の大きさをストリング数で分割してレコード長の整数倍の大きさのバッファをストリング数個設定することになる。
【００２７】
ここでは説明がし易いように固定してストリング３１、それに付随してストリング３１の各ブロックの代表キーを表示するインデックス３２、バッファ（作業域）３７とこれらの資源を関連付けてマージ処理の進行状況を表示する処理状態表示部３６はすべてストリング数と同じ４個づつ設定して示してある。これらの内ストリング３１とインデックス３２、またバッファ３７と処理状態表示部３６は固定して対応しているが処理状態表示部３６とストリング３１（インデックス３２）の対応はマージ処理の進行にともないストリング３１に含まれるデータブロック、レコードの内容により変化することになる。
【００２８】
ブロック入力部３３はストリングから代表キーの順にブロックをバッファに読み込むものである。バッファ３７の選択、ブロックの選択は処理状態表示部３６を参照して決定するようになっている。
【００２９】
レコード比較部３４はバッファ３７に読み込まれているレコードのキーを比較して未処理の最も強いキーのレコードを選び、レコード出力部３５でマージ処理結果３８として出力する。
【００３０】
図４により処理状態表示部３６とインデックス３２とブロック４３、バッファ３７の内部構成と関連を示している。処理状態表示部３６はマージ処理の実行に必要な資源の状態を表示するものでバッファ３７とは処理状態表示部３６のバッファアドレスでリンクされている。インデックス３２はソート処理の結果としてキー順に並んだブロックの先頭レコードのキーすなわちブロック代表キーとそのブロックのアドレスを持っており処理状態表示部３６のインデックスポインタがその所在を示している。これにより処理状態表示部３６にリンクしているバッファ３７に入力されているブロック４３が分かる。そして、インデックスのブロックアドレスが指し示すブロック４３に含まれるレコードＲ１〜Ｒ８の内どこまでバッファに入力されているのかすなわち次はブロックのどのレコードから入力するのかを示すものがブロック内ポインタであり処理状態表示部３６に保持されている。ブロック４３のレコードＲ１〜Ｒ８のキーはＫ１〜Ｋ８で示してある。
【００３１】
図４ではブロック内ポインタはキーＫ５を持ったレコードＲ５を指し示している。処理状態表示部３６のレコードポインタはマージ処理が進行して複数のバッファに入力されているレコードの中からキー順に出力された結果、バッファ３７に読み込まれたレコードの中で残っている最も強いキーを持っているレコードの位置を指し示している。レコード比較部は各バッファのレコードポインタで示されるレコードを比較して最強のキーを持つレコードを選びレコード出力部からマージ結果として出力することになる。
【００３２】
図４においてはバッファ３７の中のキーＫ４を持ったレコード位置Ｗ４がレコードポインタにより指し示されている。なお、図５（ａ）における細線５３はバッファ５１ａ、５１ｂ、５１ｃ、５１ｄに読み込まれたレコードのキーをトーナメント方式で比較して選ぶことを意味するものである。
【００３３】
ここでバッファとデータブロックの対応について図５の本発明の実施の形態の作業バッファとデータブロックの関連の説明図を使って説明する。図５（ａ）には作業バッファの大きさを示している。バッファ５１ａ〜５１ｄの大きさｎはマージ処理で入力できるデータブロックの大きさを示している。
【００３４】
点線で拡張して示している領域の大きさｍはソート処理で出力したデータブロックの大きさを示している。このようにマージ処理で使用できる領域の大きさが小さい場合マージ処理で入力するデータブロックの大きさを小さくするようにしている。
【００３５】
なお、ソート処理で出力されたデータブロックの大きさより小さいバッファへの読み込み手段はＩ／Ｏコマンドを利用してブロック内の部分を読み込む方法やＯＳの入出力機能の関数を利用してファイルの先頭からの位置と読み込むデータの長さを指定する方法などがある。
【００３６】
図５（ｂ）には作業ファイル５４に格納されているストリングに保持されているブロック５５とブロック５５の一部を読み込んだバッファ５６を対応付けて示している。ブロック５５の大きさはｐであり、ブロックの一部ｑの部分がバッファの大きさだけバッファ５６に入力される。ここでは分かりやすくするためブロックの半分をバッファに読み込み残り半分を次に読み込むこととして図示して説明しているが、３分割以上に分けて処理する場合もある。
【００３７】
ただし、マージ処理はレコードを単位とするものでありバッファの大きさはレコード長以上が実用的である。また、ストリングの最終ブロックではショートブロックの場合もあるがこのときはバッファの途中までレコードが入力された状態となるがこれは通常のファイル終了の処理として扱えばよい。
【００３８】
以上のような構成の実施の形態における動作を図６の本発明の実施の形態の動作のフローチャートにより説明する。図示していないが前記したようにバッファの領域が十分に確保できるときは従来技術と同様の処理となるが作業バッファの大きさをソート処理で出力されたブロックの大きさと同じにし、十分な領域がない場合には作業バッファを小さく設定するようにする。何れにしてもストリング数のバッファを事前に確保してあるとする。
【００３９】
ステップＳ６０においてストリングに付随してブロックの代表キーを格納したインデックスにより代表キーの強さの順にストリングからデータブロックを空きの作業バッファに読み込む。ステップＳ６１では処理状態表示部にインデックスとバッファをリンクする。
【００４０】
ステップＳ６２において、バッファの領域がブロックの大きさより小さい場合にはブロックの一部のみ入力するのでブロック上の残りレコード数を計算しブロック内ポインタとして処理状態表示部に格納する。ステップＳ６３ではブロックの途中までバッファに読み込んだ状態であるか、すなわち残りレコードがあるか否かを調べている。単にブロック長とバッファ長の関係ではなくショートブロックの場合も含めてブロック上に残りの有効なレコードがあるかを調べるのである。
【００４１】
残りレコードがある場合はステップＳ６７で処理状態フラグを「処理中」とする。残りレコードがない場合はステップＳ６４で処理状態フラグを「処理済」とする。ステップＳ６５ではバッファ上のレコードのキーを比較してキーの強さ順にレコードを出力ファイルに出力し、いずれかのバッファが空きになるまでマージ処理を行う。前記したようにいずれかのバッファが必ず空きとなる。
【００４２】
ステップＳ６６で処理状態フラグが「処理中」かを調べ処理中すなわち残りレコードがあるブロックであることが分かるとステップＳ６８で残りレコードを入力してステップＳ６２に移り残りレコードを同じバッファに読み込み同様のレコード比較を行うことになる。フラグが「処理済」であればステップＳ６９に移りインデックスにより未処理のブロックがないかを調べる。
【００４３】
すなわちいずれかのストリングに未処理のブロックが残っていれば代表キーの一番強いブロックを空いた作業バッファに読み込んでマージ処理を続行する。未処理インデックスがない場合はステップＳ７０で全てのバッファが空きになったかを調べてまだ未処理のレコードがバッファに残っていればステップＳ６５でマージ処理を続行する。全てのバッファが空きのときはマージ処理を終了する。
【００４４】
【発明の効果】
以上の説明から明らかなように本発明によればソートマージ処理において作業領域が少ない場合でもストリング数と同数のバッファを利用する方式を使用してデータブロックを分割して入力することによりレコード移動や作業ファイルへの書き出しを不要とした論理の簡潔なマージ処理を提供することによりマージ処理の性能向上が図れる、という工業的効果がある。
【図面の簡単な説明】
【図１】  本発明の構成図
【図２】  本発明のマージプログラムの動作の説明図
【図３】  本発明の実施の形態の構成図（その１）
【図４】  本発明の実施の形態の構成図（その２）
【図５】  本発明の実施の形態の作業バッファとデータブロックの関連の説明図
【図６】  本発明の実施の形態の動作のフローチャート
【図７】  ソートマージ処理の概要
【図８】  従来技術の動作の説明図
【符号の説明】
１  ブロック入力手段
２  ブロック内入力ポインタ
【図１】
0003785766.tif 000002
【図２】
0003785766.tif 000003
【図３】
0003785766.tif 000004
【図４】
0003785766.tif 000005
【図５】
0003785766.tif 000006
【図６】
0003785766.tif 000007
【図７】
0003785766.tif 000008
【図８】
0003785766.tif 000009