2007年7月6日 星期五

GridView 有效率的分頁設計(asp.net)

ASP.NET 的GridView提供很方便的分頁功能,但對於龐大的資料,User 每瀏覽一頁就要到資料庫將所有的資料撈回前端,再進行分頁顯示分頁結果,這樣對效能影響很大,雖然可以設定Datasource的Cache,讓分頁時不用到資料庫撈,直接傳Cache讀,但相對的也會占用的WebServer的記憶體,比較好的方法就是由Stored Procedure 進行分頁,僅傳回該頁的資料,這樣就可以大大提高效能。

Stored Procedure 進行分頁的方法如果是在 SQL Server 2000 可以用 Temp table or table variant , 另外可以利用 Set row count 的方法提高效能。
http://www.4guysfromrolla.com/webtech/042606-1.shtml

至於 SQL Server 2005 就不用這麼麻煩,因為有新的ROW_NUMBER function

CREATE PROCEDURE dbo.ShowLog

@PageIndex INT,
@PageSize INT
AS
BEGIN
WITH LogEntries AS (
SELECT ROW_NUMBER() OVER (ORDER BY Date DESC)AS Row, Date, Description
FROM LOG)
SELECT Date, Description
FROM LogEntries
WHERE Row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
END


至於ASP.NET 端就要配合 objectDataSource 不能用 SqlDataSource,因為如果用 SqlDataSource就不能用GridView 的分頁功能,而要自己寫分頁,使用objectDataSource時你可以自己寫business object , 或是使用 V.S. 2005 的 Dataset Designer , 它會幫你產生 TableAdapters 讓你可以用在 objectDataSource。

你需要設定 objectDataSource 的

  • EnablePaging = true
  • MaximumRowsParameterName
  • startRowIndexParameterName
  • SelectCountMethod
  • SelectMethod

只是這裡有一個效能的考量,因為 objectDataSource 會先call SelectCountMethod 取得 Page 的 資料,再 call SelectMethod 取得總共有多少筆資料,這樣它才有辦法算頁數,只是這樣就會有兩次的 資料庫連線,如果我們在SelectCountMethod就已經傳回 總共有多少筆,有辦法用這個資料嗎?

答案是有的,只是要用的.net framework 2.0 partial class 的功能,去擴充TableAdapters ,如下的範例:

namespace MyDataSetTableAdapters{
///


/// Summary description for MyDataSetTableAdapters
///

///
public partial class usp_Select_Netatm_logTableAdapter:Component {
private int _totalRowCount = 0;
public int TotalRowCount {
get {
return _totalRowCount;
}
set
{
_totalRowCount = value;
}
}
public int SelectCommandTimeout
{
get
{
return (this._commandCollection[0].CommandTimeout);
}
set
{
for (int i = 0; i < commandtimeout =" value;"> startRowIndex, System.Nullable maximumRows, string IcpNo, DateTime QryFromDate, DateTime QryToDate, ref System.Nullable totalRows)
{
//return ((object)HttpContext.Current.Session["TotalRowCount"]);
return (object)_totalRowCount;
}
}
}

1 則留言:

匿名 提到...

A further issue is that vіdeο gaming beсаme
оne of the all-time mοst imρortаnt
fогms of fun for people ѕрanning vaгious ages.
Kids pаrticipatе in νiԁeo gameѕ, anԁ also
аdults do, too. Thе XBox 360 is ϳust about the faѵoritе gaming ѕystems for
fοlks who lovе to havе а lοt of videо gamеs available tο
them, anԁ also ωhο like to relax and plаy livе with other indivіԁuаls all
over the worlԁ. Тhankѕ fοr sharing your opіnіons.


my ωebpage - is quibids legit