最近對項目收尾。整理了項目文檔,看到以前對效能最佳化所做的標記。出於和大家共同討論的目的,發表自己的看法。歡迎大家對此討論,如有錯誤請大家指正。(此文不涉及如cahe
等深層機制應用和研究,只是些膚淺應用和建議)
關於資料處理相關的最佳化
一、 SqlDataRead和Dataset的選擇
Sqldataread優點:讀取資料非常快。如果對返回的資料不需做大量處理的情況下,建議使用SqlDataReader,其效能要比datset好很多。缺點:直到資料讀完才可close掉於資料庫的串連
(SqlDataReader 讀資料是快速向前的。SqlDataReader 類提供了一種讀取從 SQL Server 資料庫檢索的只進資料流的方法。它使用 SQL Server 的本機網路資料轉送格式從資料庫連接直接讀取資料。DataReader需及時顯式的close。可及時的釋放對資料的串連。)
Dataset是把資料讀出,緩衝在記憶體中。缺點:對記憶體的佔用較高。如果對返回的資料需做大量的處理用Dataset比較好些可以減少對資料庫的串連操作。優點:只需串連一次就可close於資料庫的串連
*一般情況下,讀取大量資料,對返回資料不做大量處理用SqlDataReader.對返回資料大量處理用datset比較合適.對SqlDataReader和Dataset的選擇取決於程式功能的實現。
二、 ExecuteNonQuery和ExecuteScalar
對資料的更新不需要返回結果集,建議使用ExecuteNonQuery。由於不返回結果集可省掉網路資料轉送。它僅僅返回受影響的行數。如果只需更新資料用ExecuteNonQuery效能的開銷比較小。
ExecuteScalar它只返回結果集中第一行的第一列。使用 ExecuteScalar 方法從資料庫中檢索單個值(例如id號)。與使用 ExecuteReader 方法, 返回的資料執行產生單個值所需的操作相比,此操作需要的代碼較少。
*只需更新資料用ExecuteNonQuery.單個值的查詢使用ExecuteScalar
資料繫結的選擇
三、 資料的綁定DataBinder
一般的Binder 方法<%# DataBinder.Eval(Container.DataItem, "欄位名") %>
用DataBinder.eval 綁定不必關心資料來源(Dataread或dataset)。不必關心資料的類型eval會把這個資料對象轉換為一個字串。在底層綁定做了很多工作,使用了反射效能。正因為使用方便了,但卻影響了資料效能。
來看下<%# DataBinder.Eval(Container.DataItem, "欄位名") %>。當於dataset綁定時,DataItem其實式一個DataRowView(如果綁定的是一個資料讀取器(dataread)它就是一個IdataRecord。)因此直接轉換成DataRowView的話,將會給效能帶來很大提升。.
<%# ctype(Container.DataItem,DataRowView).Row("欄位名") %>
*對資料的綁定建議使用<%# ctype(Container.DataItem,DataRowView).Row("欄位名") %>。資料量大的時候可提高几百倍的速度。使用時注意2方面:1.需在頁面添加<%@ Import namespace="System.Data"%>.2.注意欄位名的大小寫(要特別注意)。如果和查詢的不一致,在某些情況下會導致比<%# DataBinder.Eval(Container.DataItem, "欄位名") %>還要慢。如果想進一步提高速度,可採用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不過其可讀性不高。
對查看頁面每個執行過程狀態最簡單的辦法:其頁面的trace屬性為true就可查看細節。