1.13.1 ソート機能の処理の流れ
ソート機能の処理には,指定されたワークバッファのサイズにより次の二つの方式があります。
-
インコアソート
入力データ量に対して十分なワークバッファサイズを指定した場合,一時ファイルを使用しないでソートする処理のことです。
-
アウトコアソート
入力データ量に対してワークバッファサイズが不足した場合,一時ファイルを使用して,入力データを分割しながらソートする処理のことです。
ソートの処理は,次の三つのフェーズで構成されます。
-
ソートフェーズ
-
中間マージフェーズ
-
最終マージフェーズ
ソート処理では,三つのフェーズを順次実行します。ただし,インコアソートの場合,中間マージフェーズはありません。各フェーズの処理の概要を次に示します。
フェーズ |
インコアソート |
アウトコアソート |
||
---|---|---|---|---|
処理概要 |
処理の流れ |
処理概要 |
処理の流れ |
|
ソート |
入力ファイルからすべてのレコードを読み込み,ワークバッファ上でソートキーを比較し,指定された順序に整列する。 |
入力ファイルから分割してレコードを読み込み,ワークバッファ上でソートキーを比較し,指定された順序に整列したレコードの集合(ストリング)をソート用一時ファイルへ書き出す。 |
||
中間マージ |
− |
− |
ソートフェーズで作成したストリングがワークバッファに入らない場合に動作する処理。ソート用一時ファイルのストリングをワークバッファ上に読み込み,ワークバッファに入るストリング数になるまでマージする。マージしたストリングは,マージ用一時ファイルへ書き出す。 |
|
最終マージ |
ワークバッファ上のすべてのレコードを,出力ファイルへ書き出す。 |
ソート用一時ファイル※のストリングをワークバッファ上に読み込み,一つのストリングにマージして,出力ファイルへ書き出す。 |
各処理の流れを次に示します。
- <説明>
-
-
ソートフェーズ
入力ファイルからすべてのレコードをワークバッファに格納してソートします。
-
最終マージフェーズ
ワークバッファ上のすべてのレコードを出力ファイルへ書き出します。
-
- <説明>
-
入力ファイルから分割してレコードを読み込み,ワークバッファ上でソートキーを比較します。そのあと,指定された順序に整列したレコードの集合(ストリング)を,ソート用一時ファイルへ書き出します。
この例では,ワークバッファは3レコード分を格納できるサイズと仮定します。その場合,入力レコードを3レコードずつ読み込んでソートします。ソート用一時ファイルには,5本のストリングが出力されます(入力レコード15件÷3=5ストリング)。
- <説明>
-
ソートフェーズで作成したストリングの先頭レコードが,ワークバッファに格納できない場合(ストリング数>ワークバッファ格納レコード数)に動作します。ワークバッファに格納できるストリング数になるまでマージします。
この例では,ワークバッファは3レコード分を格納できるサイズと仮定します。その場合,ストリング1〜3と,ストリング4〜5をそれぞれマージします。マージ用一時ファイルには,2本のストリングが出力されます。
- <説明>
-
マージ用一時ファイル※のストリングを読み込み,一つのストリングにマージして,出力ファイルへ書き出します。
- 注※
-
中間マージフェーズが動作しない場合は,ソート用一時ファイルから読み込みます。
- <説明>
-
前ストリングの最終キーと,次ストリングの先頭キーが並んでいる場合,前ストリングに次ストリングを連結します。あらかじめ入力レコードのキーが並んでいると,ストリング連結されやすくなります。ストリング連結されることによって作成されるストリング本数が少なくなり,中間マージフェーズが動作しない場合もあります。
この例では,ワークバッファは3レコード分を格納できるサイズと仮定します。その場合,5本のストリングが出力されますが,ストリング連結されることによってストリング数は2本となるため,中間マージフェースは動作しません。