.程序死循環(huán)。
出現(xiàn)死循環(huán)很多情況下都是因?yàn)槌绦蛉鄙俦匾臋z測而導(dǎo)致的,
比如 http://www.domain.com/show.asp?id=11 打開這個(gè)頁面沒有問題,
而 http://www.domain.com/show.asp?id=12 就有問題,同樣的程序,為什么
會(huì)出現(xiàn)這樣的問題呢?有很多程序員在寫asp程序的時(shí)候,都喜歡用 On Error Resume Next
這個(gè)語句來屏蔽掉錯(cuò)誤,這樣會(huì)導(dǎo)致程序出錯(cuò)時(shí)一直執(zhí)行下去(死循環(huán)),比如當(dāng)數(shù)據(jù)庫里
有id為11這條記錄的時(shí)候,程序不會(huì)出問題,但當(dāng)頁面所傳參數(shù)id為12,而數(shù)據(jù)庫中又沒有
id為12這條記錄的時(shí)候,頁面就出錯(cuò)了,因?yàn)槭褂昧?On Error Resume Next,頁面
并沒有中止運(yùn)行,而是一直運(yùn)行下去,因?yàn)槌绦蚯懊婢鸵呀?jīng)出現(xiàn)了不合法的數(shù)據(jù),所以后面就
很容易因?yàn)榍懊鏇]有正確的數(shù)據(jù)而死循環(huán)。
2.程序有嵌套查詢
比如以下程序就使用了嵌套查詢
<%
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 '這里用了嵌套查詢,效率會(huì)下降很多,如果數(shù)據(jù)庫的時(shí)候根本沒法運(yùn)行
while not rs2.eof
response.write rs("id") & "=" & rs2("name")
rs2.movenext
wend
rs.movenext
wend
%>
嵌套查詢會(huì)導(dǎo)致數(shù)據(jù)庫的查詢量呈指數(shù)級上升,甚至?xí)䦟?dǎo)致一個(gè)頁面查詢數(shù)據(jù)庫的次數(shù)達(dá)到幾百
甚至幾千次,這樣會(huì)導(dǎo)致一個(gè)程序的效率非常低,像上面的程序如果改為連表操作,查詢數(shù)據(jù)庫的
次數(shù)會(huì)少很多,并且在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候應(yīng)該將 b 表的 fid 字段建立索引,否則連表查詢的時(shí)候
性能會(huì)差很多。
<%
sql = "select a.id ,b.name from a left join b on b.id=a.id" '使用連表操作,并用具體的字段名代替 *,程序是高效很多
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.網(wǎng)站采用 access 數(shù)據(jù)庫,數(shù)據(jù)庫的容量比較大
對于網(wǎng)站應(yīng)用來說,如果采用access數(shù)據(jù)庫,當(dāng)數(shù)據(jù)庫的容量比較大(比如超過 100M 以上),
性能就可能會(huì)出現(xiàn)問題,所以訪問量大的網(wǎng)站一般都采用 sqlserver、mysql、oracle 等性能
比較高的數(shù)據(jù)庫引擎。
4.數(shù)據(jù)庫的索引沒健好。
一般來說,一個(gè)表至少有一個(gè)主鍵和N個(gè)外鍵,一般主鍵作為表的唯一標(biāo)識,當(dāng)檢索數(shù)據(jù)時(shí),如果
以主鍵的值來進(jìn)行查找的話效率會(huì)比較高,而一些標(biāo)志性的字段,如產(chǎn)品表的產(chǎn)品所屬分類、用戶
表的用戶等級等,如果在程序中經(jīng)常要用到這些字段來進(jìn)行檢索數(shù)據(jù),那么一般應(yīng)該為這些字段建立
索引,這樣檢索數(shù)據(jù)的時(shí)候性能會(huì)好很多。