基于VFP的数据库Rushmore技术分析

时间:2022-05-23 11:56:27

基于VFP的数据库Rushmore技术分析

摘要:Visual FoxPro中的Rushmore技术虽然在一般教程中极少讲述,但在实用中却每有奇效,它也构成了Visual FoxPro独有的特色。该文从Visual FoxPro之索引、查询和优化等侧面,详细剖析了Rushmore技术的相关细节,对数据库开发者有一定的参考和借鉴作用。

关键词:Visual FoxPro;数据库;Rushmore;优化;索引

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)32-1034-03

Rushmore Technology Analysis Base on the VFP DBMS

CAO Ying-huai

(Public Security Marine Police Academy, Ningbo 315801, China)

Abstract: Although the Rushmore Technology of VFP been narrated singularly in common teaching material, but it has good effect always in applications, it make up of particular characteristic of VFP. In this paper, analyzing detailedly the detail of rusemore Technology, by index, query, optimize etc of VFP. help to developer of VFP DBMS.

Key words: VFP; DBMS; Rushmore; optimize; query

尽管拥有悠久历史的Visual FoxPro(简称VFP,下同)之Rushmore技术,在一般的教程中极少详述,但它在实用中却每有奇效,这也构成了VFP独有的特色之一。

1 Rushmore技术概述

在数据库中,传统的检索一般是按顺序进行的,即从数据表的首记录开始,逐条比较是否符合条件,直到找到满足条件的记录为止。但如果记录已被索引,就可不按顺序来查,可直接定位在符合部分条件的首记录上,再以该记录做界于前或后半部分再行搜索,同样的思路可在后续处理中继续使用。所以,检索效率较传统检索操作要高得多,这正是Rushmore技术的理论基础。

Rushmore技术的效果一般随着数据规模的增加而增加,越是大规模数据、越是复杂的数据,则效果愈发明显。一般地,凡是带FOR子句的VFP命令都要做查询处理,诸如COUNT、LOCATE、SELECT等。所以,Rushmore 技术因使命令执行速度加快,亦被称之为“优化查询”技术。这也是VFP在众多优秀的DBMS(如ORACLE等)领域中始终保持在个人PC上处理拥有数百万记录的真正巨大的数据表时,能与巨型机数据库系统相媲美的真正原因所在。

它之所以称之为“Rushmore”技术,是缘于发明者在看过Hitchcock的North By Northwest之后的一种灵感,对其所在系统内部某项目名称的选择。该技术利用标准的B-树搜索技术,且完全依赖于传统的索引类型。当然,因压缩索引( 即.IDX、.CDX文件)超强的压缩技术,意味着Rushmore技术拥有更加明显的优势。

Rushmore技术看似深奥难懂,但使用起来并不十分困难。一般地,只需将有关的字段建立索引后,执行有FOR子句的命令时,VFP系统便会自动根据索引去查询符合条件的记录,甚至无需设主索引。当然若非结构化复合索引,则须在查询前将索引文件打开。

2 Rushmore技术细节分析

2.1 分析方法与数据说明

为阐述问题方便,使读者能更清晰地理解分析结果,笔者在测试用的数据表中仅设置了一个字段,字符型,字段宽度为100。表中存储了记录11万条,记录的平均长度为65个字符,全部非空,且最短的记录也在45个字符以上,涉及汉字、英文字母和各种常用符号等。

分析中以时间为指标,单位取“毫秒”。为使分析结果稳定、客观,特在分析用的程序代码中就针对的命令,先后统计了执行10次的时间结果,最后再取平均值以横向比较。

2.2 分析用程序代码设计

考虑VFP中方便用时间来观察的命令特点,选取了几个代表性的检索和统计命令来研究。为此,笔者特意设计了一段VFP程序代码,通过简单修改代码中的关键命令,即可通过执行之来观察不同情况下Rushmore技术的超强效果。下面是COUNT命令的“测试代码”。

clear

use 数据表

&& 提取统计开始时间

dime time_str(10)

sums = 0

for i=1 to 10

start_t = second()*1000

&& 统计处理过程

count for field_name=;

[数据库原理与应用教案];

to var_name && nooptimize

&& 提取统计结束时间

end_t = second()*1000

time_str(i)=end_t - start_t

? alltrim(str(time_str(i)))

sums = sums + time_str(i)

next i

? [平均为: ]+ alltrim(str(sums/10))

return

其实,只要将上述代码中的COUNT … 关键命令换成诸如LOCATE、SELECT等,即可得到相应命令的Rushmore技术使用效果,鉴于篇幅,在此从略。

2.3 Rushmore技术的优化效果

笔者是在PⅣ2.0G联想台式微机上,WindowsXP环境下,通过VFP6.0来测试的。其实,测试的结果数据本身并不重要,但观察使用Rushmore技术前后的数据对比才是问题的关键。

测试效果之对比数据见图1、2、3所示。

