What is the best way to paginate results in SQL Server

前端 未结 19 2363
我寻月下人不归
我寻月下人不归 2020-11-22 01:36

What is the best way (performance wise) to paginate results in SQL Server 2000, 2005, 2008, 2012 if you also want to get the total number of results (before paginating)?

相关标签:
19条回答
  • 2020-11-22 02:08

    There is a good overview of different paging techniques at http://www.codeproject.com/KB/aspnet/PagingLarge.aspx

    I've used ROWCOUNT method quite often mostly with SQL Server 2000 (will work with 2005 & 2008 too, just measure performance compared to ROW_NUMBER), it's lightning fast, but you need to make sure that the sorted column(s) have (mostly) unique values.

    0 讨论(0)
  • 2020-11-22 02:08

    Try this approach:

    SELECT TOP @offset a.*
    FROM (select top @limit b.*, COUNT(*) OVER() totalrows 
            from TABLENAME b order by id asc) a
    ORDER BY id desc;
    
    0 讨论(0)
  • 2020-11-22 02:11

    MSDN: ROW_NUMBER (Transact-SQL)

    Returns the sequential number of a row within a partition of a result set, starting at 1 for the first row in each partition.

    The following example returns rows with numbers 50 to 60 inclusive in the order of the OrderDate.

    WITH OrderedOrders AS
    (
        SELECT
            ROW_NUMBER() OVER(ORDER BY FirstName DESC) AS RowNumber, 
            FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
        FROM [dbo].[vSalesPerson]
    ) 
    SELECT RowNumber, 
        FirstName, LastName, Sales YTD 
    FROM OrderedOrders 
    WHERE RowNumber > 50 AND RowNumber < 60;
    
      RowNumber FirstName    LastName               SalesYTD
      --- -----------  ---------------------- -----------------
      1   Linda        Mitchell               4251368.54
      2   Jae          Pak                    4116871.22
      3   Michael      Blythe                 3763178.17
      4   Jillian      Carson                 3189418.36
      5   Ranjit       Varkey Chudukatil      3121616.32
      6   José         Saraiva                2604540.71
      7   Shu          Ito                    2458535.61
      8   Tsvi         Reiter                 2315185.61
      9   Rachel       Valdez                 1827066.71
      10  Tete         Mensa-Annan            1576562.19
      11  David        Campbell               1573012.93
      12  Garrett      Vargas                 1453719.46
      13  Lynn         Tsoflias               1421810.92
      14  Pamela       Ansman-Wolfe           1352577.13
    
    0 讨论(0)
  • 2020-11-22 02:12

    The best way for paging in sql server 2012 is by using offset and fetch next in a stored procedure. OFFSET Keyword - If we use offset with the order by clause then the query will skip the number of records we specified in OFFSET n Rows.

    FETCH NEXT Keywords - When we use Fetch Next with an order by clause only it will returns the no of rows you want to display in paging, without Offset then SQL will generate an error. here is the example given below.

    create procedure sp_paging
    (
     @pageno as int,
     @records as int
    )
    as
    begin
    declare @offsetcount as int
    set @offsetcount=(@pageno-1)*@records
    select id,bs,variable from salary order by id offset @offsetcount rows fetch Next @records rows only
    end
    

    you can execute it as follow.

    exec sp_paging 2,3
    
    0 讨论(0)
  • 2020-11-22 02:16

    Use case wise the following seem to be easy to use and fast. Just set the page number.

    use AdventureWorks
    DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6;
    with result as(
    SELECT SalesOrderDetailID, SalesOrderID, ProductID,
    ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
    FROM Sales.SalesOrderDetail
    where 1=1
    )
    select SalesOrderDetailID, SalesOrderID, ProductID from result
    WHERE result.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
    AND @RowsPerPage*(@PageNumber)
    

    also without CTE

    use AdventureWorks
    DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6
    SELECT SalesOrderDetailID, SalesOrderID, ProductID
    FROM (
    SELECT SalesOrderDetailID, SalesOrderID, ProductID,
    ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
    FROM Sales.SalesOrderDetail
    where 1=1
     ) AS SOD
    WHERE SOD.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
    AND @RowsPerPage*(@PageNumber)
    
    0 讨论(0)
  • 2020-11-22 02:17

    This bit gives you ability to paginate using SQL Server, and newer versions of MySQL and carries the total number of rows in every row. Uses your pimary key to count number of unique rows.

    WITH T AS
    (  
      SELECT TABLE_ID, ROW_NUMBER() OVER (ORDER BY TABLE_ID) AS RN
      , (SELECT COUNT(TABLE_ID) FROM TABLE) AS TOTAL 
      FROM TABLE (NOLOCK)
    )
    
    SELECT T2.FIELD1, T2.FIELD2, T2.FIELD3, T.TOTAL 
    FROM TABLE T2 (NOLOCK)
    INNER JOIN T ON T2.TABLE_ID=T.TABLE_ID
    WHERE T.RN >= 100
    AND T.RN < 200
    
    0 讨论(0)
提交回复
热议问题