丁香婷婷网,黄色av网站裸体无码www,亚洲午夜无码精品一级毛片,国产一区二区免费播放

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計(jì)算機(jī)論文>如何提高Visual FoxPro的性能

如何提高Visual FoxPro的性能

時(shí)間:2023-02-20 22:44:20 計(jì)算機(jī)論文 我要投稿
  • 相關(guān)推薦

如何提高Visual FoxPro的性能

摘要:本文介紹一些實(shí)用技巧和技術(shù)。如果我們能正確地應(yīng)用這些技術(shù),就可以大大改進(jìn)Visual FoxPro的性能,提高數(shù)據(jù)的訪問(wèn)速度。
關(guān)鍵詞:Visual FoxPro ;性能;技術(shù)

高性能是 Microsoft FoxPro數(shù)據(jù)庫(kù)管理系統(tǒng)(特別是它的數(shù)據(jù)庫(kù)引擎)的最大特點(diǎn)。Visual
FoxPro關(guān)系型數(shù)據(jù)庫(kù)引進(jìn)了對(duì)象模型,提高了引擎的存取速度并增強(qiáng)了客戶/服務(wù)器特性,因此整個(gè)管理系統(tǒng)的功能變得更加強(qiáng)大。但是,這些強(qiáng)大功能的代價(jià)是使管理系統(tǒng)變得更加復(fù)雜。因此,一方面,很容易開(kāi)發(fā)出性能穩(wěn)定、面向?qū)ο、使用遠(yuǎn)程數(shù)據(jù)的應(yīng)用程序,另一方面,也很難避免出現(xiàn)低性能的應(yīng)用程序。
本文從改善、提高Visual FoxPro性能的目標(biāo)出發(fā),介紹一些實(shí)用技巧和技術(shù)。

一、改善本地?cái)?shù)據(jù)訪問(wèn)的性能
1.使用索引
Visual
FoxPro中的索引是基于樹(shù)的數(shù)據(jù)結(jié)構(gòu),因此查詢經(jīng)過(guò)索引的表是很快的。但當(dāng)表中有較多的索引時(shí),更新表和向表中輸入數(shù)據(jù)就會(huì)變得慢一些,因?yàn)?
Visual FoxPro 需要更新每個(gè)索引。通常,只需在用于篩選和聯(lián)接的數(shù)據(jù)上建立索引。
應(yīng)該避免以 FOR <條件> 或 NOT <條件> 這樣的形式建立索引表達(dá)式,因?yàn)檫@些表達(dá)式無(wú)法優(yōu)化。例如:INDEX ON DELETED
() TAG DEL是可以進(jìn)行 Rushmore 優(yōu)化的,但是,INDEX ON NOT DELETED ()TAG
NOTDEL則不能。在特殊情況下,我們不想包含被刪除的記錄,可以先設(shè)置 SET DELETED ON,再創(chuàng)建索引,這樣可以加速操作。
此外,注意不要在那些只有少數(shù)離散數(shù)據(jù)中取值的字段(例如邏輯型字段)上建立索引。
2.優(yōu)化查詢的條件
Visual FoxPro 通過(guò)查找與篩選表達(dá)式左邊相匹配的索引表達(dá)式來(lái)優(yōu)化篩選條件。我們經(jīng)常試圖將索引的標(biāo)識(shí)名與一個(gè)篩選表達(dá)式相匹配,而
Visual FoxPro 無(wú)法通過(guò)這種方式優(yōu)化查詢。下面使用的索引是錯(cuò)誤的:
USE CUSTOMERS
INDEX ON UPPER(cu_name) TAG name
SELECT * FROM customers ;
WHERE cu_name="BILL" && not optimized. No index on "cu_name"
在一個(gè)篩選的查詢中正確使用索引的方法是∶
SELECT * FROM customers WHERE UPPER(cu_name)="BILL" && Optimized!
3.使用 SYS(3051) 函數(shù)
SYS(3051)S 函數(shù)控制從一個(gè)記錄(表、索引或備注文件)的鎖定失敗到再次嘗試鎖定它之間的時(shí)間間隔,以毫秒為單位,默認(rèn)值為 333
毫秒。
如果在我們的系統(tǒng)中存在大量的鎖定競(jìng)爭(zhēng),可以將這個(gè)值調(diào)大(最大值為
1000),以提高我們應(yīng)用程序的性能,因?yàn)閼?yīng)用程序不會(huì)因徒勞鎖定記錄而浪費(fèi)時(shí)間。但是,如果鎖定競(jìng)爭(zhēng)不多,應(yīng)將該值調(diào)。ㄗ钚≈禐
100),以加速記錄鎖定的嘗試。
4.注音標(biāo)記和機(jī)器排序序列
在 Visual FoxPro
中,已經(jīng)改進(jìn)了查詢包含國(guó)際化字符(帶有區(qū)分標(biāo)記的字符)數(shù)據(jù)的優(yōu)化方式。但如果我們的索引表達(dá)式的結(jié)果包含的字符都不帶注音標(biāo)記(例如 B 或
M),則查詢還能更快。

