SQL Server 2012分页和TotalRows

时间:2014-06-03 10:06:32

标签: sql sql-server pagination sql-server-2012

我只需要在SQL Server 2012中开始分页,并且我尝试在应用分页之前获取总行数,但我遇到的问题是我的视图功能太多了在其中呼吁大幅减慢速度。

我已经查看了这篇文章,但我最终得到的查询需要39秒才能在数据库中没有完整数据集的情况下运行。

Get total row count while paging

    SELECT *
    , COUNT(TaskId) OVER()
FROM TaskVersionView
WHERE (.. ~10 predicates here .. )
ORDER BY StartDate
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

如果没有COUNT,则需要<1秒。

我原本希望SQL对其进行优化,以便它只计算TaskIds而不是调用函数,但似乎并非如此,因为:

SELECT COUNT(TaskId)
FROM TaskVersionView

需要&lt; 1秒

1 个答案:

答案 0 :(得分:0)

  

我原本希望SQL对其进行优化,以便它只计算TaskIds而不是调用函数

  • 如果谓词始终为“true”,则此“优化”将返回正确的值。即使在理论上,SQL Server也不能猜测函数总是会返回true。但是如果你知道(因为它似乎意味着你的期望)谓词中的函数总是返回true,那么显然你应该从WHERE子句中删除它们......

  • 如果谓词有时会返回'false',那么显然它们无法被优化掉,因为返回的值不正确。

需要付出一些代价。

PS。总计数的分页是一个坏主意,因为它会强制每次访问都进行全面扫描。对每行返回总计数的总计数进行分页是一个可怕的坏主意(建模明智,性能明智,理智明智)。