1.程序死循環。
出現死循環很多情況下(xià)都是因爲程序缺少必要的檢測而導緻的,
比如 http://www.domain.com/show.asp?id=11 打開(kāi)這個頁面沒有問題,
而 http://www.domain.com/show.asp?id=12 就有問題,同樣的程序,爲什麽
會出現這樣的問題呢?有很多程序員(yuán)在寫asp程序的時候,都喜歡用 On Error Resume Next
這個語句來屏蔽掉錯誤,這樣會導緻程序出錯時一(yī)直執行下(xià)去(qù)(死循環),比如當數據庫裏
有id爲11這條記錄的時候,程序不會出問題,但當頁面所傳參數id爲12,而數據庫中(zhōng)又(yòu)沒有
id爲12這條記錄的時候,頁面就出錯了,因爲使用了 On Error Resume Next,頁面
并沒有中(zhōng)止運行,而是一(yī)直運行下(xià)去(qù),因爲程序前面就已經出現了不合法的數據,所以後面就
很容易因爲前面沒有正确的數據而死循環。
2.程序有嵌套查詢
比如以下(xià)程序就使用了嵌套查詢
<%
sql = "select * from a"
set rs = server.createobject("adodb.recordset")
rs.open sql,conn,1,1
while not rs.eof
sql2 = "select * from b where fid=" & rs("id")
set rs2 = server.createobject("adodb.recordset")
rs2.open sql2,conn,1,1 '這裏用了嵌套查詢,效率會下(xià)降很多,如果數據庫的時候根本沒法運行
while not rs2.eof
response.write rs("id") & "=" & rs2("name")
rs2.movenext
wend
rs.movenext
wend
%>
嵌套查詢會導緻數據庫的查詢量呈指數級上升,甚至會導緻一(yī)個頁面查詢數據庫的次數達到幾百
甚至幾千次,這樣會導緻一(yī)個程序的效率非常低,像上面的程序如果改爲連表操作,查詢數據庫的
次數會少很多,并且在設計數據庫的時候應該将 b 表的 fid 字段建立索引,否則連表查詢的時候
性能會差很多。
<%
sql = "select a.id ,b.name from a left join b on b.id=a.id" '使用連表操作,并用具體(tǐ)的字段名代替 *,程序是高效很多
set rs = server.createobject("adodb.recordset")
rs.open sql,conn,1,1
while not rs.eof
response.write rs("id") & "=" & rs("name")
rs.movenext
wend
%>
3.網站采用 access 數據庫,數據庫的容量比較大(dà)
對于網站應用來說,如果采用access數據庫,當數據庫的容量比較大(dà)(比如超過 100M 以上),
性能就可能會出現問題,所以訪問量大(dà)的網站一(yī)般都采用 sqlserver、mysql、oracle 等性能
比較高的數據庫引擎。
4.數據庫的索引沒健好。
一(yī)般來說,一(yī)個表至少有一(yī)個主鍵和N個外(wài)鍵,一(yī)般主鍵作爲表的标識,當檢索數據時,如果
以主鍵的值來進行查找的話(huà)效率會比較高,而一(yī)些标志(zhì)性的字段,如産品表的産品所屬分(fēn)類、用戶
表的用戶等級等,如果在程序中(zhōng)經常要用到這些字段來進行檢索數據,那麽一(yī)般應該爲這些字段建立
索引,這樣檢索數據的時候性能會好很多。