多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 數據庫 > 數據庫應用 > SQL 高效分頁(百萬條數據)

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; }



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------

上一篇 HTML

下一篇 .NET中的緩存技術概覽

分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 精品国产一区二区三区免费看 | 精品一区国产 | 亚洲成人在线网 | 日韩一级在线播放免费观看 | h网在线| 亚洲精品视频网 | 欧美精品久久久亚洲 | 亚洲在线播放视频 | 国产自精品在线 | 亚洲综合资源 | 精品久久久久国产免费 | jiucao在线看片www | 亚洲欧美色综合自拍 | 日本成在线人视频免费视频 | 国产综合久久 | 欧美三级超在线视频 | 在线观看91精品国产性色 | 亚洲欧美一区二区三区九九九 | 久久精品国内偷自一区 | 亚洲天堂网址 | 乡下女色又黄一级毛片 | 免费爱爱网 | yellow字幕网最新官网2019 | 欧美性高清另类videosex | yellow中文字幕在线高清 | 91精品推荐 | 成人6969www色| 稀缺资源呦视频在线网站 | 非洲黑人最猛性xxxx交 | 91九色国产| 日韩欧美亚洲每日更新网 | 韩国av片永久免费 | 免费看在线爱爱小视频 | 手机在线看| 护士japaneseⅹxxx | 亚洲 欧美 中文 日韩欧美 | 欧美激情福利 | 国产精品久久久亚洲456 | 亚洲最新视频 | 娇小性色xxxxx中文 | 久久911|