如何提高Visual FoPro的性能

時間:2022-10-08 04:08:00

導(dǎo)語:如何提高Visual FoPro的性能一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

如何提高Visual FoPro的性能

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

關(guān)鍵詞:VisualFoxPro;性能;技術(shù)

高性能是MicrosoftFoxPro數(shù)據(jù)庫管理系統(tǒng)(特別是它的數(shù)據(jù)庫引擎)的最大特點。Visual

FoxPro關(guān)系型數(shù)據(jù)庫引進(jìn)了對象模型,提高了引擎的存取速度并增強(qiáng)了客戶/服務(wù)器特性,因此整個管理系統(tǒng)的功能變得更加強(qiáng)大。但是,這些強(qiáng)大功能的代價是使管理系統(tǒng)變得更加復(fù)雜。因此,一方面,很容易開發(fā)出性能穩(wěn)定、面向?qū)ο蟆⑹褂眠h(yuǎn)程數(shù)據(jù)的應(yīng)用程序,另一方面,也很難避免出現(xiàn)低性能的應(yīng)用程序。

本文從改善、提高VisualFoxPro性能的目標(biāo)出發(fā),介紹一些實用技巧和技術(shù)。

一、改善本地數(shù)據(jù)訪問的性能

1.使用索引

Visual

FoxPro中的索引是基于樹的數(shù)據(jù)結(jié)構(gòu),因此查詢經(jīng)過索引的表是很快的。但當(dāng)表中有較多的索引時,更新表和向表中輸入數(shù)據(jù)就會變得慢一些,因為

VisualFoxPro需要更新每個索引。通常,只需在用于篩選和聯(lián)接的數(shù)據(jù)上建立索引。

應(yīng)該避免以FOR<條件>或NOT<條件>這樣的形式建立索引表達(dá)式,因為這些表達(dá)式無法優(yōu)化。例如:INDEXONDELETED

()TAGDEL是可以進(jìn)行Rushmore優(yōu)化的,但是,INDEXONNOTDELETED()TAG

NOTDEL則不能。在特殊情況下,我們不想包含被刪除的記錄,可以先設(shè)置SETDELETEDON,再創(chuàng)建索引,這樣可以加速操作。

此外,注意不要在那些只有少數(shù)離散數(shù)據(jù)中取值的字段(例如邏輯型字段)上建立索引。

2.優(yōu)化查詢的條件

VisualFoxPro通過查找與篩選表達(dá)式左邊相匹配的索引表達(dá)式來優(yōu)化篩選條件。我們經(jīng)常試圖將索引的標(biāo)識名與一個篩選表達(dá)式相匹配,而

VisualFoxPro無法通過這種方式優(yōu)化查詢。下面使用的索引是錯誤的:

USECUSTOMERS

INDEXONUPPER(cu_name)TAGname

SELECT*FROMcustomers;

WHEREcu_name="BILL"&&notoptimized.Noindexon"cu_name"

在一個篩選的查詢中正確使用索引的方法是∶

SELECT*FROMcustomersWHEREUPPER(cu_name)="BILL"&&Optimized!

3.使用SYS(3051)函數(shù)

SYS(3051)S函數(shù)控制從一個記錄(表、索引或備注文件)的鎖定失敗到再次嘗試鎖定它之間的時間間隔,以毫秒為單位,默認(rèn)值為333

毫秒。

如果在我們的系統(tǒng)中存在大量的鎖定競爭,可以將這個值調(diào)大(最大值為

1000),以提高我們應(yīng)用程序的性能,因為應(yīng)用程序不會因徒勞鎖定記錄而浪費時間。但是,如果鎖定競爭不多,應(yīng)將該值調(diào)?。ㄗ钚≈禐?/p>

100),以加速記錄鎖定的嘗試。

4.注音標(biāo)記和機(jī)器排序序列

在VisualFoxPro

中,已經(jīng)改進(jìn)了查詢包含國際化字符(帶有區(qū)分標(biāo)記的字符)數(shù)據(jù)的優(yōu)化方式。但如果我們的索引表達(dá)式的結(jié)果包含的字符都不帶注音標(biāo)記(例如B或

M),則查詢還能更快。

