繁体   English   中英

SQL 2005最佳“分页”

[英]SQL 2005 optimal “Paging”

使用自定义分页创建记录“网格”时,使用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 (...)

现在,我两次前往服务器:一个用于获取记录,另一个用于计算记录总数。

什么是组合这些查询以避免多次数据库跳转的最佳方法?

您可以使用带有输出参数(或返回值)的存储过程来传递总行数。

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

您可能只想在请求第一页时查询count()(可能非常昂贵)。

我发现最快的方法是返回结果集中的行数:

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 )

一种方法是将查询转换为存储过程,然后使用输出参数来计算总记录。 您将在过程中填充输出参数,然后以与现在相同的方式返回记录集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM