程式|效能|最佳化 資料庫訪問
存取資料庫將會很快地減慢程式,但是沒有資料庫,許多網站也不行。不要使用內植的SQL語句來存取資料庫,你可以通過使用預存程序來訪問資料庫,這將會贏得很大的程式效能,而且,也非常得靈活。使用預存程序,並配合ActiveX Data Objects(ADO),就能最大程度地控制預存程序如何輸出。
確認資料庫經過了索引,因為這將直接影響到應用程式的整體效能。同時,注意在資料庫上運行更新統計程式,從而更好地跟蹤資料的分布。注意,一些資料庫,比如MS Access,不適於企業級應用,而SQL Server 7.0或者Oracle更適於做這些。
讓SQL做設計好的工作,包括對資料進行計算、加入、排序和分組。不要用其他語言寫這些功能,可以編寫一個查詢來完成。
任何要計算的欄位就是下面所示的簡單文法:
SELECT count(*) FROM publishers WHERE state='NY'
如果要計算一個特殊欄位,必須先按那個欄位分組,否則,將不會工作:
SELECT count(city),city FROM publishers GROUP BY city
接著確定排序方法:
SELECT * FROM TableName WHERE FieldName >50 OR FieldName< 100 ORDER BY FieldName2, FieldName3
仍然使用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
連線時間: 18 82 連線時間: 62 99
重複1,000個記錄的時間: 2900 5400 重複1,000個記錄的時間: 100 950
這個結論在Wrox的ADO 2.0程式員參考發表。時間是以毫秒為單位,重複1,000個記錄的時間是以伺服器油標的方式計算的。
● 只有可能,就使用用戶端指令碼對使用者輸入進行驗證,以此來最小化HTTP請求的迴圈操作。
如果瀏覽器具備執行JavaScript或其他指令碼的能力,請充分應用,從而解放伺服器端的資源。
下面的VBScript指令碼在使用者的瀏覽器端運行,檢查使用者資訊,然後再提交給伺服器:
< SCRIPT LANGUAGE="VBScript" >
< !--
Sub btnEnter_OnClick
Dim TheForm
Set TheForm = Document.MyForm
If IsNumeric(TheForm.Age.Value) Then
TheForm.submit
Else
Msgbox "Please enter a numerical age."
End if
End Sub
//-- >
< /SCRIPT >
< FORM method="POST" name=MyForm action="myfile.asp" >
Name: < INPUT typr="text" name="Name" >
Age: < INPUT type="text" name="Age" >
< INPUT type="button" name="btnEnter" value="Enter" >
< /FORM >
● 使用局部變數,而不要使用全域變數
因為局部變數可以很快地被ASP指令碼引擎所存取,整個名字空間不必被搜尋。避免重定義數組,在數組初始化時就分配足夠的尺寸,會大大地提高效率。這麼做可能浪費一些記憶體,但是確贏得了速度,尤其是在伺服器有很大的負載時。
● 使用< OBJECT > 標記建立對象
如果需要引用一個實際上可能不被使用的對象,使用< OBJECT >標記來例示它們,而不要用Server.CreateObject。後者將導致對象立即被建立,而< OBJECT >是當對象被首次引用時才被建立。
比如,下面的代碼示範了使用< OBJECT >標記來建立一個應用程式範圍內的AD Rotator對象執行個體:
< OBJECT runat=server scope=Application id=MyAds progid="MSWC.AdRotator" >
< /OBJECT >
然後,就可以在其他頁面引用它:
● 開啟“Option Explicit”
在VB和VBScript中,你可以不用明確地定義就使用變數。但是開啟“明確定義變數”選項,將有助於提高程式效能。未定義的局部變數是很慢的,因為在變數建立前,整個的名字空間都要搜尋,看看是否變數已經存在。所以,請開啟“Option Explicit”,這是一個好的編程習慣。
● 慎用 Server.MapPath
除非必須,不要使用Server.MapPath!相反,如果知道路徑,就使用明確的文字路徑來表示。使用MapPath,將要求IIS去取回當前伺服器路徑,這意味著對IIS一個特殊的請求,從而降低了程式效能。另外的完成這個工作的方法是在局部變數中儲存路徑資訊,當需要使用它時,伺服器就不用再被過度請求。
檢查怎樣做
你可以通過下面的工具來測算伺服器效能:Task Manager,NetMon 和 PerfMon。用WCAT (Web Capacity Analysis Tool)測量伺服器的容量。你可以使用WCAT來檢查Internet資訊服務和網路設定如何響應不同的用戶端對內容、資料和HTML頁面的請求。測試的結果可以被用來決定如何最佳化伺服器和網路設定。
通過最佳化ASP應用程式效能,Web網站應用將會變得很快,最終做到:當不需要時,就不需要去做影響效能的點擊。
總結
當談到ASP效能時,要涉及到許多方面,本文已經討論了一些。但是,對於每個具體