非機(jī)器排序序列(例如“通用”排序序列)比機(jī)器排序序列慢,有下列幾個原因:非機(jī)器索引關(guān)鍵字的大小是機(jī)器索引關(guān)鍵字的兩倍,因為必須為每個字符記錄注音信息;為了返回正確的結(jié)果,非機(jī)器排序序列要使用很多特定的規(guī)則來斷定索引的順序。因為機(jī)器排序序列更快,所以它通常用于聯(lián)接和查找,而其他排序序列用于排序記錄。

5.使事務(wù)安排緊湊

事務(wù)應(yīng)該只包含更新數(shù)據(jù)操作,在事務(wù)中包含其他任何操作(如使用我們界面,使用編程結(jié)構(gòu)的CASE、WHILE或IF

語句)都會降低更新數(shù)據(jù)的效率。

這對于VisualFoxPro

是很重要的,因為使用事務(wù)需要鎖定記錄。在事務(wù)中以及更新記錄時會鎖定記錄,并且在提交或回滾事務(wù)之前不會釋放這些鎖定的記錄。即使我們使用了RLOCK

()或FLOCK(),然后執(zhí)行UNLOCK,記錄在ENDTRANSACTION或ROLLBACK

語句之前也一直保持鎖定。另外,在追加記錄時需要VisualFoxPro

鎖定標(biāo)頭(即其他我們可以修改,但不能添加或刪除),并且在事務(wù)結(jié)束(提交或回滾)之前一直鎖定標(biāo)頭。因此,在一個高容量多我們的系統(tǒng)中,減少鎖定記錄的時間就變得很關(guān)鍵。

6.使用新的數(shù)據(jù)類型

在VisualFoxPro

中引入了四種新數(shù)據(jù)類型∶日期時間型、整型、雙精度型和貨幣型。所有這些類型的數(shù)據(jù)都以二進(jìn)制數(shù)據(jù)的形式保存在磁盤上(整型是四字節(jié)的二進(jìn)制數(shù)據(jù),其他數(shù)據(jù)類型是八字節(jié)的二進(jìn)制數(shù)據(jù))。

使用這些數(shù)據(jù)類型有兩個優(yōu)點:首先,由于在磁盤上保存數(shù)據(jù)時所占的空間更小(一個八位數(shù)的數(shù)據(jù)若用數(shù)值型保存將占用八個字節(jié),而保存為整形只需要四個字節(jié)),這樣,從磁盤向內(nèi)存加載數(shù)據(jù)和索引時,一次可以加載更多的有用數(shù)據(jù),從而提高應(yīng)用程序的性能。第二個優(yōu)點是不需要任何的數(shù)據(jù)轉(zhuǎn)換。Visual

FoxPro內(nèi)部將整型數(shù)據(jù)表示為四字節(jié)的二進(jìn)制值,而數(shù)值型數(shù)據(jù)在磁盤上保存為ASCII碼形式,因此,在每次讀數(shù)據(jù)時,都必須將ASCII

碼轉(zhuǎn)換為二進(jìn)制值,存盤時再轉(zhuǎn)換回去。由于整型和雙精度型數(shù)據(jù)(以及日期型和貨幣型數(shù)據(jù))不需要這種轉(zhuǎn)換,所以數(shù)據(jù)訪問就更快。

在新數(shù)據(jù)類型中,整型數(shù)據(jù)對速度的影響最大。要盡量使用整型數(shù)據(jù)作為主關(guān)鍵字和外部關(guān)鍵字的值。這樣可以得到更小的DBF

文件,更小的索引,更快的連接。

二、提高遠(yuǎn)程數(shù)據(jù)訪問的性能

在任何后端數(shù)據(jù)庫中檢索數(shù)據(jù)是很費時的。為了加快數(shù)據(jù)的下載(或更新),可使用下面的方法。

1.只下載需要的數(shù)據(jù)

