# OpenVMS
ユーザーズ・マニュアル

前へ | 次へ | 目次 | 索引

## 11.5.2 同一キー・フィールドによるレコードのマージ

ソート操作の場合と同様に，入力ファイルに同じキー・フィールドを持つレコードが2 つ以上ある場合，レコード順序が入力ファイルと同じになるとはかぎりません。同じキーを持つレコードの入力順序をそのまま残すには， MERGEコマンド行に/STABLE修飾子を指定します。同じキーを持つレコードのうち 1 つだけを残すには， /NODUPLICATES 修飾子を指定します。

# 11.6 ターミナルからのレコードの入力

ソートまたはマージしようとするレコードは，ファイルに格納されている必要はありません。 SORT または MERGE コマンドを入力するときに，ターミナルからレコードを直接入力することができます。次の表に，その手順を示します。

手順 | 操作
--- | ---
1 | SORT または MERGE コマンド行で，入力ファイルとして SYS$INPUT を指定する。 入力ファイル修飾子 /FORMAT を使用して，最も長いレコードのサイズ (バイト数) とそれに対応する入力ファイルのサイズ (ブロック数) を指定する。
2 | 後続の行にレコードを入力する。 Return を押して各レコードを終了させる。
3 | Ctrl/Z を押してファイルを終了させる。

次の例は，ソートしようとする入力レコードを，ターミナルから直接に入力する場合のソート操作を示しています。

    $ SORT/KEY=(POSITION:8,SIZE:15) -
    _$ SYS$INPUT/FORMAT=(RECORD_SIZE:24,FILE_SIZE:10) BYNAME.LST
    BST 7828 MCMAHON JANE [Return]
    ADM 7933 ROSENBERG HARRY[Return]
    COM 8102 KNIGHT MARTHA[Return]
    ANS 8042 BENTLEY PETER[Return]
    BIO 7951 LOWELL FRANK[Return]
    [Ctrl/Z]

このコマンド・シーケンスは，レコードをソートし，その結果を BYNAME.LST という名前のファイルに格納します。

# 11.7 Sort/Merge 指定ファイルの使用方法

Sort/Mergeでは，指定ファイル を使用してソート定義を格納しておき，必要があればさらに複雑なソート条件を指定することができます。 (高性能Sort/Mergeユーティリティでは，指定ファイルはサポートされていません。この機能は，OpenVMS Alphaの将来のリリースでサポートされる予定です。) 指定ファイルを作成するときは，任意の標準エディタやDCLのCREATEコマンドが使用できます。

Sort/Merge 指定ファイルを使用すると，次の操作を行えます。

- ソート/マージの対象とするレコードの選択

- 出力ファイルに格納されるレコードのフォーマットの変更

- 条件付きキーまたはデータの使用

- 複数のレコード形式の指定

- 照合順序シーケンスの作成や変更

- 作業ファイルの再割り当て

- 頻繁に使用するソート/マージ操作をファイルに格納

指定ファイルを作成したら， /SPECIFICATION 修飾子を使用してファイル名を指定します。指定ファイルの省略時のファイル・タイプは.SRTです。

指定ファイル内では，各コマンドの先頭にスラッシュ (/) を付けます。コマンドが 2 行以上にわたる場合でも，行継続文字は必要ありません。

注意 指定ファイルで使用する修飾子の多くは， Sort/Mergeコマンド行で使用する DCL 修飾子と似ています。ただし，これらの修飾子の構文は異なる場合があります。たとえば，DCLレベルの/KEY修飾子は，指定ファイルの/KEY修飾子とは構文が異なります。指定ファイルの修飾子については， 第 11.9.3 項 を参照してください。

コマンド行で指定する DCL コマンド修飾子は，指定ファイルの中の対応する項目を無効にします。たとえば，DCL コマンド行で /KEY 修飾子を指定しても， Sort/Merge は指定ファイルの中の /KEY 修飾子を無視します。

