登录注册
上海交通大学论坛 > 数据库 > 浏览当前帖子 手机版 关闭左侧栏
优化Visual Foxpro
返回本版】  【发表帖子】  【回复帖子 浏览量  9575      回帖数 0
seagame    等级  

楼主 发表于  2012/5/25 2:28:54    编 辑   


 
    深入了解,Rushmore技术 
    Rushmore技术是一种快速高效访问记录集合的数据访问技术。Ru 
shmore技术最大限度地利用了压缩索引的优点,而又不受限于只使用 
这种索引。在最简单的形式下,Rushmore根据已有索引使用FOR子句指 
定某一范围的记录来加速单表命令的执行。Rushmore也可以加速□□ 
一些命令的操作,如LOCATE和INDEX。 

    1.在表中使用Rushmore 
    您可以根据所涉及表的数目,使用Rushmore技术优化对数据的访 
问。若要使用Rushmore ,请选择下列选项
    .若要访问单表数据,请使用FOR子句。 
    .若要访问多个表的数据,请使用SELECT-SQL命令。 
    访问单表时,可以在任何FOR子句出现的地方使用Rushmore。访问 
多表时,SELECT-SQL查询将取代所有的Rushmore。SQL确定如何优化查 
询并自动执行此项工作。您不需要打开表或索引,如果SQL决定需要索 
引,它会创建临时索引供自己使用。 
    2.带有FOR子句的潜在可优化命令 
    AVERAGE BLANK BROWSE CALCULATE CHANGE COPY TO COPY TO AR 
RAY COUNT DELETE DI SPLAY EDIT EXPRORT TO  INDEX JOIN WITH L 
ABEL LIST LOCATE RECALL REPLACE  REPLAC E FROM ARRAY REPORT  
SCAN SORT TO SUM TOTAL TO  
    3.优化Rushmore表达式 
    Rushmore技术取决于FOR子句中是否出现基本可优化表达式。一 
个基本可优化表达式可以是整个表达式,也可以是表达式的一部分。 
您也可以对基本表达式进行各种组合构成复杂的可优化表达式。 
    (1)创建基本可优化表达式 
    基本可优化表达式一般是下面两种形式
    elndex relOp eExpr 
    eExpr relOp eIndex 
    基本可优化表达式具有以下特点
    .eIndex必须精确地匹配用以构造索引的表达式,且不包含别名 
。 
    .eExpr是任意表达式,可以包含变量和□□不相关表中的字段。 
    .relOp是下列关系操作符之一:<、>、=、<=、>=、<>、#、==或 
!=。您也可以使用IS- NULL()、BETWEEN()或INLIST()函数。 
    若要在可优化表达式中使用BETWEEN或INLIST,选择下列格式
    BETWEEN(eIndex,eExpr,eExpr)或INLIST(eIndex,eExpr [,...]) 
    若要在可优化SQL表达式中使用BETWEEN或IN,选择下列格式
    eIndex BETWEEN eExpr AND eExpr或eIndex IN (eExpr [,...]) 
    可以组合可优化表达式,并且可以对生成的复杂可优化表达式再 
次组合。 
    (2)组合基本可优化表达式 
    如果FOR表达式具有基本可优化表达式的各种特征,那么可以在FO 
R子句基础上组合简单或复杂表达式以提高数据检索速度。基本达表 
式可能是可优化的,您可以使用AND、OR或NOT 逻辑操作符组合这些基 
本表达式,以构成可优化的复杂FOR子句表达式。表1 
    (3)组合复杂表达式 
    您可以组合复杂表达式,以创建全部可优化、部分可优化或不可 
优化的更加复杂的表达式。然后再组合这些更复杂的表达式以创建全 
部或部分可优化的,或者根本不可优化的表达式。下表说明了组合这 
些复杂表达式的结果。这些规则也适用于用圆括号分组的表达式。表 


    4.关闭Rushmore 
    尽管要关闭Rushmore的情况很少,但有时确实需要关闭。当您发 
出一个使用Rushmore的命令时,Visual FoxPro立即决定哪些记录符合 
FOR子句表达式的要求,然后再由此命令操作这些匹配记录。 
    ●若要对单条命令关闭Rushmore,使用NOOPTI-MIZE子句。 
    例如,下面的LOCATE命令就没有被优化
    LOCATE FOR DueDate<{01/01/95}NOOPTI-MIZE 
    ●使用SET OPTIMIZE命令,可以在全局范围内关闭或启用所有能 