在一個應(yīng)用程序的功能單元(比如,表單或報表)中,很少需要訪問表中的所有數(shù)據(jù)。通過創(chuàng)建遠(yuǎn)程視圖,只得到(或更新)我們需要的字段和記錄,就可以減少通過網(wǎng)絡(luò)的數(shù)據(jù)數(shù)量。例如,在我們的表單上有四個控件,分別綁定了遠(yuǎn)程視圖的字段(客戶標(biāo)識號、公司名、聯(lián)系人和來自客戶表的地址),可使用SELECT

customer_id,company,contact,addressFROMcustomersSELECT則會好得多。

2.使用一個WHERE子句

為了進(jìn)一步限制下載(或更新)的數(shù)據(jù)數(shù)量,可以使用WHERE子句。對于上面的示例,如果我們只需要西南部的客戶記錄,我們視圖的SELECT

語句可以是:

SELECTcustomer_id,company,contact,addressFROMcustomers

WHEREregion=''''NORTHWEST''''

VisualFoxPro提供的視圖靈活性以及SQLPassThrough技術(shù)使我們可以在SELECT、UPDATE和

DELETE等SQL語句的WHERE子句中使用參數(shù)。例如,對于上例,我們可以使用參數(shù)在運行時刻下載任何地區(qū)的信息:

SELECTcustomer_id,company,contact,addressFROMcustomers

WHEREregion=?pcRegion

式中,“pcRegion”是參數(shù)的名稱。

3.使用正確的更新條件

視圖設(shè)計器中的“更新條件”選項卡允許我們指定視圖中的數(shù)據(jù)如何被更新(插入和刪除)。在選項卡中的“SQLWHERE

子句包括”部分,我們可以控制UPDATE和DELETE操作中WHERE

子句的內(nèi)容。這對于在后端控制數(shù)據(jù)沖突是很關(guān)鍵的,對于改善性能也是很重要的。

因為我們向后端更新的字段總是可更新字段的子集(并且一定是視圖中字段總數(shù)的子集),在大多數(shù)情況下都使用“關(guān)鍵字和已修改字段”選項。對于支持時間戳的服務(wù)器數(shù)據(jù)庫,建議使用“關(guān)鍵字和時間戳”設(shè)置,這種更新方式比用“關(guān)鍵字和已修改字段”更快。

4.使用BatchUpdateCount屬性

有些服務(wù)器(例如MicrosoftSQLServerServer)允許我們在一個單獨的數(shù)據(jù)包中發(fā)送一批SQL

語句,這個技術(shù)加速更新、刪除和插入,因為通過網(wǎng)絡(luò)傳送的網(wǎng)絡(luò)包的絕對數(shù)量減少了,而且服務(wù)器數(shù)據(jù)庫可以成批編譯多個語句而不是單獨編譯。

我們應(yīng)該對于這個屬性和PacketSize

屬性用不同的值來試驗,以優(yōu)化我們的更新。可以在“查詢”菜單的“高級選項”對話框中設(shè)置該屬性,或者通過DBSETPROP()或

CURSORSETPROP()函數(shù)來設(shè)置。注意若要使用這個屬性,必須通過調(diào)用DBSETPROP()或SQLSETPROP()

函數(shù)設(shè)置“Transactions”屬性來啟動人工事務(wù)。

5.使用PacketSize屬性

PacketSize屬性控制向數(shù)據(jù)庫服務(wù)器傳送和下載的網(wǎng)絡(luò)包的大?。ò凑兆止?jié))。它實際上是由ODBC

設(shè)置的,并且可以是任何非零值。不同的網(wǎng)絡(luò)對該屬性有不同的處理,因此我們應(yīng)該參閱網(wǎng)絡(luò)服務(wù)文檔。該屬性的默認(rèn)值是4096

字節(jié)。如果我們的網(wǎng)絡(luò)支持更大的數(shù)據(jù)包,我們可以在每次請求(SELECT、INSERT、UPDATE、DELETE)

時將該屬性值增加以加大網(wǎng)絡(luò)吞吐量。

6.使用FetchMemo屬性

FetchMemo屬性控制當(dāng)從后端取得一個記錄時是否也取得備注和二進(jìn)制(通用字段)數(shù)據(jù)。請將該屬性設(shè)置為

