菜鸟科技网

vf排序命令如何使用?

核心概念

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

vf排序命令如何使用?-图1
(图片来源网络,侵删)
  1. 数据记录:表中的每一行数据。
  2. 结构:定义了字段、数据类型、索引等。

SORTINDEX 的主要区别在于它们如何处理数据记录和表结构。


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

vf排序命令如何使用?-图2
(图片来源网络,侵删)
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 表。

vf排序命令如何使用?-图3
(图片来源网络,侵删)

示例1:创建一个按成绩升序排列的索引标记 idx_score

USE students
INDEX ON score TAG idx_score OF students.cdx

执行后,students.cdx 文件中会增加一个名为 idx_score 的索引,如果你使用 LISTBROWSE 命令,并设置主控索引,记录就会按成绩显示。

示例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

分享:
扫描分享到社交APP
上一篇
下一篇