SQL Server 2008 paging methods?

前端 未结 7 576
傲寒
傲寒 2020-11-29 06:23

I have to work with a potentially large list of records and I\'ve been Googling for ways to avoid selecting the whole list, instead I want to let users select a page (like f

7条回答
  •  -上瘾入骨i
    2020-11-29 06:47

    Using OFFSET

    Others have explained how the ROW_NUMBER() OVER() ranking function can be used to perform pages. It's worth mentioning that SQL Server 2012 finally included support for the SQL standard OFFSET .. FETCH clause:

    SELECT first_name, last_name, score
    FROM players
    ORDER BY score DESC
    OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
    

    If you're using SQL Server 2012 and backwards-compatibility is not an issue, you should probably prefer this clause as it will be executed more optimally by SQL Server in corner cases.

    Using the SEEK Method

    There is an entirely different, much faster way to perform paging in SQL. This is often called the "seek method" as described in this blog post here.

    SELECT TOP 10 first_name, last_name, score
    FROM players
    WHERE (score < @previousScore)
       OR (score = @previousScore AND player_id < @previousPlayerId)
    ORDER BY score DESC, player_id DESC
    

    The @previousScore and @previousPlayerId values are the respective values of the last record from the previous page. This allows you to fetch the "next" page. If the ORDER BY direction is ASC, simply use > instead.

    With the above method, you cannot immediately jump to page 4 without having first fetched the previous 40 records. But often, you do not want to jump that far anyway. Instead, you get a much faster query that might be able to fetch data in constant time, depending on your indexing. Plus, your pages remain "stable", no matter if the underlying data changes (e.g. on page 1, while you're on page 4).

    This is the best way to implement paging when lazy loading more data in web applications, for instance.

    Note, the "seek method" is also called keyset paging.

提交回复
热议问题