.F.,這樣,直到真正需要時,才從網(wǎng)絡(luò)傳遞數(shù)據(jù),從而提高我們的查詢?nèi)〉脭?shù)據(jù)的速度。

7.在本地機(jī)上保存查閱表

在很多情況下,我們的應(yīng)用程序經(jīng)常訪問只讀數(shù)據(jù)。例如,我們的應(yīng)用程序可能會經(jīng)常使用一個包括各個公司人員的檔案表,將這些數(shù)據(jù)保存在本地機(jī)上(也就是,不把這些表裝在服務(wù)器上),查詢會更快。對于從不更改或很少更改的數(shù)據(jù),這個技術(shù)會很有用。

8.使用本地規(guī)則

幾乎很少有人知道,VisualFoxPro

在本地和遠(yuǎn)程視圖中也支持字段級和記錄級規(guī)則。這些規(guī)則是為了防止與數(shù)據(jù)或商業(yè)規(guī)則不符的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫。可以將這些規(guī)則放在視圖中,而不僅僅放在后端表中,這樣作的好處是:在無效數(shù)據(jù)通過網(wǎng)絡(luò)傳送之前就可捕獲它。缺點是:這些規(guī)則并不自動與后端服務(wù)器表上的規(guī)則相匹配。因此,如果后端表規(guī)則更改了定義,必須人工更改本地定義的視圖中的規(guī)則。但是,如果規(guī)則很簡單,這也不是一個很大的負(fù)擔(dān)。另外,規(guī)則定義并不經(jīng)常改變,因此我們也不必?fù)?dān)心會經(jīng)常更新本地的規(guī)則。

三、改造表單對象性能

1.使用數(shù)據(jù)環(huán)境

在“表單設(shè)計器”或“報表設(shè)計器”中使用數(shù)據(jù)環(huán)境,則打開表和在表間建立關(guān)系的速度會比在表單的Load事件中使用USE、SETORDER

和SETRELATION命令快得多。這是因為VisualFoxPro使用底層的系統(tǒng)調(diào)用來打開表并建立索引和關(guān)系。

2.限制表單集中表單的數(shù)目

只有在必須讓一組表單共享一個私有數(shù)據(jù)工作期時才使用表單集。當(dāng)我們運行一個表單集時,即使只顯示了表單集的第一個表單,VisualFoxPro

也會創(chuàng)建表單集中所有表單和所有表單中的所有控件,這樣很費時間。如果表單不必共享一個私有數(shù)據(jù)工作期,這樣做是不必要的。我們應(yīng)該建立獨立的表單并在需要它們時執(zhí)行

DOFORM命令。

當(dāng)然,如果使用了表單集,在訪問表單集中的表單時也會得到些好處。因為所有表單已被加載到內(nèi)存中了,只是沒有顯示,所以顯示表單會比較快。

3.向頁框中動態(tài)加載頁面控件

與表單集類似,當(dāng)加載頁框時,也加載了每個頁面上的所有控件,從而降低了性能。我們可以創(chuàng)建頁框中每個頁面上控件的類來解決這個問題。使用這個技術(shù),由于直到訪問時才加載頁框中第二及其他頁面上的控件,所以可以加速表單的加載。

4.動態(tài)綁定控件與數(shù)據(jù)

對于一個包含很多與數(shù)據(jù)綁定的控件的表單,如果我們將綁定的時間延遲到需要的時候,也可以極大地提高表單的性能。

我們可以將表單使用的表和視圖放在數(shù)據(jù)環(huán)境中,這樣當(dāng)加載表單時表和視圖就打開了。然后,當(dāng)一個控件(例如組合框)獲得焦點時,我們可以將控件與數(shù)據(jù)值綁定。

5.使用LockScreen屬性

任何對表單上控件的更改,這個屬性允許我們延遲屏幕刷新。例如,使控件可見或不可見,更改控件顏色,或者在綁定型控件中移動記錄,都可以用這個屬性將它們延遲到所有更改都結(jié)束時再刷新,這樣系統(tǒng)的效率會更高。

6.在視圖中使用NoDataOnLoad屬性

