Sql server 较旧的行号()和较新的偏移量+;SQL Server中基于获取的分页?

Sql server 较旧的行号()和较新的偏移量+;SQL Server中基于获取的分页?,sql-server,sql-server-2008,sql-server-2005,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2012,在SQL Server 2012提供的较旧的行_编号(SQL Server 2008)和较新的OFFSET+FETCH(SQL Server 2012)分页机制方面,我没有什么问题 row_number()有哪些限制 OFFSET+FETCH是行号()的改进替代品吗 是否有任何用例只能使用其中一个而不能使用另一个 两者之间有什么性能差异吗?如果是,推荐哪一种 谢谢。使用ROW\u NUMBER()效果很好-只是需要做的工作太多了;您需要围绕实际查询编写一个“骨架”CTE,将ROW\u NUMBE

在SQL Server 2012提供的较旧的行_编号(SQL Server 2008)和较新的OFFSET+FETCH(SQL Server 2012)分页机制方面,我没有什么问题

  • row_number()有哪些限制
  • OFFSET+FETCH是行号()的改进替代品吗
  • 是否有任何用例只能使用其中一个而不能使用另一个
  • 两者之间有什么性能差异吗?如果是,推荐哪一种
  • 谢谢。

    使用
    ROW\u NUMBER()
    效果很好-只是需要做的工作太多了;您需要围绕实际查询编写一个“骨架”CTE,将
    ROW\u NUMBER()
    列添加到输出集中,然后对其进行筛选

    使用新的
    OFFSET/FETCH
    更简单-是的,它的性能也更好,因为这两个链接可以向您展示:


    总之:如果您使用的是SQL Server 2012,那么您肯定应该使用
    OFFSET/FETCH
    而不是
    ROW\u NUMBER()
    进行分页

    我发现这篇文章介绍了三种分页技术,并在图表中比较了它们的结果。这可能有助于您决定采用哪种方法


    讨论的所有分页方法都适用于较小数量的记录,但不适用于较大数量的数据。

    根据定义,行数是在运行查询时计算的临时值
    OFFSET/FETCH
    是一个选项,您可以为
    ORDER BY
    子句指定该选项

    就速度而言,它们都能获得很好的性能,每个方法之间的差异取决于
    SELECT
    子句中指定的列以及表中的索引

    在以下两个示例中,您可以看到这两种方法之间的差异:

    1。偏移/提取速度更快时的情况:

    SELECT
        Id
    FROM Orders
    ORDER BY
        Id
    
    OFFSET 50000 ROWS FETCH NEXT 5000 ROWS ONLY
    
    SELECT
        A.Id
    FROM
    (
        SELECT
            Id,
            ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Orders
    ) AS A
    WHERE
        A.RowNumber BETWEEN 50001 AND 55000
    
    SELECT
        *
    FROM Orders
    ORDER BY
        Id
    OFFSET 50000 ROWS FETCH NEXT 5000 ROWS ONLY
    
    SELECT
        A.*
    FROM
    (
        SELECT
            *,
            ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Orders
    ) AS A
    WHERE
        A.RowNumber BETWEEN 50001 AND 55000
    
    2。行数()更快时的情况:

    SELECT
        Id
    FROM Orders
    ORDER BY
        Id
    
    OFFSET 50000 ROWS FETCH NEXT 5000 ROWS ONLY
    
    SELECT
        A.Id
    FROM
    (
        SELECT
            Id,
            ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Orders
    ) AS A
    WHERE
        A.RowNumber BETWEEN 50001 AND 55000
    
    SELECT
        *
    FROM Orders
    ORDER BY
        Id
    OFFSET 50000 ROWS FETCH NEXT 5000 ROWS ONLY
    
    SELECT
        A.*
    FROM
    (
        SELECT
            *,
            ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Orders
    ) AS A
    WHERE
        A.RowNumber BETWEEN 50001 AND 55000
    

    你查过了吗?看到这个相当全面的答案:这看起来很诚实,但我想知道如何强制EF使用2012 sql server的集合?我有几个理由不同意你们的结论,这并不像你说的那么简单:你提到的第一个链接没有做任何性能比较:我不打算就此得出任何结论,因为我没有在这里做任何彻底的测试。第二个链接没有提到执行测试的行数,并且偏移量/获取方法很容易在大型表中表现不佳(请参见此处)@lcfd:mssqlgirl的文章没有将偏移量/获取与行数进行比较:它只将其与涉及按已知、唯一、索引排序的技术进行比较,连续ID字段。这不适用于许多现实情况。