核心概念
在 VF 中,数据通常存储在 表 中,一个表包含两部分:

- 数据记录:表中的每一行数据。
- 结构:定义了字段、数据类型、索引等。
SORT 和 INDEX 的主要区别在于它们如何处理数据记录和表结构。
SORT 命令
SORT 命令的作用是 物理排序,它会根据指定的字段,创建一个 全新的表,其中包含原表中被选中的记录,并按照指定的顺序排列。
语法
SORT TO <新文件名> ON <字段名1> [/A|/D] [/C] [, <字段名2> [/A|/D] [/C]] ...
[<范围>] [FOR <条件1>] [WHILE <条件2>]
[FIELDS <字段名列表>]
参数说明
TO <新文件名>:指定新生成的排序表的文件名。这是必须的,SORT总是会产生一个新文件。ON <字段名>:指定作为排序依据的字段。/A:按升序排列 (Ascending),这是默认值。/D:按降序排列。/C:在排序时不区分大小写。
<范围>和FOR/WHILE <条件>:指定参与排序的记录范围,如果省略,则对表中的所有记录进行排序。FIELDS <字段名列表>:指定新表中包含哪些字段,如果省略,新表将包含原表的所有字段。
示例
假设我们有一个名为 students.dbf 的学生成绩表,结构如下:
xh(学号, C)xm(姓名, C)bj(班级, C)score(成绩, N)
示例1:按成绩降序排序,生成新表 sorted_by_score.dbf

USE students SORT TO sorted_by_score ON score /D
执行后,会生成一个 sorted_by_score.dbf 文件,其中所有学生记录按 score 字段从高到低排列。
示例2:按班级升序、成绩降序排序,并只保留学号、姓名和班级字段
USE students SORT TO sorted_by_class_score ON bj /A, score /D FIELDS xh, xm, bj, score
SORT 的特点与注意事项
- 产生新文件:这是
SORT最大的特点,它会将排序后的数据完整地写入一个新.dbf文件,这会占用额外的磁盘空间。 - 数据冗余:如果原表数据更新了,排序表
sorted_by_score.dbf不会自动更新,它是一个“快照”,你需要重新运行SORT命令来生成最新的排序结果。 - 速度:对于非常大的表,
SORT命令可能会比较慢,因为它需要读取所有记录、在内存中进行排序、然后写入新文件。 - 何时使用:
- 当你需要一个独立的、物理上排好序的文件,用于导出或归档时。
- 当你需要基于不常用字段进行一次性排序,并且不希望维护索引时。
INDEX 命令
INDEX 命令的作用是 逻辑排序,它不会移动或复制任何数据记录,相反,它创建一个 索引文件(在 VF 中通常是 .cdx 或 .idx),这个文件就像一本书的目录,记录了记录的物理顺序与逻辑顺序之间的对应关系。
语法
INDEX ON <索引表达式> TO <索引文件名> | TAG <索引标识名> [OF <复合索引文件名>]
[FOR <条件>] [COMPACT] [ASCENDING | DESCENDING]
[UNIQUE | CANDIDATE]
[ADDITIVE]
参数说明
ON <索引表达式>:这是索引的核心,可以是一个字段,也可以是多个字段的组合(如bj + score),甚至是表达式。TO <索引文件名>:创建一个 单入口索引文件 (.idx),这是较老的方式,现在较少使用。TAG <索引标识名> [OF <复合索引文件名>]:创建一个 复合索引标记 (.cdx),这是 推荐使用的方式,一个.cdx文件可以包含多个索引标记(tag),每个 tag 有一个唯一的名字。FOR <条件>:创建一个 过滤索引 或 条件索引,只有满足条件的记录才会被包含在索引中。ASCENDING | DESCENDING:指定索引的排序方向,默认是升序。UNIQUE:唯一索引,如果多条记录的索引表达式值相同,只有第一条记录会被索引。CANDIDATE:候选索引,确保索引表达式的值在表中是唯一的,用于主键或候选键。ADDITIVE:在创建新索引时,保留已经打开的其他索引,默认情况下,INDEX命令会关闭其他所有索引。
示例
仍然使用 students.dbf 表。

示例1:创建一个按成绩升序排列的索引标记 idx_score
USE students INDEX ON score TAG idx_score OF students.cdx
执行后,students.cdx 文件中会增加一个名为 idx_score 的索引,如果你使用 LIST 或 BROWSE 命令,并设置主控索引,记录就会按成绩显示。
示例2:设置主控索引并查看
SET ORDER TO TAG idx_score && 将 idx_score 设置为当前主控索引 LIST && 现在记录会按 score 升序显示
示例3:创建一个复合索引,包含两个标记:一个按班级,一个按姓名
USE students INDEX ON bj TAG idx_class && 按班级排序 INDEX ON xm TAG idx_name && 按姓名排序
students.cdx 中有了两个索引,你可以随时通过 SET ORDER TO 来切换使用哪个索引。
INDEX 的特点与注意事项
- 不产生新文件:只创建一个很小的索引文件(
.cdx),不复制数据。 - 数据实时同步:当原表的数据(如
score字段)被修改、记录被添加或删除时,VF 会自动维护打开的索引,保证索引始终是最新的,这是INDEX相对于SORT最大的优势。 - 速度:索引的创建和维护需要时间,但一旦建立,查找、排序和分组操作会非常快,尤其是在大数据量下。
- 占用内存:打开的索引会占用一部分系统内存。
- 何时使用:
- 当你需要频繁地按某种顺序查看、查询或报表数据时(99% 的情况都应使用索引)。
- 当需要保证数据访问速度时。
- 当需要基于多个字段或复杂表达式进行排序时。
SORT vs INDEX 总结对比
| 特性 | SORT (物理排序) |
INDEX (逻辑排序) |
|---|---|---|
| 核心原理 | 创建一个包含已排序数据的新表 | 创建一个记录逻辑顺序的“目录”文件 |
| 数据文件 | 产生一个新的 .dbf 文件 |
不产生新数据文件,只生成 .cdx 或 .idx 文件 |
| 数据同步 | 不同步,原表更新后,排序表不会自动更新 | 自动同步,原表更新时,打开的索引会自动维护 |
| 磁盘空间 | 占用大量磁盘空间(数据被复制) | 占用少量磁盘空间(仅索引文件) |
| 内存占用 | 主要在排序时占用内存 | 打开索引后会持续占用内存 |
| 适用场景 | 一次性数据导出、归档、生成独立报表 | 频繁的数据查询、排序、报表、表单数据绑定 |
| 性能 | 创建时可能慢,但之后访问排序表很快 | 创建时稍慢,但后续的排序、查找操作极快 |
| 命令示例 | SORT TO new.dbf ON field1 |
INDEX ON field1 TAG mytag |
结论与最佳实践
在现代 VF 应用程序开发中,应优先使用 INDEX。
INDEX是 VF 数据库管理的核心,它实现了数据的快速检索和逻辑组织,是构建高性能、响应式应用程序的基础。SORT可以看作是一个特殊工具,仅在需要生成一个物理上独立的、静态的数据快照时才使用,例如将数据导出给另一个不使用 VF 的系统。
记住这个原则:如果数据是活的、需要频繁访问的,就用 INDEX;如果数据是死的、只需要一次性使用,才考虑 SORT。
