DataGrid連接Access的快速分頁法(1)——需求與現狀
發表于:2007-06-30來源:作者:點擊數:
標簽:
DataGrid連接Access的快速分頁法(1)——需求與現狀 一、需求分析 DataGrid是一個功能強大的ASP.NET Web 服務器 端控件,它除了能夠按各種方式格式化顯示數據,還可以對數據進行動態的排序、編輯和分頁。大大減輕了廣大Web 程序員 的工作量。實現DataGrid的
DataGrid連接A
clearcase/" target="_blank" >ccess的快速分頁法(1)——需求與現狀
一、需求分析
DataGrid是一個功能強大的ASP.NET Web
服務器端控件,它除了能夠按各種方式格式化顯示數據,還可以對數據進行動態的排序、編輯和分頁。大大減輕了廣大Web
程序員的工作量。實現DataGrid的分頁功能一直是很多入門者感到棘手的問題,特別是自定義分頁功能,實現的方法多種多樣,非常靈活。
目前大家公認
性能最好的應該數SQL Sever結合存儲過程的
解決方案。因為在
SQL Server的存儲過程里面可以使用游標(Cursor)來遍歷
數據庫表中所有的行,結合一個計數器變量就可以快速定位到數據庫表中的某一行了。但是在采用Access數據庫的ASP.NET應用程序中,一直沒有一種較好的解決方案。
我們知道,在ASP中可以使用ADO的游標來快速定位當前頁面的數據在數據庫表中的位置??墒茿DO.NET中沒有游標這個東西,所以傳統的DataGrid分頁方法都是用諸如“SELECT * FROM Item”的SQL語句從數據庫表中取出所有的記錄,然后DataGrid的自動分頁功能會幫你顯示相應分頁的數據。
二、目前的解決方案
很多人已經意識到了上面描述的問題,并提出了解決方法,即采用自定義分頁,每次從數據庫表中取出要顯示的數據。那么,怎樣取呢?答案就我知道的大概有5種以上吧。使用不同的算法,將會得到不同的效率。經過我粗略的
測試,最慢的算法耗費的時間大概是最快的3倍!而且這個數字會隨著記錄總數的增加而增加。
為了方便接下來的討論,在展示 SQL 語句之前,首先讓我們做如下約定:
PageIndex ItemId
ProductId
Price
0
001
0011
$12
002
0011
$13
003
0011
$12
1
004
0012
$13
005
0012
$11
006
0012
$14
2
007
0013
$14
008
0013
$12
009
0014
$13
3
010
0011
$13
011
0012
$15
012
0014
$16
4
013
0013
$12
014
0013
$13
變量 用途
@PageSize 每頁顯示的記錄總數
@PageCount 分頁總數
@RecordCount 數據表的記錄總數
@PageIndex 當前頁的索引
@FirstIndex 第一頁的索引
@MiddleIndex 中間頁的索引
@LastIndex 最后一頁的索引
@TableName 數據庫表名稱
@PrimaryKey 主鍵字段名稱
@QueryFields 要查詢的字段集
@Condition 篩選條件
定義:
@PageCount = (int)Math.Ceiling((double)@RecordCount / @PageSize)
@FirstIndex = 0
@LastIndex = @PageCount - 1
@MiddleIndex = (int)Math.Ceiling((double)@PageCount / 2) – 1
預設:
@PageSize = 2
@RecordCount = 9
@PageCount = 4
現在先讓我們來看看速度最慢的 SQL 語句:
SELECT TOP @PageSize * FROM @TableName AS a
WHERE @PrimaryKey NOT IN (
SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName AS b
ORDER BY @PrimaryKey
)
ORDER BY @PrimaryKey
這條語句慢就慢在 NOT IN 這里,主 SELECT 語句遍歷的每個 @PrimaryKey 的值都要跟子 SELECT 語句的結果集中的每一個 @PrimaryKey 的值進行比較,這樣時間復雜度非常大。其實我們平時編寫 SQL 語句的時候應該盡量避免用 NOT IN 語句,因為它往往會提高整個 SQL 語句的時間復雜度。
還有一種是用兩個 TOP 的 SQL 語句,如下所示:
SELECT * FROM (
SELECT TOP @PageSize * FROM (
SELECT TOP @PageSize*(@PageIndex+1) * FROM @TableName
ORDER BY @PrimaryKey
) TableA
ORDER BY @PrimaryKey DESC
) TableB
ORDER BY @PrimaryKey
這條 SQL 語句空間復雜度比較大。如果要顯示的分頁面剛好是最后一頁,那么它的效率比直接SELECT 出所有的記錄還要低。
下一篇將詳細介紹一種最快的算法,并根據不同情況,采用不同的變形來有效的提高查詢效率。
原文轉自:http://www.kjueaiud.com