日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談SQL Server2005的幾種分頁方法

SQL Server分頁查詢是我們經(jīng)常會(huì)用到的功能,其實(shí)現(xiàn)方法也有很多,本文的幾種分頁方法摘自《SQL Server2005性能調(diào)優(yōu)》一書。希望對您學(xué)習(xí)SQL Server分頁查詢方面能有所幫助。

創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨(dú)特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時(shí),也能得到同行業(yè)的專業(yè)認(rèn)可,能夠?yàn)樾袠I(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式成都全網(wǎng)營銷推廣需求,讓再小的高端網(wǎng)站設(shè)計(jì)也能產(chǎn)生價(jià)值!

用以下腳本生成測試數(shù)據(jù):

 
 
 
  1. CREATE TABLE TRANS_TABLE(  
  2.         MYID   INT IDENTITY(1,1) NOT NULL PRIMARY KEY,  
  3.         MYDESC VARCHAR(10),  
  4.         MYDATE DATETIME,  
  5.         MYGROUPID INT)  
  6. DECLARE @I INT 
  7. SET @I = 0WHILE @I < 1000000  
  8. BEGIN 
  9.     INSERT INTO TRANS_TABLE  
  10.     SELECT CHAR(ASCII('A') - 2 + (2 * (1 + ABS(CHECKSUM(NEWID())) % 26))),  
  11.                  DATEADD(day, ABS(CHECKSUM(NEWID())) % 365, '01/01/2007'),  
  12.                  (ABS(CHECKSUM(NEWID())) % 10)  
  13.     SET @I = @I + 1  
  14. END 
  15. CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYDATE  
  16. ON TRANS_TABLE(MYDATE)  
  17. CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYGROUPID  
  18. ON TRANS_TABLE(MYGROUPID)  
  19.  

1、基于CTE分頁

1)用row_number()排名函數(shù),派生表的方式分頁

 
 
 
  1. DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  3. select *  
  4.   from ( select p.*, rownum rnum  
  5.          FROM (  
  6.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, *  
  7.             FROM TRANS_TABLE (NOLOCK)  
  8.                 ) p  
  9.           where rownum <= @START_ROW + @MAX_ROWS - 1  
  10.        )  
  11.  z where rnum >= @START_ROW  
  12.  

2)用CTE方式取代派生表

 
 
 
  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3. WITH PAGED AS (  
  4.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,     *  
  5.             FROM TRANS_TABLE (NOLOCK)  
  6.             )  
  7. SELECT *  
  8. FROM PAGEDWHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS-1 

3)也是CTE方法,但是根據(jù)測試數(shù)據(jù)顯示這種性能比前兩種都好

 
 
 
  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3. WITH PAGED AS (  
  4.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, MYID  
  5.             FROM TRANS_TABLE (NOLOCK)  
  6.             )  
  7. SELECT TT.*  
  8. FROM PAGED PGD  
  9. INNER JOIN TRANS_TABLE TT  
  10. ON PGD.MYID = TT.MYID  
  11. WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
  12. ORDER BY MyDate, MYID  

2、  基于ROW_COUNT的分頁

 
 
 
  1. DECLARE     @START_ID int, @START_ROW int, @MAX_ROWS int,  
  2.          @START_DATETIME DATETIME, @TOT_ROW_CNT INT 
  3. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  4. -- Get the first row for the page  
  5. SET ROWCOUNT @START_ROW  
  6. SELECT @START_ID = MYID, @START_DATETIME = MYDATE FROM TRANS_TABLE (NOLOCK)  
  7.         ORDER BY MYDATE, MYID  
  8. -- Now, set the row count to MaximumRows and get  
  9. -- all records >= @first_idSET ROWCOUNT @MAX_ROWS  
  10. SELECT *  
  11. FROM TRANS_TABLE (NOLOCK)  
  12. WHERE MYID >= @START_ROW  
  13. AND MYDATE >= @START_DATETIME  
  14. ORDER BY MYDATE, MYID  
  15. SET ROWCOUNT 0  

3、  TOP @X分頁

SQL Server 2005中可以把返回行數(shù)做為參數(shù)傳給top語句。

 
 
 
  1. DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT INT, @START_DESC VARCHAR(10)  
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  3. -- Get the first row for the page  
  4. SELECT TOP(@START_ROW) @START_ID = MYID, @START_DESC = MYDESC FROM TRANS_TABLE (NOLOCK)  
  5.     ORDER BY MYDESC, MYID  
  6. SELECT TOP(@MAX_ROWS) *  
  7. FROM TRANS_TABLE (NOLOCK)  
  8. WHERE MYID >= @START_ROW  
  9. AND MYDESC >= @START_DESC  
  10. ORDER BY MYDESC, MYID  
  11.  

4、  Temp表分頁

 
 
 
  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3.     SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,  
  4.          MYID  
  5.     into #TEMP 
  6.     FROM TRANS_TABLE (NOLOCK)  
  7. SELECT TT.*  
  8. FROM TRANS_TABLE (NOLOCK) TT  
  9. INNER JOIN #TEMP TON TT.MYID = T.MYID  
  10. WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
  11. DROP TABLE #TEMP 
  12.  

以上便是這次為您介紹的 SQL Server 2005中幾種分頁方法,希望對您學(xué)習(xí)SQL Server分頁查詢方面能有所幫助。


本文標(biāo)題:淺談SQL Server2005的幾種分頁方法
網(wǎng)頁地址:http://www.dlmjj.cn/article/cojsjho.html