吳貴山
?
基于改進ASP設計的提高執(zhí)行效率探究
吳貴山
(漳州農(nóng)業(yè)學校,福建 漳州 363000)
通過對ASP的不同設計方法進行對比測試,總結(jié)出使用存儲過程、數(shù)據(jù)庫索引、DLL組件、Action Query指令等提高ASP執(zhí)行效率的方法,并對ASP程序中的變量的使用等進行改進。
存儲過程;數(shù)據(jù)庫索引;DLL組件;Action Query指令
隨著計算機的普及和網(wǎng)絡的迅猛發(fā)展,網(wǎng)站已成為樹立企業(yè)形象、產(chǎn)品宣傳及發(fā)展電子商務的重要平臺,同時也是政府部門、企事業(yè)單位實行政務公開、無紙化辦公和交流的重要平臺。筆者在對網(wǎng)站服務器的長期監(jiān)測中發(fā)現(xiàn),有些網(wǎng)站只實現(xiàn)簡單的功能,數(shù)據(jù)量也不大,但CPU的占用率卻很高,在多人同時訪問時更為明顯。在對一些網(wǎng)站的ASP程序進行分析測試后發(fā)現(xiàn),有部分程序的結(jié)構(gòu)和設計方法存在問題,通過改進設計方法可以較好的提高其執(zhí)行效率。
ASP即Active Server Pages,是一種功能強大、靈活易學的服務器端腳本編程環(huán)境,ASP程序在服務器端解釋運行,并把運行的結(jié)果以HTML代碼的形式輸出到客戶端。雖然其執(zhí)行效率總體來說比不上.Net程序,但因其易學易用等特點而廣泛應用于企業(yè)網(wǎng)站、電子商務網(wǎng)站等動態(tài)交互網(wǎng)站。
ASP的執(zhí)行效率除了與服務器的配置等硬件有關(guān)外,程序的設計方法也是一個不可忽視的問題,特別是對于海量數(shù)據(jù),好的設計方法將使執(zhí)行效率提高數(shù)倍。筆者經(jīng)過重復試驗,總結(jié)以下幾點提高ASP執(zhí)行效率的方法,希望對ASP的設計人員有所幫助。(假設SQL Server數(shù)據(jù)庫中存在一個數(shù)據(jù)表,表中有兩個文本字段col1、col2和一個日期型字段time1,并且數(shù)據(jù)庫已連接。)
存儲過程[1](Stored Procedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。在ASP程序中可以通過調(diào)用存儲過程來執(zhí)行某個特定的任務。
例如要查詢2010年1月1日之后,2010年7月1日之前的數(shù)據(jù),主要有以下兩種方法。
方法1:使用存儲過程
在數(shù)據(jù)庫中創(chuàng)建存儲過程:
CREATE PROCEDURE 存儲過程 (@date1 datetime ,@date2 datetime )
AS
Select col1,col2,time1 from 數(shù)據(jù)表 where time1>@date1 and time1<@date2
GO
在asp中調(diào)用:set rs=conn.execute("存儲過程 '2010-1-1','2010-7-1'")
方法2:直接在asp中執(zhí)行SQL語句
set rs=conn.execute("select col1,col2,time1 from car002 where time1>'2010-1-1' and time1<'2010-7-1'")
在SQL Server中對10萬條記錄進行測試,結(jié)果顯示方法1平均耗時637毫秒,方法2平均耗時1712毫秒,數(shù)據(jù)量越大,差別就越大。實踐證明,在大量的數(shù)據(jù)統(tǒng)計和海量數(shù)據(jù)分頁等使用存儲過程將使執(zhí)行效率提高數(shù)倍。
索引類似于字典,按字母順序排列數(shù)據(jù),是表中數(shù)據(jù)的物理順序。一個表的索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣[1]。通常設置條件查詢訪問的列為索引列。
例如:設置時間字段time1為索引列,然后在ASP中使用“Select col1,col2,time1 form 數(shù)據(jù)表where time1>'2010-1-1' and time1<'2010-7-1’”查詢記錄將比沒有設置索引列提高數(shù)倍的執(zhí)行效率。
但“水可載舟,亦可覆舟”,不當?shù)乃饕龑黾哟疟PI/0頻率,CPU 的占用也會增大,從而導致系統(tǒng)性能降低,所以正確的設置索引尤為重要。
因為Dll是經(jīng)過編譯的,用這種方法可以節(jié)省服務端解釋程序逐行解釋的時間,從而提高執(zhí)行效率;因經(jīng)過編譯后的Dll看不到源程序,所以又可以做到保護源程序的作用。使用ActiveX DLL封裝ASP[2]的步驟如下:
(1) 在VB6中用ActiveX DLL把ASP代碼修改后封裝生成Dll組件,如aspdll.dll。
(2)用dos命令regsvr32 注冊組件,格式為“regsvr32 路徑組件名”。
(3)在ASP中使用這個組件:
<%
Set Testdll= Server.CreateObject("工程名.類名稱")
Testdll.函數(shù)名
%>
要更新數(shù)據(jù)記錄,可以用Recordset對象的Delect、Update、Addnew等方法,也可以用Command對象的Delect、Update、Insert Into等Action Query指令[3]。例如要向數(shù)據(jù)表中添加一條記錄,可以使用以下兩種方法。
方法1:
Set rs =Server.CreateObject("ADODB.Recordset")
Sql="SELECT * FROM 數(shù)據(jù)表”
rs.open sql,conn,1,3
rs.addnew
rs(“col1”)="Test1"
rs(“col2”)="Test2"
rs.update
方法2:
sql="insert into 數(shù)據(jù)表 (col1,col2) values (‘test1’,'test2’)"
conn.Execute(sql)
對于單條記錄的更新,兩種方法差別并不大,但對于大量數(shù)據(jù)的更新,差別非常大,在SQL Server中對10萬條記錄進行更新操作,經(jīng)測試方法1平均耗時6300毫秒,方法2平均耗時1600毫秒,由此可見使用Action Query指令批量更新數(shù)據(jù)將使用執(zhí)行效率提高數(shù)倍。
在ASP中可能經(jīng)常用到對一個數(shù)據(jù)表值的重復讀取,這將影響執(zhí)行效率和損耗系統(tǒng)資源??上扔靡粋€本地變量進行賦值,在程序中對變量進行引用替代多次調(diào)用記錄集的方法,如在要實現(xiàn)“如果col1的值大于50個字符,則只顯示前面50個字符,否則顯示全部”,這在網(wǎng)頁中經(jīng)常用到,有以下兩種方法,很顯然方法2的效率更高。
方法1:If len(trim(rs(“col1”)))>50 then
Response.write left(trim(rs(“col1”)),50)
Else
Response.write trim(rs(“col1”))
End if
方法2:Str_col1=trim(rs(“col1”))
If len(Str_col1)>50 then
Response.write left(Str_col1,50)
Else
Response.write Str_col1
End if
另外,由于ASP中已經(jīng)模糊了變量類型的概念,允許直接使用變量,而不必強制先用Dim聲明變量,所以很多初學者習慣不聲明VBScript的變量。建議在ASP程序行首放置<% option explicit%>強制聲明變量,變量先聲明后使用,可以防止用錯變量名。
當使用完對象后,應及時使用Close方法來釋放對象所占用的系統(tǒng)資源,并設置對象值為“nothing”釋放對象占用的內(nèi)存[3]打開數(shù)據(jù)庫對象后要用rs.Close;set rs=nothing來清空對象。
在ASP中經(jīng)常用page=request(“page”)這樣的形式來獲取參數(shù),解釋程序?qū)⑺阉骷?QueryString、Form、Cookies、ClientCertificate、ServerVaribl等,直到發(fā)現(xiàn)第一個匹配值的名稱,這將降低執(zhí)行效率,并且容易發(fā)生錯誤。所以盡量指定具體的集合,如page=request.form(“page”)直接告訴解釋程序要從表單獲取page的值。
盡量避免使用“Select * from 數(shù)據(jù)表”這種形式的SQL語句,應把程序中有用到的字段名列出來,即使是用到全部的字段,也應該逐一的列出。如:“Select col1,col2 form 數(shù)據(jù)表”。
對于一個頁面中重復出現(xiàn)的功能模塊,例如在首頁調(diào)用N個數(shù)據(jù)表的記錄,而顯示的列表樣式又相同,可以先創(chuàng)建一個帶參數(shù)的自定義函數(shù),把顯示的列表放在函數(shù)里,然后在頁面中需要顯示的地方調(diào)用這個函數(shù)。這將比直接在多處重復寫這些顯示的代碼的執(zhí)行效率更高,因為可以減少服務端重復解釋這些重復的代碼,同時也便于后期的維護。
總之,影響ASP程序執(zhí)行效率的因素有很多,在硬件配置無法改變的情況下,如何改進ASP的設計方法,以達到較高的執(zhí)行效率。本文分析總結(jié)了使用存儲過程、數(shù)據(jù)庫索引、ActiveX DLL封裝ASP、Action Query指令和正確使用變量等方法,當然這只是其中的一部分,還有更多的方法值得我們?nèi)ヌ骄?。一個良好的設計方法,一個良好的編程習慣將能最大限度的提高執(zhí)行效率,特別在大型網(wǎng)站中尤為明顯。
[1]孟憲虎.大型數(shù)據(jù)庫系統(tǒng)管理、設計與實例分析[M].北京:電子工業(yè)出版社,2007.
[2]明日科技.ASP程序開發(fā)范例寶典[M]. 北京:人民郵電出版社,2006.
[3]王國榮. ASP網(wǎng)頁制作教程[M]. 北京:人民郵電出版社,2000.
A Study to Increase Execution Efficiency Based on Improving ASP Design
WU Gui-shan
( Zhangzhou Agricultural School, Zhangzhou, Fujian 363000,China)
In this paper, methods to increase execution efficiency of ASP program via using stored procedure, database index, DLL component, Action Query instruction, etc. are put forward by comparing and testing different design methods of ASP; and the application of variables in the ASP program and other particulars are improved.
Stored Procedure; Database Index; DLL Component; Action Query Instruction
2010-05-20
吳貴山(1977-),男,福建詔安人,講師,工學學士,研究方向:網(wǎng)站建設。
TP393.07
A
1673-1417(2010)03-0008-03