受益于Rushmore命令的Rushmore功能。 

    5.无Rushmore的操作 
    在下列几种情况下数据检索操作不使用Rushmore优化技术
    ●当Rushmore不能优化潜在可优化命令中的FOR子句时。 
    ●当可从Rushmore中受益的命令包含WHILE子句时。 
    ●当内存较少时,数据检索将继续进行,但不被优化。 
    优化Visual FoxPro性能 
    您可以用几种方法优化Visual FoxPro的性能:添加更多的内存用 
于动态内存分配;对文件的打开和关闭进行管理;设置环境变量以及编 
写性能更好的代码等。尤其可以通过以下这些方面的改进来增强性能 

    ●使用内存 
    创建窗口、菜单、屏幕、内存变量和□□对象时,需要占用内存 
。要想尽可能地提高系统性能,那么应只在必要时创建对象,并且在完 
成对象操作后清除它们,以释放内存供Visual  FoxPro使用。SYS(101 
6)可以返回窗口、菜单、屏幕、内存变量、打开的表等控制对象所占 
用的内存数量。 
    ●打开和关闭文件 
    在应用程序中,频繁地打开和关闭文件将使执行速度变得缓慢。V 
isual FoxPro提供327 67个工作区,因此可以在应用程序中让频繁使 
用的表一直打开。 
    ●废止状态显示 
    当使SET TALK命令为ON时,Visual FoxPro可能达不到它的最快操 
作速度。若要关闭输出命令结果的功能,请使用下面的代码
    SET TALK OFF 
    SET DOHISTORY命令只适用于临时调试,因为它会导致程序执行速 
度降低。若要关闭DOI STORY功能,使用以下代码
    SET DOHISTORY OFF 
    ●使用名称表达式代替宏替换 
    如果用名称表达式取代宏替换,将极大地增强程序性能。例如,给 
cFile变量指定一个值,则用cFile创建的名称表达式比宏替换更快。 
    cFile="CUST" 
    USE &cFile   &&宏替换:慢 
    USE (cFile)  &&名称表达式:较快,建议使用 
    ●管理对象属性 
    如果在程序循环外使用对象属性,Visual FoxPro将更加有效地运 
行。例如,下面的代码示例显示了两种不同的方法,创建几个具有相同 
宽度的按钮。 
    代码 
    FOR i=2 TO THISFORM.optGrp.ButtonCount;THISFORM.optGrp.B 
uttons(i).Width =; 
        THISFORM.optGrp.Buttons(1).Width ENDFOR 
    nWidth=THISFORM.optGrp.Buttons(1).WidthFOR i=2 TO THISFO 
RM.optGrp.ButtonCou nt 
        THISFORM.optGrp.Buttons(1).Width = nWidth ENDFOR 
    ●管理SQL命令的性能 
    在SELECT-SQL查询中,以下情况会导致性能降低并产生意外的结 

    a.没有指定一个完整的联接条件,而将两个表包含到一个查询中 
。 
    b.联接含有空字段的表。 
        提高性能的一般技巧 
    下面的几条经验可能会对您的编程工作有所帮助 
    1.将输出发送到任何非最顶层窗口都比输出到顶层窗口输出慢。 
使输出在窗口后面滚动可以说是最糟糕的工作方式; 

    2.FOR...ENDFOR循环比DO WHILE...ENDDO循环快;  
    3.INSERT SQL比APPEND BLANK再加上RE-PLACE要快得多,尤其是 
对于多用户环境下建立了索引的表来说更是如此; 

    4.从多个字段复杂数据时,SCATTER TO ARRAY要比SCATTER MEMVA 
R快;  
    5.如果要将很多记录追加到已有索引的表中,先移去索引再追加 
记录,然后重建索引或许会更快些; 

    6.如果经常使用某一索引排序,则定期地按此排序方式对表排序 
可以提高性能;  
    7..CDX文件可以提高多用户性能,因为更新一个.CDX文件比更新 
多个.IDX文件速度快;  
    8.当一个表打开时相关的.CDX索引也打开,而且当关键字值更改 
时它也随之更新。如果您使用了很多索引标识,这将显著地降低添加 
记录的速度 
1
表情
所有内容均为会员自愿发表,并不代表本站立场.
论坛帮助 会员认证删帖申请 联系我们