視圖的數(shù)據(jù)環(huán)境臨時表對象的NoDataOnLoad屬性與視圖的USE命令的NODATA

子句的作用相同。它打開視圖,但是視圖不取得任何數(shù)據(jù)。對于本地和遠(yuǎn)程視圖都是如此。例如,我們有一個有關(guān)客戶信息的表單,它使用一個包含客戶信息的視圖,該視圖使用參數(shù)代替

customer_id的具體值。我們可以輸入一個有效的customer_id,然后按下“搜索”按鈕。

這樣做的優(yōu)點是表單的加載時間大大減少了,因為視圖不給我們帶來任何數(shù)據(jù),但是與視圖字段綁定的控件仍是綁定的,因為存在一個打開的工作區(qū)(只是其中沒有數(shù)據(jù))。

四、完善OLE的性能

在訪問OLE數(shù)據(jù)之前先運行OLE服務(wù)程序。如果與通用字段數(shù)據(jù)類型相應(yīng)的服務(wù)器(例如MicrosoftExcel或

Word)在客戶機(jī)的計算機(jī)上已經(jīng)運行了,則與通用字段綁定的控件通常會獲得更好的性能。

1.自動化的性能

在某些情況下,即使已經(jīng)運行了一個實例,OLE服務(wù)器(例如Microsoft

Excel)仍然經(jīng)常啟動另一個新的實例。要想改變這種情況(并提高性能),請使用GetObject函數(shù)而不要使用CreateObject

函數(shù)。例如,下面的調(diào)用:x=GetObject(,"excel.Application")總是使用一個已存在的實例,但是,x=

CreateObject("excel.Application")將創(chuàng)建一個新的實例。

如果我們調(diào)用了GetObject()函數(shù),而服務(wù)器還沒有運行,系統(tǒng)會返回一個錯誤。我們可以俘獲這個錯誤并在錯誤處理程序中調(diào)用

CreateObject()函數(shù)。

2.不使用MEMLIMIT

VisualFoxPro不能識別MEMLIMIT。在FoxPro中,MEMLIMIT是一個配置設(shè)置,指定FoxPro

分配供自己使用的最大內(nèi)存數(shù)。不要使用這個配置設(shè)置來限制VisualFoxPro使用的內(nèi)存數(shù)量。如果必要,請使用SYS(3050)函數(shù)。

3.“作為圖標(biāo)”插入對象

當(dāng)我們將一個OLE對象插入到字段中時,將它作為一個圖標(biāo),而不要作為整個的對象。這樣可以減少所需的存儲空間,因為如果Visual

FoxPro同對象一起保存了一個“代表”映象,會占用大量的存儲空間。另外,如使用圖標(biāo),繪制該對象的性能也會提高,因為只需重畫圖標(biāo)。

4.盡量使用人工鏈接和圖象控件

使用人工鏈接對象更快,因為自動鏈接需要的通知時間較長,而且人工鏈接不需要啟動OLE

服務(wù)器來繪制對象。如果不需要經(jīng)常更新一個對象,請使用人工鏈接。

如果在一個應(yīng)用程序中使用單獨的位圖(如,公司徽標(biāo)),則圖象控件要比OLE綁定型控件快得多。

5.使用SYS(3050)

這個SYS函數(shù)允許我們優(yōu)化用于數(shù)據(jù)緩沖的前臺和后臺的內(nèi)存大小。前臺內(nèi)存是指當(dāng)VisualFoxPro

是前臺(活動)應(yīng)用程序時可用的內(nèi)存。后臺內(nèi)存是指當(dāng)VisualFoxPro是后臺應(yīng)用程序時可用的內(nèi)存。

我們可以實際操作這些值,觀察VisualFoxPro為它的數(shù)據(jù)緩沖占用多少內(nèi)存,以優(yōu)化我們的應(yīng)用程序。

參考文獻(xiàn):

①胡維華主編《VisualFoxPro程序設(shè)計教程》,浙江科學(xué)技術(shù)出版社,杭州,2000。

②陳華生主編《VisualFoxPro教程》,蘇州大學(xué)出版社