Sql server 获取查询返回的总行数

Sql server 获取查询返回的总行数,sql-server,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2008 R2,哪个选项更快?为什么 SELECT COUNT(1) OVER (PARTITION BY 1), -- Option 1 ROW_NUMBER() OVER ( ORDER BY ac.[dateupdated] DESC) AS RowNum, FROM MyTable ac WHERE ac.[idstatus] = @idstatus AND ac.[idtype] = @idtype SET @TotalRecords = @@ROWCOUNT

哪个选项更快?为什么

SELECT
    COUNT(1) OVER (PARTITION BY 1), -- Option 1
    ROW_NUMBER() OVER    (    ORDER BY ac.[dateupdated] DESC) AS RowNum,
FROM MyTable ac      
WHERE ac.[idstatus] = @idstatus AND ac.[idtype] = @idtype

SET @TotalRecords = @@ROWCOUNT -- Option 2

这个想法是在DEV中,2个选项之间的差异是1秒,但在PROD中,两个选项都非常接近0(0.03秒)。

在实践中,我发现
计数速度非常慢,尤其是在复杂的查询中。更不用说你现在对结果集中的每一行都有一个计数了

如果动态生成查询,那么首先执行
选择计数(*)
(使用所有过滤器等)然后执行所需的实际选择实际上要快得多


我不确定您是否可以相信
@@ROWCOUNT
在所有情况下都是正确的。例如,如果将分页添加到查询中,它将返回什么?我希望它返回的是返回的行数(即页面大小),而不是总行数。

我希望@@ROWCOUNT总是更快,因为它是由任何赋值(包括您的select)设置的,即使它没有被读取,而且它是存储在服务器内存中的一个简单变量。如果是较慢的选择,我会大吃一惊。至于生产中的行为,SQL server可以根据各种统计数据简单地决定缓存此查询的结果是微不足道的,因此它可以随时返回更改的结果,更不用说它可以随意优化查询计划。但话说回来,问题是什么?你只是好奇还是想解决问题?