SQL 2005 оптимальный "Пейджинг" - PullRequest
3 голосов
/ 18 мая 2010

При создании «сетки» записей с настраиваемой подкачкой страниц, каков наилучший / оптимальный способ запроса общего количества записей, а также начала и конца записей с использованием C #?

SQL для возврата набора постраничных записей:

SELECT Some, Columns, Here FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY Column ASC) AS RowId, *
    FROM
        Records
    WHERE
        (...)
) AS tbl
WHERE ((RowId > @Offset) AND (RowId <= (@Offset + @PageSize)) )

SQL для подсчета общего количества записей:

SELECT COUNT(*) FROM Records WHERE (...)

Сейчас я совершаю две поездки на сервер: одну для получения записей, а другую для подсчета общего количества записей.

Каков наилучший (ые) способ (ы) комбинировать эти запросы, чтобы избежать нескольких обращений к БД?

Ответы [ 3 ]

2 голосов
/ 18 мая 2010

Вы можете использовать хранимую процедуру с выходным параметром (или возвращаемым значением) для передачи общего количества строк.

create procedure dbo.Stuff_GetAll (
    @StartRowIndex int, -- zero based
    @MaximumRows int
)
as
begin
    declare @TotalRows int

    select @TotalRows = count(*) 
    ...

    if (@TotalRows > 0 and @MaximumRows > 0)
    begin
        ;with T as (
            select *, row_number() over ()
            ...
        )
        select T.* from T
        where Row between @StartRowIndex + 1 and (@StartRowIndex + @MaximumRows)
    end

    return @TotalRows
end
GO

Возможно, вы захотите добавить проверку в счетчик запросов () только при запросе первой страницы (может быть довольно дорого).

2 голосов
/ 19 мая 2010

Самый быстрый метод, который я нашел, это вернуть количество строк в наборе результатов:

With PagedItems As
    (
    Select ...
        , ROW_NUMBER() OVER ( ORDER BY Column ASC ) As Seq
        , ROW_NUMBER() OVER ( ORDER BY Column DESC ) As ReverseSeq
    From Table
    Where ....
    )
Select ..., ( ReverseSeq + Seq - 1) As TotalRows
From PagedItems
Where RowId > @Offeset
    ANd RowId <= ( @Offset + @PageSize )
0 голосов
/ 18 мая 2010

Один из способов состоит в том, чтобы превратить ваш запрос в хранимую процедуру, а затем иметь выходной параметр, который позволяет подсчитывать общее количество записей. Вы должны заполнить выходной параметр внутри процедуры, а затем вернуть свой набор записей так же, как сейчас.

...