列表內容
最近和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考試蠻重視的。但是,至少現在以我的親身經歷來講,如果只是考個乙級的話,企業應該是不看重的。其實去年十二月份的考試考得一般,今年三月份的成績反...