當前位置:首頁 > 建站常識 > 列表

asp+sql 程序優化(huà)常見技巧

點擊:時(shí)間:2017/8/18關鍵詞:上海網頁設計 上海網站建設安全 sql
1. 數據庫結構優化(huà)a. 比如一些标志信息是否認證之類的(de)字段要建索引卻沒有建b. 表沒有設主鍵,加上主鍵c. 外鍵一般都要加上索引2. 程序優化(huà)a. 當隻限取前面N條記錄時(shí),不要用(yòng) select * ,然後再用(yòng)ADO分(fēn)頁改爲 select top N 字段列

asp程序優化(huà)常見技巧

1. 數據庫結構優化(huà)

a. 比如一些标志信息是否認證之類的(de)字段要建索引卻沒有建

b. 表沒有設主鍵,加上主鍵

c. 外鍵一般都要加上索引

2. 程序優化(huà)

a. 當隻限取前面N條記錄時(shí),不要用(yòng) select * ,然後再用(yòng)ADO分(fēn)頁改爲 select top N 字段列表,這(zhè)樣的(de)語句會高(gāo)效很多(duō)

b. 統計記錄數時(shí)不要用(yòng) select * from .... 這(zhè)樣的(de)語句,改用(yòng) select count(1) from .... 這(zhè)樣會好很多(duō)

c. 盡量避免使用(yòng) select * from table 這(zhè)樣的(de)sql語句,這(zhè)樣會導緻程序從數據庫裏讀取太多(duō)無用(yòng)的(de)數據,一般來(lái)說應該使用(yòng)select 字段1,字段2 from table 這(zhè)種形式,隻從數據庫裏讀取必要的(de)數據,這(zhè)樣能大(dà)大(dà)提高(gāo)程序讀取數據庫的(de)效率

d. 不要用(yòng)嵌套查詢,比如

<% sql = "select col1,col2 from a"

set rs = server.createobject("adodb.recordset")

rs.open sql,conn,1,1

while not rs.eof

sql2 = "select col1,col2 from b where id=" & rs("id")

set rs2 = server.createobject("adodb.recordset")

rs2.open sql2,conn,1,1 '這(zhè)裏用(yòng)了(le)嵌套查詢,效率會下(xià)降很多(duō),如果數據庫的(de)時(shí)候根本沒法運行

while not rs2.eof

response.write rs("id") & "=" & rs2("name")

rs2.movenext

wend

rs.movenext

wend%>

如果改爲

<% sql = "select a.id ,b.name from a left join b on b.id=a.id" '使用(yòng)連表操作,并用(yòng)具體的(de)字段名代替 *,程序是高(gāo)效很多(duō)

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. 如果網站的(de)訪問量大(dà)并且數據庫查詢操作的(de)任務比較重,要考慮采用(yòng)自動生成靜态頁面然後定時(shí)自動更新的(de)技術

4. 對(duì)于 access 數據庫:

access 數據是一個(gè)桌面型的(de)數據庫系統,它隻能應付一些數據量少且訪問量不大(dà)的(de)網站,如果access的(de)數據庫超過100M 以上,性能會急速下(xià)降,并且 access 數據庫的(de)數據庫驅動程序隻能應付同時(shí)15個(gè)進程共享,也(yě)就是說它最多(duō)隻能允許15個(gè)人(rén)同時(shí)打開它,對(duì)于大(dà)訪問量的(de)網站來(lái)說這(zhè)是很低的(de)一個(gè)數值,所以一般訪問量大(dà)或者是數據量大(dà)的(de)網站一般要采用(yòng) sqlserver 或者 mysql 等高(gāo)性能的(de)數據庫服務器平台。

有很多(duō)人(rén)使用(yòng) access 數據庫時(shí)并沒有對(duì)數據庫的(de)結構進行優化(huà),這(zhè)也(yě)是造成網站程序效率低下(xià)的(de)另一個(gè)重要原因。

一般來(lái)說每個(gè)數據表都要設置一個(gè)主鍵,并且其外鍵一般都要建立索引,還(hái)有一些标志性的(de)字段(如果标記一條信息是否是通(tōng)過審核等)如果不是布爾型的(de)話(huà),一般來(lái)說也(yě)應該建立索引。

