我在我的应用程序(MVC4,SQL Server)中使用以下查询进行分页:
string sql = "SELECT Id, Name, Date, allCount FROM (" +
"SELECT Id, Name, Date, COUNT(Id) OVER() as allCount, " +
"ROW_NUMBER() OVER (ORDER BY Date DESC, Id ) AS RowNum FROM Products) AS SOD " +
"WHERE SOD.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1 AND @RowsPerPage*(@PageNumber) ORDER BY Date DESC";
这对我有用,但我想知道多次计算 allCount 的常规方法是什么?我担心多次计算 allCount 会影响批量数据的速度。但是,在视图中我需要 所有产品的数量 才能进行分页。如果不是正常代码,我该如何更改呢?
答案 0 :(得分:1)
我可能会在您的.net中内联您的Between操作参数。您可以控制计算只运行一次。我个人不相信SQL服务器来决定什么是“确定性”,因为我被咬了几次。另外,为什么你需要在每一行中返回allcount。如果您使用的是ADO.Net而不是ORM,则可以根据需要控制SQL。
待办事项
SELECT Count(*);
SELECT id,
name,
date
FROM (SELECT id,
name,
date,
Row_number()
OVER (
ORDER BY date DESC, id ) AS RowNum
FROM products) AS SOD
WHERE SOD.rownum BETWEEN @Start AND @End
ORDER BY date DESC
虽然我怀疑您只能使用HAVING
子句而不是WHERE
的内部查询。
答案 1 :(得分:1)
即使从结果数据看起来,对于数据集中的每个记录执行一次COUNT(Id)操作,计数实际上只执行一次。查询优化器知道表达式COUNT(Id) OVER()
独立于当前记录,这使得它只能进行一次计数。
因此,就分页而言,我认为您的查询没有任何问题。