SQL 高效分頁(百萬條數據)
來源:程序員人生 發布時間:2014-12-13 09:26:55 閱讀次數:3853次
參考資料:SQL分頁語句
第1種方法:效力最高
SELECT TOP 頁大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) as A
WHERE RowNumber > 頁大小*(頁數⑴)
--注解:首先利用Row_number()為table1表的每行添加1個行號,給行號這1列取名'RowNumber' 在over()方法中將'RowNumber'做了升序排列
--然后將'RowNumber'列 與table1表的所有列 構成1個表A
--重點在where條件。假設當前頁(currentPage)是第2頁,每頁顯示10個數據(pageSzie)。那末第1頁的數據就是第11⑵0條
--所以為了顯示第2頁的數據,即顯示第11⑵0條數據,那末就讓RowNumber大于 10*(2⑴) 即:頁大小*(當前頁⑴)
將上面的方法寫成存儲進程 (表名Location)
if(exists(select* from sys.procedures where name='p_location_paging'))--如果p_location_paging這個存儲進程存在
drop proc p_location_paging --那末就刪除這個存儲進程
go
create proc p_location_paging(@pageSize int, @currentPage int)--創建存儲進程,定義兩個變量'每頁顯示的條數'和'當前頁'
as
select top (@pageSize) * from (
select ROW_NUMBER() over(order by locid) as rowid ,* from location
)as A
where rowid> (@pageSize)*((@currentPage)⑴)
簡單的說row_number()從1開始,為每條分組記錄返回1個數字

第2種方法:效力次之
SELECT TOP 頁大小 * --如果每頁顯示10條數據,那末這里就是查詢10條數據
FROM table1
WHERE id > --假設當前頁為第3頁,那末就需要查詢21⑶0條數據,即:id>20
(
SELECT ISNULL(MAX(id),0) --查詢子查詢中最大的id
FROM
(
SELECT TOP 頁大小*(當前頁⑴) id FROM table1 ORDER BY id --由于當前頁是第3頁,每頁顯示10條數據。那末我將: 頁大小*(當前頁⑴),就是獲得到了在"當前頁""前面"的20條數據。所以上面用max(id)查詢最大的id,取到這個20,那末前面的where 條件的id>20 即取到了第3頁的數據,即取21⑶0條數據
) as A
)
ORDER BY id
將上面的方法寫成存儲進程:表名Location
if(exists(select * from sys.procedures where name='p_location_paging'))
drop proc p_location_paging
go
create proc p_location_paging(@pageSize int ,@currentPage int)
as
select top (@pageSize) * from location
where locId>(select ISNULL(MAX(locId),0)
from (select top ((@pageSize)*(@currentPage⑴))locid from location order by locId) as a
)
order by locId
第3種方法:效果最差
SELECT TOP 頁大小 *
FROM table1
WHERE id NOT IN --where條件語句限定要查詢的數據不是子查詢里面包括的數據。即查詢"子查詢"后面的10條數據。即當前頁的數據
(
--如果當前頁是第2頁,每頁顯示10條數據,那末這里就是獲得當前頁前面的所有數據。
SELECT TOP 頁大小*(當前頁⑴) id FROM table1 ORDER BY id
)
ORDER BY id
在知道總的數據量,及每頁顯示多少條數據后。計算總的頁數
<1> 即使數據總的條數為0。也顯示1頁; 即:總頁數=1
int dataCount; //數據的總的條數
int pageSize; //每頁顯示多少條數據
int pageCount; //總的頁數
pageCount = dataCount % pageSize == 0 ? ((dataCount - pageSize >= 0 ? (dataCount / pageSize) : 1)) : dataCount / pageSize + 1;
//上面這句話分解1下就是:
if(dataCount%pageSize==0)
{
if(dataCount-pageSize>=0) //即if(dataCount>pageSize)
{
pageCount=dataCount/pageSize;
}
else
{
pageCount=1; //假設數據的總條數只有8條數據。而每頁顯示10條數據;也就是說8%10的結果是等于0的。但是既然有8條數據,我也需要用1頁來顯示這8條數據。所有就有這個條件:即:即使dataCount%pageSize==0的時候,在dataCount<pageSize的情況下,總頁數PageCount最少也得有1頁吧!所以這里就將pageCount設為1了。
}
}
else
{
dataCount=(dataCount/pageSize)+1;
}
<2>如果數據總條數為0。連1頁都不需要顯示;即:總頁數=0
int dataCount; //數據的總的條數
int pageSize; //每頁顯示多少條數據
int pageCount; //總的頁數
pageCount = dataCount % pageSize == 0 ? ((dataCount - pageSize >= 0 ? (dataCount / pageSize) : (dataCount==0?0:1))) : dataCount / pageSize + 1;
//上面這句話分解1下就是:
if(dataCount%pageSize==0)
{
if(dataCount-pageSize>=0) //即if(dataCount>pageSize)
{
pageCount=dataCount/pageSize;
}
if(dataCount=0)
{
pageCount=0; //相比上面那個計算總頁數,這里多了這么1條判斷。如果連1條數據都沒有的情形下,我連1頁都不需要顯示,即:讓總頁數為0,
}
else
{
pageCount=1; //假設數據的總條數只有8條數據。而每頁顯示10條數據;也就是說8%10的結果是等于0的。但是既然有8條數據,我也需要用1頁來顯示這8條數據。所有就有這個條件:即:即使dataCount%pageSize==0的時候,在dataCount<pageSize的情況下,總頁數PageCount最少也得有1頁吧!所以這里就將pageCount設為1了。
}
}
else
{
dataCount=(dataCount/pageSize)+1;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