1、用完馬上關閉資料庫連接
訪問資料庫資源需要建立串連、開啟串連和關閉串連幾個操作。這些過程需要多次與資料庫交換資訊以通過身分識別驗證,比較耗費伺服器資
源。ASP.NET中提供了串連池(Connection Pool)改善開啟和關閉資料庫對效能的影響。系統將使用者的資料庫連接放在串連池中,需要時取出,關閉時收回串連,等待下一次的串連請求。
串連池的大小是有限的,如果在串連池達到最大限度後仍要求建立串連,必然大大影響效能。因此,在建立資料庫連接後只有在真正需要操作時才開啟串連,使用完畢後馬上關閉,從而盡量減少資料庫連接開啟的時間,避免出現超出串連限制的情況。
用(推薦)
using(SqlConnection Conn=new SqlConnection(connstr))
{}//不必顯示關閉
或
try{conn.Open();}
catch{}
finally{conn.Close();}
2、盡量使用預存程序,並最佳化查詢語句
預存程序是儲存在伺服器上的一組先行編譯的SQL語句,類似於DOS系統中的批次檔。預存程序具有對資料庫立即訪問的功能,資訊處理極為迅速。使用預存程序可以避免對命令的多次編譯,在執行一次後其執行規劃就駐留在快取中,以後需要時只需直接調用緩衝中的二進位代碼即可。在 .NET Framework 提供的所有資料存取方法中,基於 SQL Server 的資料訪問是產生高效能、可縮放 Web 應用程式的推薦選擇。使用託管 SQL Server 提供者時,可通過使用編譯的預存程序而不是特殊查詢獲得額外的效能提高。
另外,預存程序在伺服器端運行,獨立於ASP.NET程式,便於修改,最重要的是它可以減少資料庫動作陳述式在網路中的傳輸。
最佳化查詢語句
ASP.NET中ADO串連消耗的資源相當大,SQL語句啟動並執行時間越長,佔用系統資源的時間也越長。因此,盡量使用最佳化過的SQL語句以減少執行時間。比如,不在查詢語句中包含子查詢語句,盡量只返回有用的資料、欄位,充分利用索引等。
3、唯讀資料訪問用SqlDataReader,不要使用DataSet
SqlDataReader 類提供了一種讀取從 SQL Server 資料庫檢索的只進資料流的方法。如果當建立 ASP.NET 應用程式時出現允許您使用它的情況,則 SqlDataReader 類提供比 DataSet 類更高的效能。情況之所以這樣,是因為 SqlDataReader 使用 SQL Server 的本機網路資料轉送格式從資料庫連接直接讀取資料。另外,SqlDataReader 類實現 IEnumerable 介面,該介面也允許您將資料繫結到伺服器控制項。DataSet作為一個功能強大的、支援離線的資料庫,其對效能的開銷也相對較大。
Sqldataread優點:讀取資料非常快。如果對返回的資料不需做大量處理的情況下,建議使用SqlDataReader,其效能要比datset好很多。缺點:直到資料讀完才可close掉於資料庫的串連。
Dataset是把資料讀出,緩衝在記憶體中。缺點:對記憶體的佔用較高。如果對返回的資料需做大量的處理用Dataset比較好些可以減少對資料庫的串連操作。優點:只需串連一次就可close於資料庫的串連。
一般情況下,讀取大量資料,對返回資料不做大量處理用SqlDataReader.對返回資料大量處理用datset比較合適.對SqlDataReader和Dataset的選擇取決於程式功能的實現。
4、資料的綁定DataBinder
一般的Binder 方法<%# DataBinder.Eval(Container.DataItem, "欄位名") %>
用DataBinder.eval 綁定不必關心資料來源(read或dataset)。不必關心資料的類型eval會把這個資料對象轉換為一個字串。在底層綁定做了很多工作,使用了反射效能。正因為使用方便了,但卻影響了資料效能。
來看下<%# DataBinder.Eval(Container.DataItem, "欄位名") %>。當於dataset綁定時,DataItem其實式一個DataRowView(如果綁定的是一個資料讀取器(dataread)它就是一個 IdataRecord。)因此直接轉換成DataRowView的話,將會給效能帶來很大提升。
<%# ctype(Container.DataItem,DataRowView).Row("欄位名") %>
對資料的綁定建議使用<%# ctype(Container.DataItem,DataRowView).Row("欄位名") %>。使用時注意兩個方面:
1.需在頁面添加<%@ Import namespace="System.Data"%>.
2.注意欄位名的大小寫(要特別注意)。如果和查詢的不一致,在某些情況下會導致比<%# DataBinder.Eval(Container.DataItem, "欄位名") %>還要慢。如果想進一步提高速度,可採用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不過其可讀性不高。
以上的是vb.net的寫法。在c#中:<%# ((DataRowView)Container.DataItem)["欄位名"] %>
5、返回多個結果集
無論SqlDataReader還是datset,返回多個結果集,然後用rd.NextResult()或ds.Tables[i]來分別處理資料,減少重複串連資料庫的次數。同時盡量用比較高效的SQL代替後續複雜的DataSet二次加工。