最佳化ACCESS提高速度

來源:互聯網
上載者:User

摘要

  這篇文章介紹了在設計、編寫和實現Microsoft Access 資料庫應用程式時為保證擁有最高速度而需要注意的幾點。

介紹

  作為一名資料庫程式員,你的主要任務是讓你的使用者能快速地選擇、管理和訪問他們所需要的資訊。其他的工作幾乎都是一成不變的,只要你的資料庫應用程式執行速度越快,你的程式效率越高。這篇文章的目的就是突出各種不同的技巧和策略,通過最佳化程式來提高速度,讓你的Microsoft Access 資料庫應用程式的效率更高,這樣也可以協助你完成作為一名資料庫開發人員的主要使命。

硬體

  瞄準速度問題的根本

  為了提高你的資料庫程式的速度,自然而然地你會想到去注意影響速度最基本的幾個部分,我們將從處理這幾個部分著手。在你力圖提高你的資料庫程式效能的時候,你的程式所啟動並執行硬體平台將是唯一的決定因素。顯而易見,實現最佳化的第一條原則應該是較快的硬體=較快的資料庫,當然CPU和RAM是這個等式的核心所在。相信你一定注意到Microsoft Access 所聲明的,要達到一個令人滿意的效能,至少需要8MB的RAM和一個80486的CPU。一般情況下,使用者注意到這一點是理所應當的,但我卻見過許多使用者為他們的Microsoft Access 的執行速度而感到沮喪,當我問及他們使用什麼機器運行此程式時,他們告訴我是一台80386,並且是在運行一台伺服器上的一個MSACCESS.EXE。所以,在相信你的使用者通過下面的方法固然能提高其程式效能的同時,始終需要強調的仍然是,在Microsoft Access 執行過程中,硬體才是關鍵的問題。

  有效磁碟訪問

  假定已經有了一個令人滿意的硬體設定,下面讓我們討論一下如何才能提高Microsoft Access 在此平台上的運行速度。就這個問題,對你的資料庫程式而言,影響其效能的第二位因素就是磁碟訪問了。在執行過程中,對物理磁碟的訪問總是一個速度的瓶頸(與訪問儲存在 RAM中的資料相比較而言),所以,你應該盡量減少對磁碟的訪問。然而,由於你的應用程式總是要和一些磁碟或其他一些物理裝置打交道,所以,你的目標應該是保證所有的磁碟訪問都儘可能有效。要實現這一點,方法是經常整理你的磁碟資料片段,整理你的資料庫所在的磁碟機以及所有你執行你的資料庫程式時要涉及的磁碟機,而且你還應提醒你的使用者定期清理磁碟片段,以此保證磁碟訪問一直有效。這將最大程度地減少在對物理磁碟進行讀寫而花費的時間,儘管這些讀寫是不可避免的,同時最佳化了整個體系的效能。

  使RAM最大化/對磁碟訪問的頻率最小化

  下一個主題是使你的資料庫程式與物理磁碟機打交道的頻率最小。要做到這一點關鍵是儘可能多的釋放RAM空間給你的應用程式使用。要實現這一點,你需要做到以下幾點:

  增加最大緩衝區的尺寸

  首先涉及到你對最大緩衝區尺寸的設定。最大緩衝區的尺寸指的是Microsoft Access作為內部儲存空間而保留的RAM的數目。儲存空間越大,使用者需求的資料能在RAM中找到可能性越大,同時減少了對物理磁碟的訪問頻率。Microsoft Access 需要的最小緩衝區是512KB,如果你的硬體系統有多於4MB的RAM,那麼你就可以為Microsoft Access 多分配一些供其使用(這樣也增加了系統的效能)。要做到這一點,只需要在MSACCESS.INI(在你的windows目錄下)檔案中增加對最大緩衝區的設定,使用你的文字編輯器,例如記事本,在此檔案中找到 [Option] 段,在其中加這樣一句話:

   MaxBufferSize = xxxxx

  這其中的xxxxx即是為你的應用程式對儲存空間分配而作的新設定(例如,設定MaxBufferSize=2048將為Microsoft Access分配2MB的緩衝區空間)。那麼,你究竟應該分配多少才算合適呢?除了“儘可能多”,其他的還真難說。你需要手動地調節這個設定,同時需要試著讓你的硬體都能提供以下條件:1)不能妨礙使用者同時正在啟動並執行程式,2)不會影響其自身底層作業系統的運行效率(你可能會在程式啟動時想通過.INI檔案查看一下Microsoft Access自身的配置,因此,任何對MSACCESS.INI檔案的修改都將只能在下一次Microsoft Access啟動時才能奏效,而對現在正在啟動並執行Microsoft Access程式沒有任何的影響)。

  避免裝載Wizards

  為了釋放更多的記憶體以供Microsoft Access使用,另一個你可以採取的步驟是:如果你不使用Wizards,那麼就不要裝載它。你可以開啟MSACCESS.INI檔案,找到[libraries]部分,在“wizards.mdb=ro”這一句之前加一個分號,這樣就避免了自動載入Wizards。這樣做將能夠釋放315B的RAM提供給Microsoft Access以作己用,這樣做的好處不僅在於提高了已耗用時間的效能,同時使每個應用程式平均減少了大約10秒的安裝時間。

  解除牆紙/背景位元影像

  解除標準windows牆紙背景可以釋放RAM中任何一處25K到350K的空間。解除複雜的位元影像將釋放更多的記憶體空間。

  建立永久分頁檔

  建立一個永久分頁檔(相對於臨時檔案而言)將增加你額外的效能。關於這一點,你可以求助於關於這方面的協助文檔,它將指導你在運行資料庫應用程式的機器上建立這一檔案。

  到現在為止,我們已經解決了有關硬體平台、最大的磁碟訪問效率的問題,並且為你的應用程式增加了有效RAM儲存空間,接下來讓我們轉向最佳化應用程式本身。