非機(jī)器排序序列(例如“通用”排序序列)比機(jī)器排序序列慢,有下列幾個(gè)原因:非機(jī)器索引關(guān)鍵字的大小是機(jī)器索引關(guān)鍵字的兩倍,因?yàn)楸仨殲槊總(gè)字符記錄注音信息;為了返回正確的結(jié)果,非機(jī)器排序序列要使用很多特定的規(guī)則來(lái)斷定索引的順序。因?yàn)闄C(jī)器排序序列更快,所以它通常用于聯(lián)接和查找,而其他排序序列用于排序記錄。
5.使事務(wù)安排緊湊
事務(wù)應(yīng)該只包含更新數(shù)據(jù)操作,在事務(wù)中包含其他任何操作(如使用我們界面,使用編程結(jié)構(gòu)的 CASE、WHILE 或 IF
語(yǔ)句)都會(huì)降低更新數(shù)據(jù)的效率。
這對(duì)于 Visual FoxPro
是很重要的,因?yàn)槭褂檬聞?wù)需要鎖定記錄。在事務(wù)中以及更新記錄時(shí)會(huì)鎖定記錄,并且在提交或回滾事務(wù)之前不會(huì)釋放這些鎖定的記錄。即使我們使用了 RLOCK
() 或 FLOCK (),然后執(zhí)行 UNLOCK,記錄在 END TRANSACTION 或 ROLLBACK
語(yǔ)句之前也一直保持鎖定。另外,在追加記錄時(shí)需要 Visual FoxPro
鎖定標(biāo)頭(即其他我們可以修改,但不能添加或刪除),并且在事務(wù)結(jié)束(提交或回滾)之前一直鎖定標(biāo)頭。因此,在一個(gè)高容量多我們的系統(tǒng)中,減少鎖定記錄的時(shí)間就變得很關(guān)鍵。
6.使用新的數(shù)據(jù)類型
在 Visual FoxPro
中引入了四種新數(shù)據(jù)類型∶日期時(shí)間型、整型、雙精度型和貨幣型。所有這些類型的數(shù)據(jù)都以二進(jìn)制數(shù)據(jù)的形式保存在磁盤上(整型是四字節(jié)的二進(jìn)制數(shù)據(jù),其他數(shù)據(jù)類型是八字節(jié)的二進(jìn)制數(shù)據(jù))。
使用這些數(shù)據(jù)類型有兩個(gè)優(yōu)點(diǎn):首先,由于在磁盤上保存數(shù)據(jù)時(shí)所占的空間更。ㄒ粋(gè)八位數(shù)的數(shù)據(jù)若用數(shù)值型保存將占用八個(gè)字節(jié),而保存為整形只需要四個(gè)字節(jié)),這樣,從磁盤向內(nèi)存加載數(shù)據(jù)和索引時(shí),一次可以加載更多的有用數(shù)據(jù),從而提高應(yīng)用程序的性能。第二個(gè)優(yōu)點(diǎn)是不需要任何的數(shù)據(jù)轉(zhuǎn)換。Visual
FoxPro 內(nèi)部將整型數(shù)據(jù)表示為四字節(jié)的二進(jìn)制值,而數(shù)值型數(shù)據(jù)在磁盤上保存為 ASCII 碼形式,因此,在每次讀數(shù)據(jù)時(shí),都必須將 ASCII
碼轉(zhuǎn)換為二進(jìn)制值,存盤時(shí)再轉(zhuǎn)換回去。由于整型和雙精度型數(shù)據(jù)(以及日期型和貨幣型數(shù)據(jù))不需要這種轉(zhuǎn)換,所以數(shù)據(jù)訪問(wèn)就更快。
在新數(shù)據(jù)類型中,整型數(shù)據(jù)對(duì)速度的影響最大。要盡量使用整型數(shù)據(jù)作為主關(guān)鍵字和外部關(guān)鍵字的值。這樣可以得到更小的 DBF
文件,更小的索引,更快的連接。