一般に，指定ファイルの中の修飾子はどのような順序で指定してもかまいません。ただし，次のような場合には，順序が重要になります。

- NUMBER:nキー要素を指定しない場合に，複数のキー・フィールドでソートする。

- 出力形式を記述する。

- 複数のレコード・タイプを定義する。

/COLLATING_SEQUENCE 修飾子と同時に FOLD，MODIFICATION，および IGNORE キーワードを指定する場合には， MODIFICATION 句とIGNORE 句をすべて指定してから FOLD 句を指定します。 /COLLATING_SEQUENCE修飾子についての詳細は， 第 11.9.3 項 を参照してください。

指定ファイルの中にコメントを挿入するには，各コメント行の先頭に感嘆符 (!) を付けます。 DCL のコマンド行と異なり，指定ファイルは行を継続するときにハイフン (-) を必要としません。

例

1. 次の例は，負と正のデータを昇順にソートするための指定ファイルです。

       ! Specification file for sorting negative and positive data
       ! in ascending order
       !
       /FIELD=(NAME=SIGN,POS:1,SIZ:1)  (1)
       /FIELD=(NAME=AMT,POS:2,SIZ:4)   (2)
       /CONDITION=(NAME=CHECK1,        (3)
                 TEST=(SIGN EQ "-"))
       /CONDITION=(NAME=CHECK2,        (4)
                 TEST=(SIGN EQ " "))
       /INCLUDE=(CONDITION=CHECK1,     (5)
                 KEY=(AMT,DESCENDING),
                 DATA=SIGN,
                 DATA=AMT)
       /INCLUDE=(CONDITION=CHECK2,     (6)
                 KEY=(AMT,ASCENDING),
                 DATA=SIGN,
                 DATA=AMT)

   指定ファイルを確認する際には，次の点に注意してください。

   1. このコマンド行は，レコードの第1バイトで始まる，長さ1バイトのフィールドを定義し，このフィールドに名前SIGNを割り当てる。

   2. このコマンド行は，レコードの第2バイトで始まる，長さ4バイトのフィールドを定義し，このフィールドに名前AMTを割り当てる。

   3. これは条件文である。 SIGN バイトに負符号 ( - ) がある場合，条件 CHECK1 を満たす。

   4. これは条件文である。SIGN バイトがブランクの場合，条件 CHECK2 を満たす。

   5. 条件CHECK1を満たす場合，レコードを降順にソートする。

   6. 条件CHECK2を満たす場合，レコードを昇順にソートする。

   図 11-8 は，上の指定ファイルの例を BALANCES.LIS という入力ファイルに使用した結果を示しています。

   図 11-8 指定ファイルを使用した出力

