如何改进sql分页查询?

时间:2014-02-05 07:41:18

标签: sql sql-server performance pagination paging

我在我的应用程序(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 会影响批量数据的速度。但是,在视图中我需要 所有产品的数量 才能进行分页。如果不是正常代码,我该如何更改呢?

2 个答案:

答案 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()独立于当前记录,这使得它只能进行一次计数。

因此,就分页而言,我认为您的查询没有任何问题。