DataGrid連接Access的快速分頁法(1)——需求與現(xiàn)狀
2024-09-07 19:04:59
供稿:網(wǎng)友
datagrid連接access的快速分頁法(1)——需求與現(xiàn)狀
一、需求分析
datagrid是一個功能強大的asp.net web服務器端控件,它除了能夠按各種方式格式化顯示數(shù)據(jù),還可以對數(shù)據(jù)進行動態(tài)的排序、編輯和分頁。大大減輕了廣大web程序員的工作量。實現(xiàn)datagrid的分頁功能一直是很多入門者感到棘手的問題,特別是自定義分頁功能,實現(xiàn)的方法多種多樣,非常靈活。
目前大家公認性能最好的應該數(shù)sql sever結合存儲過程的解決方案。因為在sql server的存儲過程里面可以使用游標(cursor)來遍歷數(shù)據(jù)庫表中所有的行,結合一個計數(shù)器變量就可以快速定位到數(shù)據(jù)庫表中的某一行了。但是在采用access數(shù)據(jù)庫的asp.net應用程序中,一直沒有一種較好的解決方案。
我們知道,在asp中可以使用ado的游標來快速定位當前頁面的數(shù)據(jù)在數(shù)據(jù)庫表中的位置。可是ado.net中沒有游標這個東西,所以傳統(tǒng)的datagrid分頁方法都是用諸如“select * from item”的sql語句從數(shù)據(jù)庫表中取出所有的記錄,然后datagrid的自動分頁功能會幫你顯示相應分頁的數(shù)據(jù)。
二、目前的解決方案
很多人已經(jīng)意識到了上面描述的問題,并提出了解決方法,即采用自定義分頁,每次從數(shù)據(jù)庫表中取出要顯示的數(shù)據(jù)。那么,怎樣取呢?答案就我知道的大概有5種以上吧。使用不同的算法,將會得到不同的效率。經(jīng)過我粗略的測試,最慢的算法耗費的時間大概是最快的3倍!而且這個數(shù)字會隨著記錄總數(shù)的增加而增加。
為了方便接下來的討論,在展示 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 每頁顯示的記錄總數(shù)
@pagecount 分頁總數(shù)
@recordcount 數(shù)據(jù)表的記錄總數(shù)
@pageindex 當前頁的索引
@firstindex 第一頁的索引
@middleindex 中間頁的索引
@lastindex 最后一頁的索引
@tablename 數(shù)據(jù)庫表名稱
@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
現(xiàn)在先讓我們來看看速度最慢的 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 出所有的記錄還要低。
下一篇將詳細介紹一種最快的算法,并根據(jù)不同情況,采用不同的變形來有效的提高查詢效率。