Microsoft Access自身特點

  壓縮、壓縮

  要保證經常性的壓縮你的程式碼。當你在開發和使用Microsoft Access資料庫時,你要經常性地增加和刪除資料、代碼等等。現在的問題是Microsoft Access並不能有效地釋放已指派的但被刪除的對象空間,這將意味著即使你刪除了一個對象,而這個對象仍然在你的資料庫中佔據空間。壓縮資料庫將迫使Microsoft Access真正刪除這些對象並回收其佔據的空間,從而使得你的資料庫盡量小但卻更有效。我曾把逐字逐句查詢的平均時間減少了30%——50%,而做到這一點僅僅是通過去壓縮那些由於經常使用又缺乏壓縮而變得過度膨脹的資料庫程式,因此,在運行程式的過程中,不要忽視壓縮過程的重要性。正如你要定期清除硬碟資料片段一樣,你和你的使用者也應當定期壓縮資料庫來保證它始終最有效地運行。

  只用代碼

  你可能希望通過宏操作來搭建一個應用程式的模型,一旦你開始最佳化你的程式的最終效能,一定要把所有的宏重新寫成代碼。這主要是因為Microsoft Access代碼要比宏運行得快的多。但遺憾的是有三個宏操作你不能將他們改寫成代碼,這三個宏是Autokeys、Autoexec和Addmenu操作,這三個宏在Microsoft Access中沒有相應的等價類別,因此你只能被迫使用他們。不過,你可以克服Autoexec的限制,只需要定義Autoexec為調用你的Access Basic Autoexec函數。

  最佳化資料類型聲明

當你在你的代碼中聲明資料類型時,你應該試著儘可能精確。因為若是一個變數的類型(如果沒有特別聲明,預設為可變類型)非常靈活自由的話,那麼這種類型同時也將是最浪費記憶體的一種類型。這樣一來,如果你知道check Balance這個變數不需要超過4位小數精度的話,那麼就把它定義成確定類型而不是可變類型。對你的過程函數的定義同樣也可以如此操作(比如說,把函數PostCredit()聲明為整形,而不是Function PostCredit())。請注意這樣一個事實,如果你估計一個變數將會被處理成一個空值,那麼你需要去把它定義成一個可變類型而不是一個確定的嚴格的資料類型,否則你會得到一個錯誤資訊。同樣地,要注意整形除法和浮點除法之間的差別。

  經常使用From/Report變數

在你的程式中,你需要保證你能提前解決儘可能多的查詢工作。這意味著什麼呢?舉個例子來說明:如果你想在代碼中查閱一個名為[NetPrice]的文字框,你可以使用這樣一條語句:

   Mytemprariable=Forms![Customer Invoice]![Net price]

  對於這條指令,Microsoft Access首先在Forms對象裡搜尋名為[Customer Invoice]的表,一旦它找到這張表,Microsoft Access接下來尋找名為[NetPrice]的控制,並進行正確的操作。從這個例子可以看出,Microsoft Access經過兩次查詢最終確定我們指定的控制。如果你想在同一程式(函數或者子函數)中重新查詢[Customer Invoice]表中任一控制,你可以刪除可能會在下次出現的多餘語句,而只使用如下語句:

  Dim F as form

  Set F = Forms![Customer Invoice]

  現在,你的Form變數將自動指向Form[Customer Invoice],允許Microsoft Access 避免每次在你需要尋找[Customer Invoice]表中任一對象時,都要把資料庫的Form對象中全部搜尋一次。為了查閱控制[NetPrice],你只需要簡單地使用下面的語句:

  Mytempvariable=F![NetPrice]

  你也可以對Report對象作相同的操作(比如,set R=Reports![MyReport])。當你在一個函數中僅僅只對一個Form或Report訪問一次,你可能在速度效能方面得不到什麼太大得好處,但是一旦你開始在同一個Form或Report中進行的訪問操作超過一次,你將會看到明顯的時間減少。於是,通過使Microsoft Access避免作多餘的查閱,你將大大地提高你程式的速度。

  在可以應用的地方使用windows函數

  無論何時,只要相關,總是可以用一個windows函數調用來代替Access Basic代碼執行同一個操作。這樣你將節省開發時間,因為windows函數調用是已經完成編碼並經過最佳化,同時也因為它們是用C語言編寫的(機器可執行),而Access Basic代碼則要被編譯成P代碼形式,同時需要在執行時一行一行地解釋。一個最普通的例子是custom.ini設定。你可以使用Access Basic檔案函數去得到一個自由檔案指標,開啟檔案,讀/寫檔案,然後關閉它。但是如果你完全可以簡單地使用GetPrivateProfileString和WritePrivateProfileString函數來實現,它們既快且已經編碼最佳化隨手可用,你為什麼還要自尋煩惱呢?(參考:“Enhanced Microsoft Access: Using the Win16 API”)


  你的Microsoft Access資料庫應用程式運行速度越快,你就能更好地完成你的任務,也就是向你的使用者提供最有效選擇、管理、發送他們的資料的能力。我真誠希望以上這些小技巧能協助你達到這個目標。

 


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。