ROW_NUMBER() OVER Not Fast Enough With Large Result Set, any good solution?

前端 未结 2 672
萌比男神i
萌比男神i 2020-12-16 05:10

I use ROW_NUMBER() to do paging with my website content and when you hit the last page it timeout because the SQL Server takes too long to complete the search.

There

相关标签:
2条回答
  • 2020-12-16 05:27

    The base logic of this method relies on the SET ROWCOUNT expression to both skip the unwanted rows and fetch the desired ones:

    DECLARE @Sort /* the type of the sorting column */
    SET ROWCOUNT @StartRow
    SELECT @Sort = SortColumn FROM Table ORDER BY SortColumn
    SET ROWCOUNT @PageSize
    SELECT ... FROM Table WHERE SortColumn >= @Sort ORDER BY SortColumn
    

    The issue is well covered in this CodeProject article, including scalability graphs.

    TOP is supported on SQL Server 2000, but only static values. Eg no "TOP (@Var)", only "TOP 200"

    0 讨论(0)
  • 2020-12-16 05:36

    Years back, while working with Sql Server 2000, which did not have this function, we had the same issue.

    We found this method, which at first look seems like the performance can be bad, but blew us out the water.

    Try this out

    DECLARE @Table TABLE(
            ID INT PRIMARY KEY
    )
    
    --insert some values, as many as required.
    
    DECLARE @I INT
    SET @I = 0
    WHILE @I < 100000
    BEGIN
        INSERT INTO @Table SELECT @I
        SET @I = @I + 1
    END
    
    DECLARE @Start INT,
            @Count INT
    
    SELECT  @Start = 10001,
            @Count = 50
    
    SELECT  *
    FROM    (       
                SELECT  TOP (@Count)
                        *
                FROM    (
                            SELECT  TOP (@Start + @Count)
                                    *
                            FROM    @Table
                            ORDER BY ID ASC
                        ) TopAsc
                ORDER BY ID DESC
            ) TopDesc
    ORDER BY ID
    
    0 讨论(0)
提交回复
热议问题