2.     /FIELD=(NAME=RECORD_TYPE,POS:1,SIZ:1)   ! Record type, 1-byte
       /FIELD=(NAME=PRICE,POS:2,SIZ:8)         ! Price, both files
       /FIELD=(NAME=TAXES,POS:10,SIZ:5)        ! Taxes, both files
       /FIELD=(NAME=STYLE_A,POS:15,SIZ:10)     ! Style, format A file
       /FIELD=(NAME=STYLE_B,POS:20,SIZ:10)     ! Style, format B file
       /FIELD=(NAME=ZIP_A,POS:25,SIZ:5)        ! Zip code, format A file
       /FIELD=(NAME=ZIP_B,POS:15,SIZ:5)        ! Zip code, format B file
       /CONDITION=(NAME=FORMAT_A,              ! Condition test, format A
                   TEST=(RECORD_TYPE EQ "A"))
       /CONDITION=(NAME=FORMAT_B,              ! Condition test, format B
                   TEST=(RECORD_TYPE EQ "B"))
       /INCLUDE=(CONDITION=FORMAT_A,           ! Output format, type A
                   KEY=ZIP_A,
                   DATA=PRICE,
                   DATA=TAXES,
                   DATA=STYLE_A,
                   DATA=ZIP_A)
       /INCLUDE=(CONDITION=FORMAT_B,           ! Output format, type B
                   KEY=ZIP_B,
                   DATA=PRICE,
                   DATA=TAXES,
                   DATA=STYLE_B,
                   DATA=ZIP_B)

   この例では，不動産代理店の2つの支社から送られた2つの入力ファイルが，指定ファイルの指示に従ってソートされます。 1つ目のファイルのレコードは，最初の位置にAがついており，次の形式になっています。

              |A|PRICE|TAXES|STYLE|ZIP|
               1 2     10    15    25

   2つ目のファイルのレコードは，最初の位置にBがつき， styleフィールドとzip codeフィールドが，次のように逆になっています。

              |B|PRICE|TAXES|ZIP|STYLE|
               1 2     10    15  20

   これらの2つのファイルを，レコードAの形式のzip codeフィールドでソートするとき，最初に両方のレコードのフィールドを，/FIELD修飾子で定義します。その後，/CONDITION修飾子で， 2つのタイプのレコードを区別するためのテストを指定します。最後に/INCLUDE修飾子を指定して，タイプBのレコード形式をタイプAのレコード形式に変更して出力します。
   /INCLUDE修飾子でキー・フィールドまたはデータ・フィールドのいずれかを指定する場合， /INCLUDE修飾子のSort操作で明示的にすべてのキー・フィールドとデータ・フィールドを指定する必要があります。
   また，タイプAでもタイプBでもないレコードは，ソート時に排除されます。