二、提高遠(yuǎn)程數(shù)據(jù)訪問(wèn)的性能
在任何后端數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)是很費(fèi)時(shí)的。為了加快數(shù)據(jù)的下載(或更新),可使用下面的方法。
1.只下載需要的數(shù)據(jù)

在一個(gè)應(yīng)用程序的功能單元(比如,表單或報(bào)表)中,很少需要訪問(wèn)表中的所有數(shù)據(jù)。通過(guò)創(chuàng)建遠(yuǎn)程視圖,只得到(或更新)我們需要的字段和記錄,就可以減少通過(guò)網(wǎng)絡(luò)的數(shù)據(jù)數(shù)量。例如,在我們的表單上有四個(gè)控件,分別綁定了遠(yuǎn)程視圖的字段(客戶標(biāo)識(shí)號(hào)、公司名、聯(lián)系人和來(lái)自客戶表的地址),可使用SELECT
customer_id, company, contact, address FROM customers SELECT則會(huì)好得多。
2.使用一個(gè) WHERE 子句
為了進(jìn)一步限制下載(或更新)的數(shù)據(jù)數(shù)量,可以使用 WHERE 子句。對(duì)于上面的示例,如果我們只需要西南部的客戶記錄,我們視圖的 SELECT
語(yǔ)句可以是:
SELECT cu

stomer_id, company, contact, address FROM customers
WHERE region = 'NORTHWEST'
Visual FoxPro 提供的視圖靈活性以及 SQL Pass Through 技術(shù)使我們可以在 SELECT、UPDATE 和
DELETE 等 SQL 語(yǔ)句的 WHERE 子句中使用參數(shù)。例如,對(duì)于上例,我們可以使用參數(shù)在運(yùn)行時(shí)刻下載任何地區(qū)的信息:
SELECT customer_id, company, contact, address FROM customers
WHERE region = ?pcRegion
式中,“pcRegion”是參數(shù)的名稱。
3.使用正確的更新條件
視圖設(shè)計(jì)器中的“更新條件”選項(xiàng)卡允許我們指定視圖中的數(shù)據(jù)如何被更新(插入和刪除)。在選項(xiàng)卡中的“SQL WHERE
子句包括”部分,我們可以控制 UPDATE 和 DELETE 操作中 WHERE
子句的內(nèi)容。這對(duì)于在后端控制數(shù)據(jù)沖突是很關(guān)鍵的,對(duì)于改善性能也是很重要的。

