Visual FoxPro關系型數據庫引進了對象模型,提高了引擎的存取速度并增強了客戶/服務器特性,使整個管理系統的功能更加強大。但是,這些強大功能的代價是管理系統變得更加復雜,很難避免出現低性能的應用程序。本文從實際工作中總結出一些改善、提高Visual FoxPro總體性能的技巧和方法,在此拋磚引玉。
一、改善本地數據訪問的性能
1.正確創建索引。在Visual FoxPro中索引,就是用戶根據數據庫表中的某些字段值,為數據表建立一個順序的索引文件。由于Visual FoxPro中的索引是基于樹的數據結構,使得記錄的顯示、查詢、打印更為迅速,同時也可以限制記錄重復,并支持不同表之間的“關系”。索引的創建雖然十分簡單,但不要建立太多的索引,因為Visual FoxPro需要更新每個索引,會降低程序的執行效率。創建索引的原則有二:一是只需在用于篩選和聯接的數據上建立索引;二是不要在那些只有少數離散數據中取值的字段(如邏輯型字段)上建立索引。另外,應該避免以FOR<條件>或.NOT.<條件>這樣的形式建立索引表達式,因為這些表達式無法優化。例如:INDEX ON DELETED()TAG DEL是可以進行Rushmore優化的,但是,INDEX ON.NOT.DELETED()TAG NOTDEL則不能。如果我們不想包含被刪除的記錄,解決的辦法是先設置SET DELETED ON,再創建索引,同樣可以加速操作。
2.使用新的數據類型。Visual FoxPro引入了4種新的數據類型:日期時間型、整型、雙精度型和貨幣型。其中整型以四字節,其它數據類型以八字節的二進制數據形式存儲在磁盤上。使用這些數據類型有兩個優點:一是由于在磁盤上保存數據時所占的空間更小,使得在從磁盤向內存加載數據和索引時,一次可以加載更多,從而提高了應用程序的性能。二是不需要進行數據轉換,數據訪問更快。使用這些類型的數據作為主關鍵字和外部關鍵字的值,可以得到更小的數據表文件,更小的索引文件,更快的連接。
3.優化查詢條件。Visual FoxPro通過查找與篩選表達式左邊相匹配的索引表達式來優化篩選條件。我們經常試圖將索引的標識名與一個篩選表達式相匹配,而Visual FoxPro是無法通過這種方式進行優化查詢的。例如,下面的索引就是錯誤的:USE customers/INDEX ON UPPER(cu_name)TAG name/SELECT*FROM customers WHERE cu_name=BILL。
正確的方法是∶SELECT * FROM customers WHERE UPPER(cu_name)=BILL
4.事務安排要緊湊。在事務中包含其它任何操作,如:使用編程結構的CASE、WHILE或IF語句等,都會降低更新數據的效率。因為使用事務需要鎖定記錄,并且在提交事務之前不會釋放這些鎖定的記錄。即使我們使用了RLOCK()或FLOCK(),然后執行UNLOCK,記錄在END TRANSACTION或ROLLBACK語句之前也將一直保持鎖定。因此,要提高Visual FoxPro的性能,就要減少鎖定記錄的時間。事務應該只包含更新數據操作。
二、提高遠程數據訪問的性能
1.訪問遠程視圖。在一個應用程序的功能單元中(如表單或報表),往往不需要訪問表中的所有數據。通過創建遠程視圖,得到(或更新)我們需要的部分數據,就可以減少通過網絡的數據數量。
2.使用條件限定子句。為了進一步限制下載(或更新)的數據數量,可以使用WHERE子句。例如:我們只需要西南部的客戶記錄,SELECT語句為:
SELECT customer_id,company,contact,address FROM customers WHERE region=NORTHWEST
3.使用更新條件。視圖設計器中的“更新條件”選項卡允許我們指定視圖中的數據更新(插入和刪除)。在“SQL WHERE子句包括”中,我們可以控制UPDATE和DELETE操作中WHERE子句的內容。這對于在后端控制數據沖突是很關鍵的,對于改善性能也是很重要的。因為我們向后端更新的字段總是可更新字段的子集(并且一定是視圖中字段總數的子集),在大多數情況下都使用“關鍵字和已修改字段”選項。對于支持時間戳的服務器數據庫,建議使用“關鍵字和時間戳”設置,這種更新方式比用“關鍵字和已修改字段”更快。
4.使用FetchMemo屬性。FetchMemo屬性控制當從后端取得一個記錄時是否也取得備注和二進制(通用字段)數據。在需要時才使之為.T.。一般情況下,應將該屬性設置為.F.,從而提高運行效率。
5.使用PacketSize屬性。PacketSize屬性控制向數據庫服務器傳送和下載的網絡包的大小(字節),默認值是4096字節。它是由ODBC設置的,不同的網絡對該屬性有不同的處理,我們可參閱網絡服務文檔。如果我們的網絡支持更大的數據包,我們可以在每次請求(SELECT、INSERT、UPDATE、DELETE)時將該屬性值增加以加大網絡吞吐量。
6.使用BatchUpdateCount屬性。有些服務器(例如Microsoft SQL ServerServer)允許我們在一個單獨的數據包中發送一批SQL語句,這個技術將加速更新、刪除和插入,因為通過網絡傳送的網絡包的絕對數量減少了,而且服務器數據庫可以成批編譯多個語句。該屬性可以在“查詢”菜單的“高級選項”對話框中設置,或者通過DBSETPROP()或CURSORSETPROP()函數來設置。
7.在本地機上保存查閱表。在很多情況下,我們的應用程序經常訪問只讀數據。對于從不更改或很少更改的數據,將他們保存在本地機上,也就是說,不把這些表裝在服務器上。這樣查詢會更快。
三、改造表單對象性能
1.使用數據環境。因為Visual FoxPro使用底層的系統調用來打開表并建立索引和關系,所以在“表單設計器”或“報表設計器”中使用數據環境,打開表和在表間建立關系的速度會比在表單的Load事件中使用USE、SET ORDER和SET RELATION命令快更多。
2.限制表單集中表單的數目。在更多情況下,我們應該建立獨立的表單并在需要它們時執行DO FORM命令,只有在必須讓一組表單共享一個私有數據工作期時,才使用表單集。因為當我們運行一個表單集時,即使只顯示了表單集的第一個表單,Visual FoxPro也會創建表單集中所有表單和所有表單中的所有控件,這樣很費時間。如果表單不必共享一個私有數據工作期,這樣做是不必要的。當然,如果使用了表單集,在訪問表單集中的表單時會比較快,因為所有表單已被加載到內存中了。
3.向頁框中動態加載頁面控件。與表單集類似,當加載頁框時,也加載了每個頁面上的所有控件,從而降低了性能。我們可以通過創建頁框中每個頁面上控件的類,使得在需要訪問時才加載頁框中的其它控件,從而提高效率。
4.使用LockScreen屬性。這個屬性允許我們延遲屏幕刷新。例如,使控件可見或不可見,更改控件顏色,或者在綁定型控件中移動記錄等,都可以用這個屬性將它們延遲到所有更改都結束時再刷新,這樣系統的效率會更高。
(作者單位:四川省經濟貿易學校)