[英]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.