microsoftvisualfoxpro的性能调整技巧_第1页
microsoftvisualfoxpro的性能调整技巧_第2页
microsoftvisualfoxpro的性能调整技巧_第3页
microsoftvisualfoxpro的性能调整技巧_第4页
microsoftvisualfoxpro的性能调整技巧_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Microsoft Visual FoxPro 的性能调整技巧Microsoft Visual FoxPro 的性能调整技巧 简介 性能总是 Microsoft FoxPro 数据库管理系统的 主要特点之一,尤其是在数据库引擎方面。在介绍了 Microsoft Visual FoxPro 有关的数据库开发系统以及 它相关的对象模型, 加强引擎, 还有客户端 /服务器特性之后, 你就会发现整个产品的功能变得越来越强大了。然而强大的 另一面就是产品也变得越来越复杂了。因此,当开发越来越 强劲时,面向对象的应用程序使用远程数据存储器中的数据 变得越来越容易了,同时,应用程序也变得更加慢了。 本文要为

2、你介绍一些实践技巧和技术,帮助你改善你的应用 程序的性能。只要你在应用程序中正确的使用了这些技术, 你就能够明显改善你的用户界面和数据访问性能。 尽管应用起来只有部分技巧结果比较明显,我们还是希望我 们所介绍的能够给你提供有用的信息,帮助你全面改善应用 程序的性能。同时,我们希望你能够把你的意见或经验反馈 给我们,这样今后使用 Visual FoxPro 的开发者要提高应用程 序的性能时就能获得更多的帮助,这正如你的前人所做的一 样。硬件配置在这一部分我们将介绍调整操作系统的技巧,经过调整之后 操作系统将会与 Visual FoxPro 一起工作得更加和谐。 在某些 情况下你需要改变硬盘缓存器

3、的值以达到优化性能,从而满 足应用程序需要的目的。Microsoft Windows 95 和 Windows NT 在大多数情况下 Microsoft Windows 95 和 Windows NT 操作系统与 Visual FoxPro 一起工作得非常好。唯 一的例外就是在 Windows NT Server 上运行 Visual FoxPro 。 因为 Windows NT Server 需要的内存比 Visual FoxPro 想象的 还多,所以 Visual FoxPro 只能够为自己超支分配内存使用。 为了解决这种情况,你可以用 SYS( 3050)系统函数来调整 Visual F