因?yàn)槲覀兿蚝蠖烁碌淖侄慰偸强筛伦侄蔚淖蛹ú⑶乙欢ㄊ且晥D中字段總數(shù)的子集),在大多數(shù)情況下都使用“關(guān)鍵字和已修改字段”選項(xiàng)。對(duì)于支持時(shí)間戳的服務(wù)器數(shù)據(jù)庫(kù),建議使用“關(guān)鍵字和時(shí)間戳”設(shè)置,這種更新方式比用“關(guān)鍵字和已修改字段”更快。
4.使用 BatchUpdateCount 屬性
有些服務(wù)器 (例如 Microsoft SQL ServerServer ) 允許我們?cè)谝粋(gè)單獨(dú)的數(shù)據(jù)包中發(fā)送一批 SQL
語(yǔ)句,這個(gè)技術(shù)加速更新、刪除和插入,因?yàn)橥ㄟ^(guò)網(wǎng)絡(luò)傳送的網(wǎng)絡(luò)包的絕對(duì)數(shù)量減少了,而且服務(wù)器數(shù)據(jù)庫(kù)可以成批編譯多個(gè)語(yǔ)句而不是單獨(dú)編譯。
我們應(yīng)該對(duì)于這個(gè)屬性和 PacketSize
屬性用不同的值來(lái)試驗(yàn),以優(yōu)化我們的更新?梢栽凇安樵儭辈藛蔚摹案呒(jí)選項(xiàng)”對(duì)話框中設(shè)置該屬性,或者通過(guò) DBSETPROP () 或
CURSORSETPROP () 函數(shù)來(lái)設(shè)置。注意若要使用這個(gè)屬性,必須通過(guò)調(diào)用 DBSETPROP () 或 SQLSETPROP ()
函數(shù)設(shè)置“Transactions”屬性來(lái)啟動(dòng)人工事務(wù)。
5.使用 PacketSize 屬性
PacketSize屬性控制向數(shù)據(jù)庫(kù)服務(wù)器傳送和下載的網(wǎng)絡(luò)包的大。ò凑兆止(jié))。它實(shí)際上是由 ODBC
設(shè)置的,并且可以是任何非零值。不同的網(wǎng)絡(luò)對(duì)該屬性有不同的處理,因此我們應(yīng)該參閱網(wǎng)絡(luò)服務(wù)文檔。該屬性的默認(rèn)值是 4096
字節(jié)。如果我們的網(wǎng)絡(luò)支持更大的數(shù)據(jù)包,我們可以在每次請(qǐng)求 (SELECT、INSERT、UPDATE、DELETE)
時(shí)將該屬性值增加以加大網(wǎng)絡(luò)吞吐量。
6.使用 FetchMemo 屬性
FetchMemo屬性控制當(dāng)從后端取得一個(gè)記錄時(shí)是否也取得備注和二進(jìn)制(通用字段)數(shù)據(jù)。請(qǐng)將該屬性設(shè)置為
.F.,這樣,直到真正需要時(shí),才從網(wǎng)絡(luò)傳遞數(shù)據(jù),從而提高我們的查詢?nèi)〉脭?shù)據(jù)的速度。
7.在本地機(jī)上保存查閱表

在很多情況下,我們的應(yīng)用程序經(jīng)常訪問(wèn)只讀數(shù)據(jù)。例如,我們的應(yīng)用程序可能會(huì)經(jīng)常使用一個(gè)包括各個(gè)公司人員的檔案表,將這些數(shù)據(jù)保存在本地機(jī)上(也就是,不把這些表裝在服務(wù)器上),查詢會(huì)更快。對(duì)于從不更改或很少更改的數(shù)據(jù),這個(gè)技術(shù)會(huì)很有用。
8.使用本地規(guī)則
幾乎很少有人知道,Visual FoxPro
在本地和遠(yuǎn)程視圖中也支持字段級(jí)和記錄級(jí)規(guī)則。這些規(guī)則是為了防止與數(shù)據(jù)或商業(yè)規(guī)則不符的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)?梢詫⑦@些規(guī)則放在視圖中,而不僅僅放在后端表中,這樣作的好處是:在無(wú)效數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳送之前就可捕獲它。缺點(diǎn)是:這些規(guī)則并不自動(dòng)與后端服務(wù)器表上的規(guī)則相匹配。因此,如果后端表規(guī)則更改了定義,必須人工更改本地定義的視圖中的規(guī)則。但是,如果規(guī)則很簡(jiǎn)單,這也不是一個(gè)很大的負(fù)擔(dān)。另外,規(guī)則定義并不經(jīng)常改變,因此我們也不必?fù)?dān)心會(huì)經(jīng)常更新本地的規(guī)則。

