SQL Server 中ROW_NUMBER() OVER基本用法


1、不能排序法

SELECT TOP 10 *
FROM table1
WHERE id NOT IN (
    SELECT TOP 開始的位置 id
    FROM table1
)

2、SQL 2000 臨時表法

DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000, @End = 14050

CREATE TABLE #employees (
    RowNumber INT IDENTITY (1, 1),
    LastName VARCHAR(100),
    FirstName VARCHAR(100),
    EmailAddress VARCHAR(100)
)

INSERT INTO #employees (LastName, FirstName, EmailAddress)
SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
SELECT LastName, FirstName, EmailAddress
FROM #employees
WHERE RowNumber > @Start
    AND RowNumber <= @End

DROP TABLE #employees

3、SQL 2005/2008 Row_Number法

DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000, @End = 14050

SELECT LastName, FirstName, EmailAddress
FROM (
    SELECT LastName, FirstName, EmailAddress, ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
    FROM Employee
) EmployeePage
WHERE RowNumber > @Start
    AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

4、SQL SERVER 2012以后 OFFSET/FETCH NEXT法

SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
OFFSET 14000 ROWS FETCH NEXT 50 ROWS ONLY;

語法說明:

ORDER BY ORDER_BY_EXPRESSION
    [ COLLATE COLLATION_NAME ] 
    [ ASC | DESC ] 
    [ ,...N ] 
[ <OFFSET_FETCH> ]
 
<OFFSET_FETCH> ::=
{ 
    OFFSET { INTEGER_CONSTANT | OFFSET_ROW_COUNT_EXPRESSION } { ROW | ROWS }
    [
      FETCH { FIRST | NEXT } {INTEGER_CONSTANT | FETCH_ROW_COUNT_EXPRESSION } { ROW | ROWS } ONLY
    ]
}

--FIRST 和 NEXT 是同義詞,是為了與 ANSI 兼容而提供的。
--ROW 和 ROWS 是同義詞,是為了與 ANSI 兼容而提供的。

對比分析:

 

 

1~100

5001~5100

9900~10000

估計行數

OFFSET FETCH

開銷占比

49%

84%

90%

100

ROW_NUMBER

開銷占比

51%

16%

10%

9

ROW_NUMBER 在 編譯內存,CPU 比 OFFSET FETCH 多。

上面統計中:OFFSET FETCH 查詢的記錄在表中越靠后,開銷反而更大,而這個的估計行數是准確的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM