|
OpenVMS 用户手册
9.8.2 省略记录和字段
在说明文件中,使用 /CONDITION、/INCLUDE 和 /OMIT
限定词只处理那些输出文件需要的记录,可以提高 Sort 效率。(高性能 Sort/Merge
公用程序不支持说明文件。对这个特性的实现留待将来的 OpenVMS Alpha 发行版本。)
也可以使用说明文件限定词重新格式化记录,省略输出文件中不必要的字段。这些限定词不可用作命令行限定词。9.8.3 分配工作文件
在 Sort 操作期间,记录从输入文件读入存储器。如果分配的存储器不能保存所有记录,Sort 把排序的数据传输到一个或多个临时工作文件。Merge 不使用工作文件。
更改工作文件的数目并指派到特定设备,可以提高排序效率:
- Sort 命令行的限定词 /WORK_FILES=n 取代分配的工作文件的数目。
- Sort
通常把工作文件放入设备 SYS$SCRATCH,并且以任意次序存取它们。有两种方法可以把工作文件指派到特定设备:
- 在说明文件中,/WORK_FILES=(device,...)
限定词把工作文件放入指定的设备。有关在说明文件中使用 /WORK_FILES
限定词的详情,请参阅
9.9.3 节。
- 如果不使用说明文件,可以使用 DCL
命令 ASSIGN 把工作文件指派到特定设备。
Sort
使用 SORTWORKn 逻辑名为工作文件标识用户指定的设备名,在此 n 是一个从 0
至 9 的值。(对于高性能 Sort/Merge 公用程序,n 是一个从 0 至 254 的值。) 定义 SORTWORKn 逻辑名如下:
例如,
$ ASSIGN WORK$2: SORTWORK1
$ ASSIGN WORK$3: SORTWORK2
|
这个例子定义 SORTWORK1 为设备 WORK$2: 而 SORTWORK2
为设备 WORK$3:。有关逻辑名的详情,请参阅第 11 章。)
当指派工作文件给设备时,考虑以下几点:
- 把工作文件指派给最快可用的设备。例如,随机存储、海量存储设备,如磁盘。
- 挑选具有最少活动和最多可用空间的设备。
- 把每个工作文件指派到不同物理设备,以最大化重叠输入和输出操作。
9.8.4 修改工作区范围
如果 Sort 需要工作文件 (例如,排序一个大文件),那么较大的工作区可以提高排序效率。然而,如果系统任务繁重,它也许不能为您的进程分配工作区范围的所有页。这可以导致分页,当操作系统要在物理存储器和分页设备上的存储器之间传输部分进程时发生;只有进程的活动部分保持在物理存储器。要避免过多分页,可以减少进程的工作区范围。(使用 SET WORKING_SET 命令减少工作区范围。)9.9 Sort/Merge 限定词概要
以下列表描述 SORT 和 MERGE 命令使用的命令限定词。要使用一个命令限定词,就立即在 SORT 或 MERGE 命令之后包括这个限定词。
/[NO]CHECK_SEQUENCE
只应用于 MERGE 命令。验证在 MERGE 输入文件的记录顺序。按照默认,Merge 检查记录的顺序。 /CHECK_SEQUENCE 限定词检查一个或多个 (多达 10 个;而高性能 Sort/Merge 公用程序支持多达 12 个)
文件的记录是否已被排序。(如果想要把输入文件的所有记录指引到输出文件,则必须指定。)
如果要检查记录排序是否按照键字段而不是整个记录,就必须指定键信息以及使用请求顺序。 使用 /NOCHECK_SEQUENCE 限定词阻止 Merge 检查记录的顺序。 例子
$ MERGE/KEY=(SIZE:4,POSITION:3)/NOCHECK_SEQUENCE -
_$ PRICE1.DAT,PRICE2.DAT PRICE.LIS
|
在这个例子中,/NOCHECK_SEQUENCE 限定词指定不检查输入文件 PRICE1.DAT 和 PRICE2.DAT
的顺序。
/COLLATING_SEQUENCE=sequence
为字符键字段选择三个预定义比较次序之一,或者指定一个用于比较字符键的国家字符集 (NCS)
比较顺序名。(高性能 Sort/Merge 公用程序不支持 NCS 比较顺序。对 NCS
比较顺序的支持留待将来的 OpenVMS Alpha 发行版本。) Sort 可以按 ASCII (默认)、EBCDIC 或多国顺序排列字符。 例子
$ SORT/COLLATING_SEQUENCE=MULTINATIONAL -
_$ NAMES.DAT,NOM.DAT LIST.LIS
|
这个 SORT 命令根据多国比较顺序排列输入文件 NAMES.DAT 和 NOM.DAT,从而建立输出文件
LIST.LIS。
/[NO]DUPLICATES
按照默认,Sort 保留所有带重复键的多个记录。/NODUPLICATES 限定词剔除所有带重复键的记录,只保留一个。保留记录出现的次序可能与在输入文件的出现次序不同。如果想要指定保留哪个重复记录,那么在程序级调用 Sort,并指定一个等键例行程序。 /STABLE 和 /NODUPLICATES 限定词是相互排斥的。 例子
$ SORT/KEY=(POSITION:3,SIZE:5,DECIMAL)/NODUPLICATES -
_$ ACCT1,ACCT2 ACCT.LIS
|
这个 SORT 命令根据提供的键排列两个输入文件,剔除所有带相同键的记录,但保留一个。
/KEY=(POSITION:n,SIZE:n[,field,...])
描述键字段,包括位置、大小、排序次序
(ASCENDING 或 DESCENDING)、优先级 (NUMBER:n) 和数据类型 (例如字符、二进制或 h_floating)。按照默认,使用字符数据按升序排序整个记录,Sort
重新可排序一个文件。 有关 /KEY 限定词的详情,请参阅
9.2.1 节。
/PROCESS=type
(只应用于 SORT 命令。) 定义内部排序进程。/PROCESS 限定词允许您挑选四个进程之一: 记录、标签、地址或索引。(高性能 Sort/Merge
公用程序只支持记录进程。对标签、地址和索引进程的实现要留将来的 OpenVMS Alpha 发行版本。) 有关 /PROCESS
限定词的详情,请参阅 9.2.6 节。 例子
$ SORT/KEY=(POS:40,SIZ:2,DESC)/PROCESS=TAG YRENDAVG.DAT -
_$ DESCYRAVG.LIS
|
这个 Sort 操作使用标签排序进程建立输出文件
DESCYRAVG.LIS。
/SPECIFICATION=filespec
(高性能 Sort/Merge
公用程序不支持这个限定词。对这个特性的实现留待将来的 OpenVMS Alpha 发行版本。)
标识一个在 Sort 或 Merge 操作中使用的 Sort 或 Merge 说明文件。默认说明文件类型是 .SRT。 有关使用说明文件的详情,请参阅
9.7 节和
9.9.3 节。
/[NO]STABLE
按照默认,不保证把同键记录按它们在输入文件出现的次序放入输出文件。/STABLE
限定词按原来的次序维护记录。 /STABLE 和
/NODUPLICATES 限定词是相互排斥的。 例子
$ SORT/KEY=(POS:1,SIZ:5,DECIMAL)/STABLE PRICESA.DAT,-
_$ PRICESB.DAT,PRICESC.DAT SUMMARY.LIS
|
在这个 Sort 操作中,首先列出来自 PRICESA.DAT 的同键记录,然后是 PRICESB.DAT,最后是 PRICESC.DAT。
/[NO]STATISTICS
把统计概要显示到 SYS$OUTPUT,这些信息可以用于优化处理。要把这些统计保存到一个文件,使用以下命令:
$ DEFINE/USER SYS$ERROR output-file
|
统计概要包含以下信息:
统计 |
描述 |
Records read |
Sort 或 Merge 读取记录的数目。 |
Records sorted
|
使用 Sort 处理记录的数目。如果 Sort 或 Merge
操作使用一个说明文件只选择某些记录,那么这个数可能比读取的记录数要少。 |
Records output |
写入输出文件的记录数。如果选定 /NODUPLICATES
或者当写入输出记录时发生 I/O
错误,这个数可能比排序的记录数要少。
|
Working set extent
|
在进程工作区范围中的页数。这个值用作排序数据结构大小的上限。调整这个值是一种提高
Sort 操作效率的方法。 |
Virtual memory
|
添加到 Sort 映象用于保存数据的虚拟存储器的页数。 |
Direct I/O + buffered I/O
|
读取和写入数据所需要的 I/O
移动总数。这个总数越低,排序操作的效率就越高。 |
Page faults |
指出数据适于放入存储器的程度:
页故障数越高,排序操作的效率就越低。 |
Elapsed time
|
Sort 或 Merge
操作使用的总计时间,按小时、分钟、秒和百分之一秒计。 |
Input record length |
这个值从记录管理服务 (OpenVMS RMS)
获得,除非用户提供。 |
Internal length
|
一个以字节为单位的内部格式节点的大小。这包括任何键、数据、存储长度的字、记录文件地址
(RFA) 和转换的键。 |
Output record length
|
输出记录的长度。这个长度是从输入记录长度、排序进程和请求的重新格式记录计算出来的。
|
Sort tree size
|
适于放入 Sort 内部数据结构的记录数。 |
Number of initial runs |
数据适合放入存储器的一个指示。 |
Maximum merge order
|
一次合并的排序字符串的最大数目。 |
Number of merge passes
|
直到产生一个已排序的输出字符串时,Sort
公用程序合并字符串的次数。初始运行数和合并经过次数指出数据适于放入存储器的程度。这些数越高,工作区大小离包含数据也就越远,并且排序时间也就越长。 |
Work file allocation
|
用于工作文件的块数。当需要一个以上合并经过时,这个大小大约是输入文件分配大小的两倍。 |
Elapsed CPU
|
排序操作使用的 CPU 时间;它不包括等待 I/O
操作完成或等待另一个进程执行的时间开销。 |
例子
$ SORT/STATISTICS PRICE1.DAT,PRICE2.DAT PRICE.LIS
|
这个 SORT /STATISTICS 命令导致以下统计显示:
OpenVMS Sort/Merge Statistics
Records read: 793 Input record length: 80
Records sorted: 793 Internal length: 80
Records output: 793 Output record length: 80
Working set extent: 100 Sort tree size: 412
Virtual memory: 433 Number of initial runs: 2
Direct I/O: 22 Maximum merge order: 2
Buffered I/O: 9 Number of merge passes: 1
Page faults: 3418 Work file allocation: 114
Elapsed time: 00:00:05.98 Elapsed CPU: 00:00:03.63
|
/WORK_FILES[=n]
(只应用于 SORT 命令。) 增加 Sort 工作文件的数目,可从 1 至 10 个(高性能 Sort/Merge
公用程序支持多达 255 个),可使每个工作文件较小。如果可用磁盘太小或太满,而不能建立工作文件,那么增加文件数可以提高 Sort 操作的效率。
Sort 需要工作文件才会建立。如果 Sort
需要工作文件,按照默认它就建立两个 (SORTWORK0、SORTWORK1)放在 SYS$SCRATCH 目录中。 例子
$ ASSIGN DRA5: SORTWORK0
$ ASSIGN DB0: SORTWORK1
$ ASSIGN DB1: SORTWORK2
$ SORT/KEY=(POS:1,SIZ:80)/WORK_FILES=3 -
_$ STATS1,STATS2,STATS3,STATS4 SUMMARY.LIS
|
在这个 Sort 操作中,因为输入文件是个大文件,故指定三个工作文件提高 Sort 操作的效率。 注意,也可以通过包括目录名把工作文件指派到设备的特定目录。例如,要把 SORTWORK0 指派到 DRA5 上的 [WORKSPACE] 目录,输入以下命令:
$ ASSIGN DRA5:[WORKSPACE] SORTWORK0
|
9.9.1 输入文件限定词
在 SORT 或 MERGE
命令行中,以下输入限定词应该包括在输入文件说明之后:
/FORMAT=(RECORD_SIZE:n,FILE_SIZE:n)
定义输入文件特征;允许指定或取代记录或文件大小。在 SORT 或 MERGE
命令行中,它必须紧跟在输入文件说明之后指定。 Sort
使用输入文件大小信息确定需要的存储器总额,以及用于 Sort 操作的工作文件大小。如果文件大小未知 (例如,排序文件没有驻留在磁盘上或标准 ANSI 磁带上),那么 Sort 假定一个相当大的文件大小。 指定以下限定词值:
RECORD_SIZE:
n
|
以字节为单位,指定输入文件的最长记录长度 (LRL)。可以指定的最大最长记录长度于依赖于文件组织:
顺序
|
32,767
|
相对
|
16,383
|
索引顺序
|
16,362
|
|
|
对于带固定长度控制 (VFC) 格式的可变记录,这些值包括控制字节。 |
FILE_SIZE:
n
|
以块为单位,指定输入文件大小。可接受的最大文件大小是
4,294,967,295 块。 |
您也可以使用 /FORMAT 作为一个输出文件限定词。有关详情,请参阅
9.9.2 节。 例子
$ SORT/KEY=(POS:40,SIZ:2,DESC) -
_$CRA0:YRENDAVG.DAT/FORMAT=(RECORD_SIZE:41,FILE_SIZE:3) -
_$DESCYRAVG.LIS
|
因为输入文件 YRENDAVG.DAT 不驻留在磁盘设备或 ANSI 磁带上,故文件组织必须通过 /FORMAT 限定词加以描述。
9.9.2 输出文件限定词
以下输出限定词可以使用在 SORT 和 MERGE 命令中。要使用一个输出文件限定词,可在 SORT 或 MERGE
命令行中在输出文件说明之后包括这个限定词。
/ALLOCATION=n
为优化操作,指定预分配给输出文件的块数,从 1 至 4,294,967,295。如果知道输出文件分配将完全不同于全部输入文件分配,可使用这个限定词 (例如,重新格式化数据或省略记录时)。 如果使用 /CONTIGUOUS
限定词,则 /ALLOCATION 限定词是必需的。 例子
$ SORT/KEY=(POS:1,SIZ:80) STATS.DAT -
_$ SUMMARY.LIS/ALLOCATION=1000/CONTIGUOUS
|
这个 SORT 命令为输出文件 SUMMARY.LIS 分配 1000 个邻接块。
/BUCKET_SIZE=n
为优化操作指定相对和索引顺序输出磁盘文件使用的 OpenVMS RMS 桶大小 (每桶 512 字节块的数目)。允许一个 1 至 32 之间的值。 如果输出文件组织与输入文件一样,默认值与第一个输入文件的桶大小一样。如果输出文件组织不同,默认值则是 1。 例子
$ SORT/KEY=(POS:1,SIZ:80) STATS1.DAT,STATS2.DAT -
_$ SUMMARY.LIS/BUCKET_SIZE=16/RELATIVE
|
这个 SORT 命令导致输出文件 SUMMARY.LIS 具有相对文件组织,并且桶大小为 16。
/CONTIGUOUS
请求输出文件存储在邻接的磁盘块上,以减少存取时间。必须与 /ALLOCATION 限定词一起使用。按照默认,Sort/Merge 不为输出文件分配邻接的磁盘块。 例子
$ SORT/KEY=(POS:1,SIZ:80) STATS.DAT -
_$ SUMMARY.LIS/ALLOCATION=1000/CONTIGUOUS
|
这个 SORT 命令为输出文件 SUMMARY.LIS 分配 1,000 个邻接块。
/FORMAT=(类型:n[,...])
如果与输入文件格式不同,则指定输出文件的记录格式 (FIXED:n、VARIABLE:n 或 CONTROLLED:n)。您也可以指定文件记录的大小 (SIZE:n) 或
块大小 (BLOCK_SIZE:n)。 如果 Sort
操作是一个记录或标签排序,默认输出记录格式与第一个输入文件记录格式一样。如果 Sort
操作是一个地址或索引排序,默认输出记录格式是固定的记录格式。如果输入文件有不同的记录格式,那么 Sort 提供一个足够包含输入文件最大记录的输出记录大小。 可以指定以下限定词值。
BLOCK_SIZE:
n
|
如果把文件引入磁带,以字节为单位指定输出文件的块大小。如果输入文件是磁带文件,那么输出文件的块大小默认为输入文件的块大小。否则,输出文件的块大小默认为装上磁带时使用的大小。 |
|
n
可接受的值范围从 20 至 65,532。然而,要确保与其他 Compaq
系统的数据交换正确,必须指定一个不比 512 字节大的块大小。为了与非 Compaq 系统兼容,块大小不要超过 2,048 字节。 |
CONTROLLED:
n
|
指定输出文件中固定长度控制(VFC) 记录的变量。 |
FIXED:
n
|
指定输出文件的固定长度记录。 |
SIZE:
n
|
以字节为单位,指定 VFC (CONTROLLED) 记录固定部分的大小,多达 255 字节。如果不指定 SIZE,默认是第一个输入文件固定部分的大小。如果指定这个大小为 0,那么 OpenVMS RMS 默认该值为 2 字节。 |
VARIABLE:
n
|
指定输出文件的可变长度记录。 |
对于任何限定词值,您能够可选地指定 n 作为输出记录的最大记录大小 (以字节为单位)。最大记录大小的允许值依赖于文件组织:
顺序文件
|
32,767
|
相对文件
|
16,383
|
索引顺序文件
|
16,362
|
这些最大记录大小值包括固定长度控制 (VFC) 格式的可变记录的控制字节。 例子
$ SORT/KEY=(POS:1,SIZ:80) STATS.DAT SUMMARY.LIS/FORMAT=FIXED:80
|
输入文件 STATS.DAT 包括 80 字节长的可变长度记录。/FORMAT 限定词指定输出文件 SUMMARY.LIS 包括固定长度记录。
/INDEXED_SEQUENTIAL
定义输出文件的文件组织为索引顺序。注意,输出文件必须已经存在并且必须为空。另外,必须使用 /OVERLAY 限定词指定这个空文件可以被排序记录覆盖。 例子
$ CREATE/FDL=NEW.FDL AVERAGE.DAT
$ SORT/KEY=(POS:1,SIZ:80) DATA.DAT,STATS.DAT -
_$ AVERAGE.DAT/INDEXED_SEQUENTIAL/OVERLAY
|
CREATE/FDL 命令建立空文件 AVERAGE.DAT。SORT
命令指定输出文件具有索引顺序组织,并且写入空文件 AVERAGE.DAT。
/OVERLAY
指定一个现有的空文件,输出文件将覆盖它或写入。当使用 /INDEXED_SEQUENTIAL 限定词,/OVERLAY 限定词是必需的。 如果输入文件组织是索引顺序,输出文件必须已经存在并且是空的。如果输出文件不空,那么 /OVERLAY
不重写这个文件。而是把排序结果附加到现有输出文件的末端。
可以使用 CREATE/FDL
公用程序建立一个空数据文件。于是,当建立空文件时指定的任何属性就成为 Sort 输出文件的属性。 例子
$ CREATE/FDL=NEW.FDL AVERAGE.DAT
$ SORT/KEY=(POS:1,SIZ:80) STATS.DAT AVERAGE.DAT/OVERLAY
|
FDL 文件 NEW.FDL 为文件 AVERAGE.DAT 指定特殊的属性。当 Sort 把输出写入那个文件时,作为结果的 Sort
输出文件有 FDL 文件指定的属性。
/RELATIVE
定义输出文件的文件组织为相对。 例子
$ SORT/KEY=(POS:1,SIZ:80) STATS.DAT SUMMARY.LIS/RELATIVE
|
因为输入文件 STATS.DAT 不是一个相对文件,而输出文件 SUMMARY.LIS 将是,因此,/RELATIVE 限定输出文件说明。
/SEQUENTIAL
定义输出文件的文件组织为顺序。这是地址和索引排序操作的默认组织。记录和标签排序操作的默认组织与第一个输入文件相同。 例子
$ SORT/KEY=(POS:1,SIZ:80) STATS.DAT SUMMARY.LIS/SEQUENTIAL
|
因为输入文件 STATS.DAT 不是一个顺序文件,而输出文件 SUMMARY.LIS 将是,因此,/SEQUENTIAL 限定输出文件说明。
|