在查詢程序優化(huà)方面 , 如果用(yòng) ADODB.Recoedset 自帶的(de)分(fēn)頁功能,也(yě)是存在問題,因爲用(yòng)ADO分(fēn)頁的(de)話(huà),這(zhè)個(gè)對(duì)象是先将很多(duō)的(de)記錄選出來(lái),加載到對(duì)象裏(這(zhè)将導緻這(zhè)個(gè)對(duì)象可(kě)能會加載成千上萬的(de)記錄),再在對(duì)象裏通(tōng)過移動記錄遊标等操作來(lái)達到定位到某一行的(de)目的(de),當數據量大(dà)的(de)時(shí)候,性能也(yě)會急速下(xià)降。

如果采用(yòng) where RecID NOT IN(....) 這(zhè)種結構的(de)話(huà),雖然記錄集不會加載很多(duō)的(de)數據,但是在數據庫引擎在查詢時(shí)做(zuò) 這(zhè)種NOT IN(...) 的(de)比較是很費時(shí)間的(de),比如 NOT IN 的(de)列表裏有 1000 個(gè)記錄ID,這(zhè)在查詢是将導緻對(duì)整個(gè)數據表的(de)每一條記錄都跟這(zhè)1000個(gè)ID進行比較,比如數據表裏有 3000 條記錄,那麽執行這(zhè)條 sql 的(de)時(shí)候将導緻 3000*1000 這(zhè)麽多(duō)次的(de)比較,效率之低是可(kě)想而知的(de).   對(duì)于分(fēn)頁的(de)優化(huà)方法:采用(yòng)分(fēn)步查詢,這(zhè)個(gè)方法可(kě)能要對(duì)數據表的(de)結構作一些修改。

1. 數據表本身的(de)主鍵( 比如是 RecID )應該是數字類型的(de)。

2. 要查詢分(fēn)頁的(de)時(shí)候

(1). 先得(de)出不應該包含在最終查詢結果裏的(de)記錄的(de)最大(dà)ID号,比如要查詢第 100 條記錄以後的(de) N (N=每頁的(de)記錄數) 條記錄,可(kě)這(zhè)樣做(zuò):

<% SQLMAXID = "SELECT MAX(RecID) FROM(SELECT TOP 100 RecID FROM ChatRec WHERE RecID>0 ORDER BY RecID)" '這(zhè)裏隻返回一個(gè)值,就是最大(dà)的(de)%>

(2). 執行最終的(de)數據查詢 比如<%  SQL = "SELECT TOP 每頁的(de)記錄條數 * FROM ChatRec WHERE RecID>("& SQLMAXID &") ORDER BY RecID"  '這(zhè)裏是找出 ID > MAXID 的(de)前 N 條記錄%>

這(zhè)樣的(de)話(huà)避免用(yòng) NOT IN(...) 這(zhè)個(gè)語句,效率會提高(gāo)很多(duō)

說明(míng):用(yòng)這(zhè)個(gè)方法有一點一定要注意的(de)是子查詢跟主查詢都必須要按某個(gè)字段用(yòng)相同的(de)規則排序,比如像例子中的(de) ORDER BY RecID

并且一般建議(yì)用(yòng)主鍵來(lái)進行排序5.asp程序中應盡量避免用(yòng) on error resume next

很多(duō)用(yòng)戶會采用(yòng) on error resume next 來(lái)屏蔽掉出錯信息,這(zhè)樣雖然可(kě)以讓訪客看不到出錯信息,界面友好一些,但是這(zhè)樣可(kě)能會帶來(lái)非常嚴重的(de)問題:當程序出錯後,如果沒有及時(shí)的(de)捕獲異常,從而中止程序執行的(de)話(huà),很空間導緻程序出現死循環,導緻服務器當機,所以隻有在非常必要的(de)情況下(xià)才好使用(yòng) on error resume next ,并且在使用(yòng)on error resume next後及時(shí)捕獲異常,如果出現錯誤就中止程序執行。 比如:

<%  set conn = Server.CreateObject("ADODB.Connection")connstr = "Driver={SQL Server};Server=db107.72dns.com;UID=abc;WD=abc;Database=abc"on error resume next

'這(zhè)裏的(de)用(yòng) on error resume next 是爲了(le)屏蔽連接數據庫時(shí)出錯的(de)信息

err.clearconn.open connstrif err.number<>0 then  '這(zhè)裏開始及時(shí)捕獲異常,中止程序執行,否則很容易死循環而令服務器當機

response.write "鏈接數據庫服務器出錯"

response.endend if %>

預約建站
免費提供網站優化(huà)
領取關鍵詞