三、改造表單對(duì)象性能
1.使用數(shù)據(jù)環(huán)境
在“表單設(shè)計(jì)器”或“報(bào)表設(shè)計(jì)器”中使用數(shù)據(jù)環(huán)境,則打開(kāi)表和在表間建立關(guān)系的速度會(huì)比在表單的 Load 事件中使用 USE、SET ORDER
和 SET RELATION 命令快得多。這是因?yàn)?Visual FoxPro 使用底層的系統(tǒng)調(diào)用來(lái)打開(kāi)表并建立索引和關(guān)系。
2.限制表單集中表單的數(shù)目
只有在必須讓一組表單共享一個(gè)私有數(shù)據(jù)工作期時(shí)才使用表單集。當(dāng)我們運(yùn)行一個(gè)表單集時(shí),即使只顯示了表單集的第一個(gè)表單,Visual FoxPro
也會(huì)創(chuàng)建表單集中所有表單和所有表單中的所有控件,這樣很費(fèi)時(shí)間。如果表單不必共享一個(gè)私有數(shù)據(jù)工作期,這樣做是不必要的。我們應(yīng)該建立獨(dú)立的表單并在需要它們時(shí)執(zhí)行
DO FORM 命令。
當(dāng)然,如果使用了表單集,在訪問(wèn)表單集中的表單時(shí)也會(huì)得到些好處。因?yàn)樗斜韱我驯患虞d到內(nèi)存中了,只是沒(méi)有顯示,所以顯示表單會(huì)比較快。
3.向頁(yè)框中動(dòng)態(tài)加載頁(yè)面控件

與表單集類似,當(dāng)加載頁(yè)框時(shí),也加載了每個(gè)頁(yè)面上的所有控件,從而降低了性能。我們可以創(chuàng)建頁(yè)框中每個(gè)頁(yè)面上控件的類來(lái)解決這個(gè)問(wèn)題。使用這個(gè)技術(shù),由于直到訪問(wèn)時(shí)才加載頁(yè)框中第二及其他頁(yè)面上的控件,所以可以加速表單的加載。
4.動(dòng)態(tài)綁定控件與數(shù)據(jù)
對(duì)于一個(gè)包含很多與數(shù)據(jù)綁定的控件的表單,如果我們將綁定的時(shí)間延遲到需要的時(shí)候,也可以極大地提高表單的性能。
我們可以將表單使用的表和視圖放在數(shù)據(jù)環(huán)境中,這樣當(dāng)加載表單時(shí)表和視圖就打開(kāi)了。然后,當(dāng)一個(gè)控件(例如組合框)獲得焦點(diǎn)時(shí),我們可以將控件與數(shù)據(jù)值綁定。
5.使用 LockScreen屬性

任何對(duì)表單上控件的更改,這個(gè)屬性允許我們延遲屏幕刷新。例如,使控件可見(jiàn)或不可見(jiàn),更改控件顏色,或者在綁定型控件中移動(dòng)記錄,都可以用這個(gè)屬性將它們延遲到所有更改都結(jié)束時(shí)再刷新,這樣系統(tǒng)的效率會(huì)更高。
6.在視圖中使用 NoDataOnLoad 屬性
視圖的數(shù)據(jù)環(huán)境臨時(shí)表對(duì)象的 NoDataOnLoad 屬性與視圖的 USE 命令的 NODATA
子句的作用相同。它打開(kāi)視圖,但是視圖不取得任何數(shù)據(jù)。對(duì)于本地和遠(yuǎn)程視圖都是如此。例如,我們有一個(gè)有關(guān)客戶信息的表單,它使用一個(gè)包含客戶信息的視圖,該視圖使用參數(shù)代替
customer_id 的具體值。我們可以輸入一個(gè)有效的 customer_id,然后按下“搜索”按鈕。

這樣做的優(yōu)點(diǎn)是表單的加載時(shí)間大大減少了,因?yàn)橐晥D不給我們帶來(lái)任何數(shù)據(jù),但是與視圖字段綁定的控件仍是綁定的,因?yàn)榇嬖谝粋(gè)打開(kāi)的工作區(qū)(只是其中沒(méi)有數(shù)據(jù))。