3.     /COLLATING_SEQUENCE=(SEQUENCE=
       ("AN","EB","AR","PR","AY","UN","UL",
       "UG","EP","CT","OV","EC","0"-"9"),
       MODIFICATION=("'"="19"),
       FOLD)

   この/COLLATING_SEQUENCE修飾子では，ユーザ定義順序を指定します。この指定により，それぞれの月に，日付順の固有の値が定義されます。たとえば，SEMINAR.DATというファイルを日付順に並べたい場合， SEMINAR.DATファイルは次のようになっています。

              16 NOV 1983   Communication Skills
              05 APR 1984   Coping with Alcoholism
              11 Jan '84    How to Be Assertive
              12 OCT 1983   Improving Productivity
              15 MAR 1984   Living with Your Teenager
              08 FEB 1984   Single Parenting
              07 Dec '83    Stress --- Causes and Cures
              14 SEP 1983   Time Management

   一次キーがyearフィールドで，二次キーがmonthフィールドです。 monthフィールドは数値ではありませんが，日付順に並べたいため，独自の照合順序を定義する必要があります。この場合，それぞれの月に固有のキー値を指定して，それぞれの月の2番目と3番目の文字を(日付順に)ソートすることにより，これを行います。
   MODIFICATIONオプションでは，アポストロフィ(')が19と同等になるよう指定していますが，これによって，'83と1984が比較できるようになります。またFOLDオプションは，大文字と小文字が同等に扱われるよう指定します。
   このSort操作の出力は，次のようになります。

              14 SEP 1983   Time Management
              12 OCT 1983   Improving Productivity
              16 NOV 1983   Communication Skills
              07 Dec '83    Stress --- Causes and Cures
              11 Jan '84    How to Be Assertive
              08 FEB 1984   Single Parenting
              15 MAR 1984   Living with Your Teenager
              05 APR 1984   Coping with Alcoholism

   ユーザ定義照合順序の他の例については， 第 11.3 節 を参照してください。

4.     /FIELD=(NAME=AGENT,POSITION:20,SIZE:15)
       /CONDITION=(NAME=AGENCY,
                   TEST=(AGENT EQ "Real-T Trust"
                   OR
                   AGENT EQ "Realty Trust"))
       /DATA=(IF AGENCY THEN "Realty Trust" ELSE AGENT)

   この例では，2つの不動産ファイルをソートします。 1つのファイルは，ある代理店がReal-T Trustと呼ぶもので，もう1つのファイルはRealty Trustと呼ばれます。 /CONDITION修飾子と/DATA修飾子により， Realty Trustのソート出力ファイルにAGENTフィールドがリストされることになります。

5.     /FIELD=(NAME=ZIP,POSITION:60,SIZE:6)
       /CONDITION=(NAME=LOCATION,
                   TEST=(ZIP EQ "01863"))
       /KEY=(IF LOCATION THEN 1
             ELSE 2)

   この例では，郵便番号01863を持つすべてのレコードがソート出力ファイルの最初にリストされます。条件テストは，/FIELD修飾子で定義されているようにZIPフィールドで行われます。条件名はLOCATIONになっています。 /KEY修飾子にある値1と2は，条件を満たすレコードと条件を満たさないレコードの相対順序を表すものです。

6.     /FIELD=(NAME=ZIP,POSITION:60,SIZE:6)
       /CONDITION=(NAME=LOCATION,
                   TEST=(ZIP EQ "01863"))
       /DATA=(IF LOCATION THEN "NORTH CHELMSFORD"
              ELSE "Outside district")

   この例では，/CONDITION修飾子により，郵便番号01863についてテストが行われます。 /DATA修飾子は，テスト結果に従って， townフィールドの名前が出力レコードに追加されるよう指定します。

7.     /FIELD=(NAME=FFLOAT,POS:1,SIZ:0,F_FLOATING)
       /CONDITION=(NAME=CFFLOAT,TEST=(FFLOAT GE 100))
       /OMIT=(CONDITION=CFFLOAT)

   この例では，/FIELD修飾子でフィールドFFLOATがF_FLOATINGと定義されているため，数値100がF_FLOATINGデータ型とみなされます。

8.     /FIELD=(NAME=AGENT,POSITION:1,SIZE:5)
       /FIELD=(NAME=ZIP,POSITION:6,SIZE:3)
       /FIELD=(NAME=STYLE,POSITION:10,SIZE:5)
       /FIELD=(NAME=CONDITION,POSITION:16,SIZE:9)
       /FIELD=(NAME=PRICE,POSITION:26,SIZE:5)
       /FIELD=(NAME=TAXES,POSITION:32,SIZE:5)
       /DATA=PRICE
       /DATA="  "
       /DATA=TAXES
       /DATA="  "
       /DATA=STYLE
       /DATA="  "
       /DATA=ZIP
       /DATA="  "
       /DATA=AGENT

   この/FIELD修飾子は，次の形式を持つ入力ファイルのレコードのフィールドを定義します。

       AGENT ZIP STYLE CONDITION PRICE TAXES

   /DATA修飾子では，/FIELD修飾子で定義されているフィールド名を使用しますが，レコードを再フォーマットして，次の形式の出力レコードを作成します。

       PRICE TAXES STYLE ZIP AGENT

# 11.8 ソートまたはマージ操作の最適化

ソート操作またはマージ操作の効率は，ソート環境により，いくつかの方法で向上させることができます。 SORTコマンドまたはMERGEコマンドに/STATISTICS修飾子を使用すると，ソート環境の変数を表示できます。

この統計情報を調べてから，この後に説明する最適化オプションの使用を検討してみてください。

SORT コマンドまたは MERGE コマンドに /STATISTICS 修飾子を指定すると，次のような出力が表示されます。

    $ SORT/STATISTICS PAGEANT.LIS DOCUMENT.LIS
                      OpenVMS Sort/Merge Statistics

    Records read:           3 (1)     Input record length:       26
    Records sorted:         3        Internal length:           28
    Records output:         3        Output record length:      26
    Working set extent: 16384 (2)     Sort tree size:            42
    Virtual memory:       392        Number of initial runs:     0
    Direct I/O:            10        Maximum merge order:        0
    Buffered I/O:          11        Number of merge passes:     0
    Page faults:          158 (3)     Work file allocation:       0 (4)
    Elapsed time: 00:00:00.54        Elapsed CPU:      00:00:00.03 (5)

この統計表示から次のことが分かります。

1. Records read
   ソート操作中に読み込まれたレコードの数を示す。ソート操作で特定のレコードを省略する方法についての詳細は， 第 11.8.2 項 を参照。

2. Working set extent
   ソート操作を実行するために確保されたブロックの数を示す。ワーキング・セットを大きくする方法についての詳細は， 第 11.8.4 項 を参照。

3. Page faults
   オペレーティング・システムが，物理メモリからページング・デバイスへプロセスを転送した回数を示す。ページングをしないようにする方法についての詳細は， 第 11.8.4 項 を参照。

4. Work file allocation
   作業ファイルのために確保されたディスク領域のサイズを示す。作業ファイルについての詳細は， 第 11.8.3 項 を参照。

5. Elapsed CPU
   オペレーティング・システムがソート操作の処理に費やした CPU 時間を示す。別のソート方法を選択して時間を節約する方法についての詳細は， 第 11.8.1 項 を参照。

## 11.8.1 ソートのプロセス

Sortでは，内部でデータをソートするときに使用する，レコード，タグ，アドレス，索引の4つのプロセスを定義します。 (高性能Sort/Mergeユーティリティでは，レコード・プロセスのみがサポートされます。タグ，アドレス，索引の各プロセスについては， OpenVMS Alphaの将来のリリースでサポートされる予定です。) RECORDが省略時のプロセスになります。指定するプロセスのタイプによっては，必要な記憶域の量と同様に， Sort操作の効率も変わることがあります。その他のソート・プロセスについての詳細は， 第 11.2.6 項 を参照してください。

どのタイプのソート方法を使用するかは，次の点を考慮して決定してください。

- 出力ファイルをどのように使用するか

  - レコード・ソートとタグ・ソートは，ソート済みの全レコードを含むファイルを生成するため，これらのファイルはいつでも使用できる。

  - アドレス・ソートと索引順編成ソートの出力ファイルは，Pascal，FORTRAN， MACRO，C などのプログラミング言語で作成されたプログラムによって処理できる。

  - アドレス・ソートは，入力ファイルの中のレコードに対するポインタのリストを作成する。このリストは，バイナリ形式の RFA と，複数の入力ファイルをソートするときのファイル番号から構成される。プログラムは，ポインタを使用してレコードにアクセスする。

  - 索引順編成ソートは，RFA とキー・フィールドに加えて，複数のファイルをソートするときのファイル番号が含まれる出力ファイルを作成する。これらのキー・フィールドの形式は入力ファイルと同じ。キー・フィールドの内容に従ってそれ以降の処理を決定する必要があるプログラムの場合には，アドレス・ソートではなく，索引順編成ソートを選択する。

  あるファイルのレコードを様々な目的で並べ換える必要がある場合には，アドレス・ソートまたは索引順編成ソートによって生成された複数の出力ファイルを格納する。望ましい順序で並べられたメイン・ファイルの中のレコードにアクセスするには，この出力ファイルを使用する。

- ソートに使用可能な一時的な格納領域

  タグ・ソートは，レコード・ソートに比べて，使用する一時格納領域が少なくてすむ。レコード・ソートは，ソート中はレコードに手を加えないので，ファイルが大きい場合には使用する作業領域が多くなる。アドレス・ソートと索引順編成ソートは，一時格納領域をほとんど使用しない。

- 使用する入力デバイスと出力デバイスのタイプ

  カード，磁気テープ，ディスクから入力を受け付けるプロセスは，レコード・ソートだけである。タグ・ソートとレコード・ソートの結果はどの出力デバイスにも出力できるが，アドレス・ソートと索引順編成ソートの結果は，バイナリ・データを受け付けるデバイスに出力しなければならない。

- 処理速度の相違

  ソートしたレコードを操作の最中に検索する予定がある場合，通常，レコード・ソートが最も処理速度が速くなる。それ以外の場合には，アドレス・ソートと索引順編成ソートの処理速度が速くなる。

前へ | 次へ | 目次 | 索引