資料分頁技術

2021-09-05 19:15:30 字數 3426 閱讀 3741

幾乎所有的應用程式都會用到資料和資料庫。但在對於大資料量的訪問設計上,是有很多講究的。例如,我們需要在乙個頁面上顯示很多資料,我們可能會考慮分頁。.net自帶的gridview控制項就能很容易地實現分頁,但是那樣做是否真的合理呢?除此之外,是否還有其他的方法呢?下面就特意拿了一些資料來比較一下

【以下的測試結果,僅供參考】

測試場景:

客戶端分頁的效果(直接使用gridview控制項的分頁)

資料繫結的**

using (sqlconnection conn = new sqlconnection("server=(local);database=adventureworks;integrated security=true"))

} 分頁**

protected void gridview1_pageindexchanging(object sender, gridviewpageeventargs e)

儲存過程

create proc getsalesorderdetail2

asselect salesorderid,salesorderdetailid,unitprice,orderqty,linetotal from sales.salesorderdetail order by salesorderid desc

伺服器端分頁的效果(在sql server儲存過程中進行分頁,即每次只取必須的資料)

注意,這幾個按鈕是要自己專門新增的。

初略計算,使用伺服器端分頁的技術速度將比在客戶端分頁的技術快871倍左右,這個情況,在資料量越大的情況下越明顯。因為gridview自己的分頁方式需要把資料全部讀取到記憶體,然後再決定哪些是要顯示的

資料繫結**

int pageindex = int.parse(gridview2.attributes["index"]);//這裡從屬性中讀取當前的頁碼

if (pageindex == 0) pageindex = 1;

using (sqlconnection conn = new sqlconnection("server=(local);database=adventureworks;integrated security=true"))

); sqlparameter pagecountparam = new sqlparameter("@pagecount", sqldbtype.int);

pagecountparam.direction = parameterdirection.output;

cmd.parameters.add(pagecountparam);

sqldataadapter adapter = new sqldataadapter(cmd);

dataset ds = new dataset();

conn.open();

adapter.fill(ds);

gridview2.attributes["pagecount"] = pagecountparam.value.tostring(); //這裡把總的頁數讀出來,放在乙個屬性裡面

gridview2.allowpaging = true;

gridview2.pagesize = 10;

gridview2.datasource = ds;

gridview2.databind();}}

分頁的**

protected void btfirstpage_click(object sender, eventargs e)

protected void btprevioupage_click(object sender, eventargs e)

protected void btnextpage_click(object sender, eventargs e)

protected void btlastpage_click(object sender, eventargs e)

儲存過程

alter proc getsalesorderdetail(@pageindex int,@pagesize int,@pagecount int output)

asdeclare @totalrows decimal(18,2)

declare @count decimal(18,2)

begin

select @totalrows=count(*) from sales.salesorderdetail

set @count=@totalrows/convert(decimal(18,0),@pagesize)

if(@count<=round(@count,0))

set @count=round(@count,0)

else

set @count=round(@count,0)+1

set @pagecount=convert(int,@count)

select salesorderid,salesorderdetailid,unitprice,orderqty,linetotal from

(select row_number() over(order by salesorderid desc) rownumber,salesorderid,salesorderdetailid,unitprice,orderqty,linetotal from sales.salesorderdetail) orderdata where rownumber between (@pageindex-1)*@pagesize+1 and @pageindex*@pagesize

end值得一說的是,dbdataadapter有乙個fill 方法 (dataset, int32, int32, string),可以根據乙個開始行號,和最大行號,進行填充。這種做法可以理解為在中間做了分層,就是說填充到dataset的時候,已經只有當前頁的資料了。這也能夠提高效能,但是卻不可避免地是:在資料庫裡面還是把所有的資料都讀出來了,只不過是adapter再過濾一次

資料庫分頁技術

1 無order by排序的寫法。效率最高 經過測試,此方法成本最低,只巢狀一層,速度最快!即使查詢的資料量再大,也幾乎不受影響,速度依然!select from select rownum as rowno,t.from k task t where flight date between to ...

在資料層實現分頁技術

sqlserver2005 有乙個row number函式,他針對select返回的每一行,從1開始編號,賦予其連續的編號。因為在查詢上應用了乙個排序的標準後,只有通過編號才能夠保證其順序是一致的。select row number over order by 列名 as row,列名 from 表...

SQL 資料庫分頁技術

分頁方案一 利用not in和select top分頁 語句形式 select top 10 from testtable where id not in select top 20 id from testtable order by id order by id select top 頁大小 f...