四、完善OLE 的性能
在訪問(wèn) OLE 數(shù)據(jù)之前先運(yùn)行 OLE 服務(wù)程序。如果與通用字段數(shù)據(jù)類型相應(yīng)的服務(wù)器(例如 Microsof

t Excel 或
Word)在客戶機(jī)的計(jì)算機(jī)上已經(jīng)運(yùn)行了,則與通用字段綁定的控件通常會(huì)獲得更好的性能。
1.自動(dòng)化的性能
在某些情況下,即使已經(jīng)運(yùn)行了一個(gè)實(shí)例,OLE 服務(wù)器(例如 Microsoft
Excel)仍然經(jīng)常啟動(dòng)另一個(gè)新的實(shí)例。要想改變這種情況(并提高性能),請(qǐng)使用 GetObject 函數(shù)而不要使用 CreateObject
函數(shù)。例如,下面的調(diào)用:x = GetObject (, "excel.Application")總是使用一個(gè)已存在的實(shí)例,但是,x =
CreateObject ("excel.Application")將創(chuàng)建一個(gè)新的實(shí)例。
如果我們調(diào)用了 GetObject() 函數(shù),而服務(wù)器還沒(méi)有運(yùn)行,系統(tǒng)會(huì)返回一個(gè)錯(cuò)誤。我們可以俘獲這個(gè)錯(cuò)誤并在錯(cuò)誤處理程序中調(diào)用
CreateObject() 函數(shù)。
2.不使用 MEMLIMIT
Visual FoxPro 不能識(shí)別 MEMLIMIT。在 FoxPro 中,MEMLIMIT 是一個(gè)配置設(shè)置,指定 FoxPro
分配供自己使用的最大內(nèi)存數(shù)。不要使用這個(gè)配置設(shè)置來(lái)限制 Visual FoxPro 使用的內(nèi)存數(shù)量。如果必要,請(qǐng)使用 SYS (3050) 函數(shù)。
3.“作為圖標(biāo)”插入對(duì)象
當(dāng)我們將一個(gè) OLE 對(duì)象插入到字段中時(shí),將它作為一個(gè)圖標(biāo),而不要作為整個(gè)的對(duì)象。這樣可以減少所需的存儲(chǔ)空間,因?yàn)槿绻?Visual
FoxPro 同對(duì)象一起保存了一個(gè)“代表”映象,會(huì)占用大量的存儲(chǔ)空間。另外,如使用圖標(biāo),繪制該對(duì)象的性能也會(huì)提高,因?yàn)橹恍柚禺媹D標(biāo)。
4.盡量使用人工鏈接和圖象控件
使用人工鏈接對(duì)象更快,因?yàn)樽詣?dòng)鏈接需要的通知時(shí)間較長(zhǎng),而且人工鏈接不需要啟動(dòng) OLE
服務(wù)器來(lái)繪制對(duì)象。如果不需要經(jīng)常更新一個(gè)對(duì)象,請(qǐng)使用人工鏈接。
如果在一個(gè)應(yīng)用程序中使用單獨(dú)的位圖(如,公司徽標(biāo)),則圖象控件要比 OLE 綁定型控件快得多。
5.使用 SYS(3050)
這個(gè) SYS 函數(shù)允許我們優(yōu)化用于數(shù)據(jù)緩沖的前臺(tái)和后臺(tái)的內(nèi)存大小。前臺(tái)內(nèi)存是指當(dāng) Visual FoxPro
是前臺(tái)(活動(dòng))應(yīng)用程序時(shí)可用的內(nèi)存。后臺(tái)內(nèi)存是指當(dāng) Visual FoxPro 是后臺(tái)應(yīng)用程序時(shí)可用的內(nèi)存。
我們可以實(shí)際操作這些值,觀察 Visual FoxPro 為它的數(shù)據(jù)緩沖占用多少內(nèi)存,以優(yōu)化我們的應(yīng)用程序。


參考文獻(xiàn):
①胡維華主編《Visual FoxPro程序設(shè)計(jì)教程》,浙江科學(xué)技術(shù)出版社,杭州,2000。
②陳華生主編《Visual FoxPro教程》,蘇州大學(xué)出版社


【如何提高Visual FoxPro的性能】相關(guān)文章:

Visual FoxPro6.0 中項(xiàng)目管理器08-06

Visual FoxPro自薦信08-16

《Visual FoxPro6.0數(shù)據(jù)庫(kù)教程》課程改革及評(píng)價(jià)方案05-23

Visual Basic中如何實(shí)現(xiàn)動(dòng)態(tài)報(bào)表08-06

如何提高聽(tīng)課效率08-15

如何提高公眾演講能力02-11

如何提高英語(yǔ)閱讀能力08-16

如何提高學(xué)生的閱讀能力08-18

如何提高學(xué)生的計(jì)算能力08-18