从图1、2、3不难看出,对于COUNT命令而言,若不建立索引,则无法充分利用Rushmore的优势,不管是否在命令中设NOOPTIMIZE子句。

对于LOCATE命令而言,不建立索引同样无法利用Rushmore的优势,也不管你是否在命令中设NOOPTIMIZE子句。当然,使用了索引之后,则Rushmore技术效果明显。

VFP中的SQL命令SELECT(无WHERE条件时)不受索引的限制,下例可看出,索引与否效果基本一致。但若设有WHERE条件则区别极大。测试效果之对比数据见图4、5、6所示。

2.4 有优化潜力的VFP命令汇总

凡是可以携带FOR子句的VFP命令,均具有潜在的优化可能。下面罗列了VFP中所有的可使用Rushmore技术的命令。其具体效果本文从略,读者可参照 “测试代码”自行观察之。

SCAN、AVERAGE、BROWSE、CALCULATE、CHANGE、COPYTO、JOIN WITH、SORT TO、SUM、LOCATE、RECALL、LIST、REPLACE、EDIT、COUNT、DISPLAY、REPLACE FROM …、SET FILTER、DELETE、SET DELETED、TOTAL TO

3 基于Rushmore技术的VFP优化设计

VFP中的Rushmore技术,通过查找与筛选表达式左边相匹配的索引表达式来优化筛选条件。若试图将索引的标识名与筛选表达式相匹配,则VFP无法通过这种方式优化查询。即下面的索引在基于Rushmore技术的优化设计中是无效的:

USE数据表

INDEX ON UPPER(select_name) TAG name

SELECT * FROM数据表;

WHERE select_name=[比尔]

正确使用索引的Rushmore技术优化方法是:

SELECT * FROM数据表;

WHERE UPPER(cu_name)=[比尔]

另外,还应避免以: ‘FOR ’或‘ NOT ’ 这样的形式建立索引表达式,它们也是无法优化。例如:

INDEX ON DELETED() TAG DEL

&& 可进行 Rushmore 优化

INDEX ON NOT DELETED();

TAGNOTDEL

&& 不能优化

特殊情况下,若不想包含被删除的记录,可先设置 SET DELETED ON,再建索引,这样可以加速操作。此外,不要在只有少数离散数据中取值的字段(如逻辑型)上建立索引。

Rushmore技术要求命令之范围子句必须是ALL或REST。而NEXT或RECORD范围子句不能使用Rushmore优化机制。因为,默认范围是ALL,所以,当省略SCOPE子句时,Rushmore 技术是会起作用的?

4 Rushmore技术的优化机制

4.1 Rushmore技术优化前提

Rushmore技术的优化机制可解决检索操作何时能被优化或不能被优化的问题。因VFP之优化前提是:

“筛选表达式左边部分” 与 “索引关键字表达式” 完全匹配。

所以,只有查找到在索引中使用的精确匹配的表达式,Rushmore技术才能发挥作用并优化该表达式。例如,假设您刚创建一个表,并用如下的命令添加了第一个索引:

USE 数据表

INDEXONUPPER(select_name);

TAGname

在下面的命令中搜索条件只是基于select_name字段,而不是作为索引的那个表达式“UPPER(select_name)”,所以,VFP之Rushmore技术不能优化命令:

SELECT*FROM数据表 ;

WHERE select_name=[VFP]

但下面的命令却是可优化的:

SELECT*FROM数据表;

WHERE UPPER(select_name)=[vfp]

4.2 VFP组合表达式之优化机制

如果FOR条件中的基本表达式具有优化特征,则用VFP之逻辑运算符“AND、OR 或 NOT”组合之,亦构成可优化的、复杂的FOR子句表达式。表1总结了Rushmore技术中的检索优化内在规则。

虽然基于Rushmore技术的VFP检索速度很快,但当表中有较多的索引时,因为,更新数据表或向数据表中输入数据时VFP需要更新每一个索引,所以操作就会变得稍慢,故一般只需在用于筛选和联接的数据上建立索引即可。而且,索引也不是建的越多越好。

4.3 基于数据类型的优化分析

在VFP中引入了“日期时间型、整型、双精度型和货币型”四种新的数据类型之后,因这些类型的数据均以二进制数据形式存在磁盘上,故在设计中使用这些数据类型,一来可在从磁盘向内存加载数据或索引时,因一次可以加载更多的有用数据,从而提高程序的性能;二来因不需要做数据转换,所以数据访问就更快。这一切均为Rushmore技术提供了更好的优化环境。

一般地,在几种新的数据类型中,整型数据对速度的影响最大。故要尽量使用整型数据作为主关键字和外部关键字的值。这样不仅可得到更小的DBF表文件,亦可得到更小的索引,当然连接速度也就更快了。

上一篇:网络安全审计与监控系统的设计与实现 下一篇:基于规则的水质评价专家系统研究