與沒有數據庫的網站相比,數據庫的存取會降低你的系統性能。但是大多數情況下,網站和數據庫有密不可分的關系,正是數據庫給站點提供了大容量、多樣性、個性化等特色,並實現了很多特殊的功能。
1不要忘記給數據庫做索引。合理的索引能立即顯著地提高數據庫整個系統的性能。可以參考有關SQL性能調試書 籍,學會根據所需查詢方式合理制作索引和根據索引方式改進查詢語句。
2在適當的情況下,盡可能的用存儲過程而不是SQL查詢,因為前者已經過了預編譯,運行速度更快。同時讓數據庫僅僅返回你所需要的那些數據,而不是返回大量數據再讓ASP程序過濾。總之要充分和有效地發揮數據庫的強大功能,讓它按照我們的要求反饋給我們最合適和最精練的信息。
3在可能情況下我們應該使用SQL Server而不是Access。因為Access僅僅是基於文件的數據庫,多用戶性能很差。數據庫連接盡量使用OLEDB和非DSN方式,因為這種連接方式有更好的並發性能。
4避免使用DAO(Data Access Objects)和RDO(Remote Data Objects)數據源,因為他們主要應用在單用戶的處理系統裡,ADO(ActiveX Data Objects)才是為Web應用設計的。
5建立記錄集Rescordset的時候要清晰合理地設置數據游標(cursort)和鎖定方式(locktype)。因為在不同的方式下 ASP會以不同的方式操縱數據庫,其執行速度也有很大區別,尤其在大數據量的時候。如果你只想遍歷數據,那麼默認游標(前進、只讀)會帶來最好的性能。
6當你引用ADO變量的時候,會消耗較多的CPU周期。因此,如果在一個ASP頁面中多次引用數據庫的字段變量,一個較好的方式是將字段值先放入本地變量,然後可以直接調用本地變量來計算和顯示數據。
7緩存ADO Connection對象也許不是一個好主意。如果一個連接(Connection)對象被存儲在Application對象中而被所有ASP頁面使用,那麼所有頁面就會爭著使用這個連接。但是如果連接對象被存儲在Session對象中,就要為每個用戶創建一個數據庫連接,這就減小了連接池的作用,並且增大了Web服務器和數據庫服務器的壓力。可以用在每個使用ADO的ASP頁創建和釋放ADO對象來替代緩存數據庫連接。因為IIS內建了數據庫連接池,所以這種方法非常有效,缺點是每個ASP頁面都需要進行一些創建和釋放操作。
8ASP最強大和主要的用途之一就是對數據庫進行操作,在數據庫操作中我們要注意:不要任意使用“SELECT * ......” 形式的SQL查詢語句。應該盡量檢索你所需要的那些字段。比如一個表中有10個字段,但是你只會用到其中的一個字段(name),就該使用“select name from mytable”,而不是用“select * from mytable”。在字段數比較少的時候,兩者的區別可能並不明顯,但是當一個表中擁有幾十個字段的時候,數據庫會多檢索很多你並不需要的數據。在這種情況下你最好不要為了節省打字時間或者害怕查找對應字段名稱的麻煩,而要老老實實地使用“select id,name,age... from mytable”。
9及時關閉打開的記錄集對象以及連接(Connection)對象。記錄集對象和連接對象耗費系統資源相當大,因此它們的可用數量是有限的。如果你打開了太多的記錄集對象以及連接對象而最後卻沒有關閉它們,可能會出現ASP程序剛開始的時候運行速度很快,而多運行幾遍就越來越慢的現象,甚至導致服務器死機。請使用如下方法進行關閉:
MyRecordSet.closeSet MyRecordSet=Nothing
Set MyConnection=Nothing
10 連接數據庫
仍然使用ODBC系統或者文件DSN來連接數據庫,或者使用很快的OLEDB技術來連接。使用後者,當移動Web文件時,不再需要修改配置。
OLEDB位於應用程序與ODBC層之間。在ASP頁面中,ADO就是位於OLEDB之上的程序。調用ADO時,首先發送給OLEDB,然後再發送給ODBC層。可以直接連接到OLEDB層,這麼做後,將提高服務器端的性能。怎麼直接連接到OLEDB呢?
如果使用SQLServer 7,使用下面的代碼做為連接字符串:
strConnString = "DSN='';DRIVER={SQL Server};" & _
"UID=myuid;PWD=mypwd;" & _
"DATABASE=MyDb;SERVER=MyServer;"
最重要的參數就是“DRIVER=”部分。如果你想繞過ODBC而使用OLEDB來訪問SQL Server,使用下面的語法:
strConnString ="Provider=SQLOLEDB.1;Password=mypassWord;" & _
"Persist Security Info=True;User ID=myuid;" & _
"Initial Catalog=mydbname;" & _
"Data Source=myserver;Connect Timeout=15"
為什麼這很重要?
現在你可能奇怪為什麼學習這種新的連接方法很關鍵?為什麼不使用標准的DSN或者系統DSN方法?好,根據Wrox在他們的ADO 2.0程序員參考書籍中所做的測試,如果使用OLEDB連接,要比使用DSN或者DSN-less連接,有以下的性能提高表現:
性能比較:
----------------------------------------------------------------------
SQL Access
OLEDB DSN OLEDB DSN
連接