資料分頁的一些想法

2021-12-30 03:24:28 字數 3947 閱讀 9106

列表內容

最近和dba討論了一下專案中經常用到資料分頁的問題,收益頗多,這裡總結下自己關於分頁的一些想法和建議。

目前了解到的分頁方法有三種,下面一一介紹:

方法一

之前採用的是使用row_number函式為資料新增序列號,之後按照這個序列號,取自己需要的一段。

sql如下:

declare @start as int, @end as int, @totalitemcount as int;

set @start = 1 * 1;

set @end = 1 * 10;

select @totalitemcount = count(1)

from [pkginputdb].[dbo].prd_resourcesalespricedetail as r with (nolock)

where 1 = 1;

with result

as (select row_number() over (order by id asc) as rownumber,

r.id,

r.salespriceid,

r.effectdate,

r.expiredate,

r.salesprice,

r.active,

r.inuse

from [pkginputdb].[dbo].prd_resourcesalespricedetail as r with (nolock)

where 1 = 1)

select @totalitemcount as totalitemcount,

*from result

where rownumber between @start and @end;

其執行計畫:

在生產上執行效果:

方法二是微軟在sql server 2012?中推出的一種方法,採用offset fetch 語句。

sql如下:

declare @start as int, @end as int, @totalitemcount as int;

set @start = (@pageindex - 1) * @pagesize + 1;

set @end = @pageindex * @pagesize;

select @totalitemcount = count(1)

from [pkginputdb].[dbo].prd_resourcesalespricedetail as r with (nolock)

where 1 = 1;

with result

as (select r.id,

r.salespriceid,

r.effectdate,

r.expiredate,

r.salesprice,

r.active,

r.inuse

from [pkginputdb].[dbo].prd_resourcesalespricedetail as r with (nolock)

where 1 = 1)

select @totalitemcount as totalitemcount,

*from result

order by id

offset 0 rows fetch next 10 rows only;

執行計畫如下:

可以看出新推出的方法執行過程比第一種少很多。

生產執行效果:

方法三dba同學推薦的做法是:按照索引列進行排序,並在where 條件中增加 >min值 然後查詢top n n是每頁顯示資料量,翻頁時將上一次查詢的最大值 作為這次查詢的最小值。

sql語句如下:

declare @start as int, @end as int, @totalitemcount as int;

set @end = 10;

select @totalitemcount = count(1)

from [pkginputdb].[dbo].prd_resourcesalespricedetail as r with (nolock)

where 1 = 1;

with result

as (select r.id,

r.salespriceid,

r.effectdate,

r.expiredate,

r.salesprice,

r.active,

r.inuse

from [pkginputdb].[dbo].prd_resourcesalespricedetail as r with (nolock)

where 1 = 1

and id > 0)

select *

from result

order by id asc

offset 0 rows fetch next @end rows only;

執行計畫如下:

生產上執行效果:

效果對比從執行計畫上看只有第一種過程略微複雜,但對效能似乎並沒有什麼影響,不過考慮到過程越複雜,損耗可能就越大,故採用2,3比較合適;我們再測試下,分頁數變多時,各sql執**況

第二種分頁方法:

第10000頁時:

第10萬時:

第100萬頁時:

sql超時,無結果!

第三種分頁方法:

第10000頁時:

第10萬頁時:

可以看出隨著分頁數的增加,第二種分頁方法耗時會越來越大,而第三種方法則不受影響。

結語第一種在效能沒有優勢,且寫法複雜可以直接淘汰。這裡主要討論第二種和第三種分頁方式的優缺點,以及適用的場景。

當需求需要獲取記錄總數(多數情況下其實都可以不用返回總數的,只要和產品經理動之以情曉之以理,一般都會取消獲取總數的)時,分頁耗時相對獲取總數耗時可以忽略不計,故這裡只討論不需要獲取記錄總數的情況。

因為第二種分頁方法會隨著分頁數增加,耗時增大,故無特殊要求時採用第三種分頁比較好。

當然如果需要跳頁時,因為第三種分頁是基於上次一次分頁結果,所以不好實現,這種情況下可以採用第二種分頁方法。

排序要求比較複雜,且無固定順序時,也只能採用第二種分頁方法。

最近一些想法

1.it系統的建設中,當前的方 似乎仍舊沒有足夠重視對目標的認識 這造成的結果,以盲人摸象來形容,實際上是太輕了。今天上街看給小孩玩的電動小象形狀會唱歌但不會動的那種汽車,小孩的媽媽說,咱們去騎小象吧,這給了我乙個認識 我們建模的時候甚至在更早的步驟中進行分析和抽象的時候,往往就是這麼做的。即便不是...

談一些想法

睡不著,做夢驚醒。不知不覺,又是乙個6月8號過去了,如果一切正常的話,應該又有一大批的學弟學妹們走下了考場,滿懷憧憬地準備迎接人生的下乙個十字路口。一年前的我,現在應該坐在家裡,想著我報考什麼學校和專業吧。最開始可能想去北京,報考計算機或者機械,或者別的什麼專業。去年填報志願的時候,人工智慧炒的非常...

一些簡單的想法

我的關於pat甲級考試的總結的訪問量是其他文章訪問量的總和還要多。一是我這裡確實沒什麼乾貨 二是我這裡的內容可搜尋性不強,本身標題無傳播性 三是感覺大家對pat考試蠻重視的。但是,至少現在以我的親身經歷來講,如果只是考個乙級的話,企業應該是不看重的。其實去年十二月份的考試考得一般,今年三月份的成績反...