4、oxPro 的内存缓冲区,把它近似调整为它的缺省值的 三分之一(详情见内存管理) 。例如,你可以把下面这一行 代码添加到启动编码或者是 CONFIG .FPW 文件中去: =SYS (3050, VAL (SYS (3050, 1, 0) / 3) 本地数据性能Rushmore 和索引在 MSDN Library 的 Visual FoxPro Developer s Guide 中,第 十五章 优化应用程序 一文详细地讨论了 Rushmore 技术。下面再补充说明一些技巧。 使用索引使用索引能够提高数据查询的性能, 这是很明显的。 在 VisualFoxPro 中,索引是树形的数据结构, 所

5、以在索引中查询非常 快。Visual FoxPro 最独特的方面之一就是支持在索引中使用公 式。大多数数据库管理系统( DBMSs )允许使用一个或更多 个字段进行查询, 而 Visual FoxPro 允许在索引中使用任何公 式,甚至是用户自定义的函数。不过你要注意的是,当你往表格中添加了很多的索引时,更 新和插入速度会比较慢, 因为此时 Visual FoxPro 要更新每一 个索引。通常,你只需要为那些在过滤器和汇合指令中使用 的数据建立索引。你要避免使用 FOR < 条件 > 或者 NOT < 条件 > 形式的索引公式,因为这些公式对于索引来说是不可优化 的。例

6、如:INDEX ON DELETED() TAG DEL是 Rushmore 可优化的,但是INDEX ON NOT DELETED()TAG NOTDEL 不是。作为一个查询的特殊情况,当你不想删掉记录时,如 果你已经 SET DELETED ON ,那么使用第一个例子中的索引 公式会帮助你加快操作速度。如果你在公式中使用了一个FOR的句子,Visual FoxPro不会使用索引来达到最优化。例如INDEX ON ORDNUM FOR DISCOUNT > 10 TAGORDDISC最后,注意不要使用那些只能用离散值的索引(如逻辑字段 等)。何时进行查询 Rushmore 优化?什么时

7、候对 Visual FoxPro 表格进行的查询或者过滤要用Rushmore 优化, 以及什么时候只是需要部分地进行优化, 这 些问题都很重要。Visual FoxPro 用 Rushmore 技术来优化过滤条件,它会找寻 符合过滤器左边表达式的索引关键表达式。通常,开发者们 会错误地试图把一个索引的标记名与一个过滤器的表达式 的相匹配, 这样只会发现 Visual FoxPro 不能够用这种方法进 行优化。以下是一个错误地使用了索引的例子:USE CUSTOMERINDEX ON UPPER(contact) TAG nameSELECT * FROM customer ;WHERE con

8、tact=BILL && not optimized. Noindex on contact 以下是在过滤查询中正确利用索引的方法:SELECT * FROM customer WHERE UPPER(contact)=BILL && Optimized!你还可以用SYS(3054)函数来决定 Rushmore查询优化的等 级。SYS(3054)可以显示也可以不显示查询的Rushmore优化 等级。 SYS(3054,1) 表示显示 Rushmore 优化的等级,而 SYS(3054,0) 则表示不显示 Rushmore 优化的等级。 数据库引擎性能特性主索引和

9、侯选的索引在 FoxPro 2.x 中,用唯一的 ID 号来增加记录的典型技术就 是在你的关键字段中建立一个索引,要增加记录时就运行一 个搜索程序来查看这个 ID 号是否已经被使用了。虽然这个 方法已经比较快了,但是它还不是最理想的。用 Primary 和 Candidate 关键字插入(或者更新) Visual FoxPro 表格中,这种方法是由数据库引擎验证的唯一 方法,它用于比较低的级别中,速度非常快。 用可区别的标记来提高性能在 Visual FoxPro 中,我们改进了查找具有通用特征 (指那些 有可区别标记的特征)的数据的方法。如果你的索引表达式 的结果不支持可区别的标记(如 B

10、或 M ),查找会快一些。 Non-Machine 比较顺序non-Machine比较顺序(如 General)比Machine比较顺序慢 的原因有两点:Non-Machine 的索引关键字比 Machine 的索引关键字长一倍, 因为它们要包含可区别的信息。Non-Machine 比较用了许多特别的规则来为特征值建立索 引,这样它才能返回正确的结果。因为 Machine 比较顺序相 对来说要快一些,所以它通常用于连接和查找,而其他的比 较顺序通常用来为记录排序。注意: Visual FoxPro 利用的索引仅仅是用 SET COLLATE 当 前的设置来建立的。因此,典型的解决方法是在主要的

11、搜索 和分类字段中有两个索引:SET COLLATE TO GENERALINDEX ON lastname TAG lastname && sort indexSET COLLATE TO MACHINEINDEX ON lastname TAG _lastname && seek/select index 如果你想要用相对来说比较快的 Machine 索引来对字段进行 查找,选择或者连接, 请在进行之前使用 SET COLLATE TOMACHINE。Rushmore会使用在Machine比较顺序中建立 的索引,查找和选择 /连接都非常快。用 SQL SEL

12、ECT如果在 Machine 比较顺序中完成了一个 SQL SELECT ,那么 任何ORDER BY 或者GROUP BY都可以用 Machine比较顺 序。如果你要用 non-Machine 比较顺序为结果记录排序,你可以在这个比较顺序中完成 SELECT ,当然这样做比较慢, 也可以分两步把它完成: 第一步:用 Machine 比较顺序来选择记录。SET COLLATE TO MACHINE&& use only machine indexesSELECT * FROM table INTO CURSOR temp1 WHERE lastname = Mller第二步:用

13、 General 比较顺序为记录排序。SET COLLATE TO GENERAL&& use only general indexesSELECT * FROM temp1 INTO TABLE output ORDER BY lastname新数据类型我们在 Visual FoxPro 中引进了几个新的数据类型: DateTime, Integer, Double, 和 Currency 。所有这些类型的数据在硬盘上 将存为二进制数据(其中 Integer 是一个四个字节的二进制 值,其他的是八个字节的二进制值) 。这样做有两个优点。第一个优点是,因为存储在硬盘上的数 据量

14、比较小(一个八位的数作为 Numeric 来存储要占八个字 节,而作为 Integer 来存储则只要四个字节) ,所以从硬盘往内存里调数据和索引时,一次能够调更多的数据到内存页中 去,这样速度就会比较快一些。第二个优点是,无须进行数 据的传送。 在内部, 如果 Visual FoxPro 把整数看作四个字节 的二进制值, 那么需要把它转换为数字才能以 ASCII 码数据 的形式存储在硬盘中。因而,每一次读取数据都必须先从 ASCII 码转换成为二进制,然后再转换回去。有了 Integers, Doubles, DateTimes, 和 Currency 几种数据类型, 这种转换就 不必要了,对

15、数据的访问自然就快了很多。 在新的数据类型中, Integer 对速度的影响最大。因此,只要 有可能,尽量地把主要的和外来的关键值设置为Integer 。好处就是:.DBF文件更小了,索引更小了,而连接就更快了 (这 也许才是最重要的) 。缓冲和事务处理 事务处理必须简短。看看下面这个例子: BEGIN TRANSACTION DO FORM BIGFORM TO nResult IF nResult = IDCOMMITEND TRANSACTIONELSEROLLBACKENDIF 上面这个例子说明了什么?如果你认为这是一个操作的恰当的事务处理的封装,的确如此。但是,事务处理仅仅用于 限制

16、数据的更新。如果你做的不仅仅是这些(如涉及用户界 面甚至编程的概念像 CASE, WHILE, 或 IF 语句等),那么在 实际的数据更新过程中效率就会变得很低。 很明显,这是因为在 Visual FoxPro 中如果要使用事务处理就 要求锁住记录。在事务处理和记录更新的过程中,记录被锁 住,一直要等到事务处理被委托或者是反转才能够解开。即 使你在 UNLOCK 之后说明了要 RLOCK() 或者 FLOCK() ,记 录也一直被锁死着,直到 END TRANSACTION 或者 ROLLBACK 出现才会改变。进一步说,把记录悬挂起来也 要求 Visual FoxPro 要把头文件锁住, 直

17、到事务处理完成之后 才能够解锁。 (被委托或者是反转) 。因此,在一个大的,多 用户的系统中,减少记录被锁死的持续时间是很关键的。所 以在上面这个例子中一个更加适当的应用程序是: * Save method from the cmdSave command button. BEGIN TRANSACTIONUPDATE PRODUCTS SET reorder_amt = 0 ;WHERE discontinued = .T.END TRANSACTION 使用 SYS( 3051) 这个 SYS 函数控制时间的数量, 精度达到毫秒级, 经过一次 不成功的锁定尝试之后, Visual FoxP

18、ro 在再次试图锁定一个记录, 表格, 索引, 或备忘录之前会一直等待。 缺省值是 333毫秒。 如果在你的数据库文件中有许多锁定竞争,你只要把这个值 调大(最大是 1000 ),就能够改善你的应用程序的性能。这 样你的应用程序就不会把时间浪费在快速通过网络进行锁 定上了。不过,如果不希望锁定竞争太高,你就要把这个值调低(最 小值是 100),这样锁定操作就会更快一些。远程数据性能 从任何后端数据库中检索获得数据都是很耗费时间的。为了 从一个服务器数据库中检索数据,以下几个步骤是必须的:客户端向后端服务器数据库提出查询。 服务器分析并且编辑查询条件。生成结果集。服务器通报客户端结果已经完成。

19、客户端通过网络从服务器上获得数据。为了加快数据的检索(或更新)过程要用到许多技术。 只检索你需要的数据一般来说,应用程序中的一个函数单元(在大部分情况下是 一个表单或者报表)要访问表格中所有的数据只是特殊情 况。建立一个远程视图,仅仅获取(或者更新)你所需要的 字段和行,这样通过线路所传送大量数据的情况就会大大改 善。例如,如果你已经建立了一个远程视图,它与一个表单 的四个控件绑定在一起(如客户表格中的客户标识号,公司 名,联系方式,地址等) ,用这样一个 SELECT 语句来执行 视图,如:SELECT * FROM customers 效率会很低,因为你检索了大量不做要求的字段。如果用下

20、面这个 SELECT 语句来执行视图,效果会好一些。SELECT customer_id, company, contact, address FROM customers使用 WHERE 子句 为了限制检索(或者更新)的数据量,适当地使用 WHERE 子句是有必要的。我们用同样的例子来进行说明,如果你想 知道西北地区的客户情况,使用下面这个 SELECT 语句: SELECT customer_id, company, contact, address FROM customersWHERE region = NORTHWESTWHERE 子句中的参数Visual FoxPro 中灵活的视图

21、和 SQL Pass Through 技术能够让 你在 SQL SELECT, SQL UPDATE, 以及 SQL DELETE 语句 的 WHERE 子句中使用运行时参数。例如,你能够从任何区中检索信息SELECT customer_id, company, contact, address FROM customersWHERE region = ?pcRegion这里 pcRegion 是参数的名字。 如果视图只是用于检索或者再 查询必需的信息,这个参数应该有(但不是必须有) 。 使用正确的更新准则View Designer 中的 Update Criteria 标签使你能够明确你想要 如何把视图中的数据进行更新,插入和删除。标签中标有 SQL WHERE clause includes 的部分能够让 你控制 UPDATE 和 DELETE 操作中 WHERE 子句的内容。 这对于控制后端的数据冲突以及性能都十分重要。考虑到上 面所提到的视图并且假设关键字段是customer_id 。假设你想要更新除了关键字段之外的所有字段(这种情况不会经常出 现,因为改变关键字段就意味着做一次删除再加上一次插 入)也就是 公司名 ,联系方式 ,以及地址 。基于你在 SQL WHERE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论