Sqlserver数据库分页查询一直是Sqlserver的短板
sql server2005之前:
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
这种方法由于使用了not in,效率不太高。
SQL SERVER 2012 支持了OFFSET,一个Select可以分页查询:
sql server2005之前:
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
这种方法由于使用了not in,效率不太高。
SQL 2005/2008 由于支持了Row_Number于是通过派生表可以实现分页查询:
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
SQL SERVER 2012 支持了OFFSET,一个Select可以分页查询:
SELECT
LastName, FirstName, EmailAddress
FROM
Employee
ORDER
BY
LastName, FirstName, EmailAddress
OFFSET 14000
ROWS
FETCH
NEXT
50
ROWS
ONLY
;
最后说下,根据老外的文章,在2012里,如果前面加上TOP(50),那么执行计划就会少读很多行数据(读的精准了),提高性能。