Sql 有没有办法计算公共表表达式(CTE)或子查询中动态查询返回的行总数

Sql 有没有办法计算公共表表达式(CTE)或子查询中动态查询返回的行总数,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我们正在优化我们的数据库。我们有大多数使用CTE的存储过程,因为根据我们的表结构,它提供了高性能。我们几乎有动态查询,根据不同的条件有不同的结果。我们在CTE中保存所有数据,并检查条件,这不是问题,但我们需要每个查询返回的总行数,在计算时需要花费大量时间。临时表或表变量不适合我们的情况,因为在其中插入数据需要花费大量时间。我们的结构如下 With t(fields) as (select field1,field2....... ROW_NUMBER() OVER (order by some

我们正在优化我们的数据库。我们有大多数使用CTE的存储过程,因为根据我们的表结构,它提供了高性能。我们几乎有动态查询,根据不同的条件有不同的结果。我们在CTE中保存所有数据,并检查条件,这不是问题,但我们需要每个查询返回的总行数,在计算时需要花费大量时间。临时表或表变量不适合我们的情况,因为在其中插入数据需要花费大量时间。我们的结构如下

With t(fields) as
(select field1,field2.......
 ROW_NUMBER() OVER (order by some column) as row...
from some table and lots of 
inner n left joins 
where some condition ),
rowTotal(RowTotal) as
  (select max(row) from t) 
   select * from t,RowTotal 
   where condition for paging

但是max(row)花了很多时间,如果我删除它,它会在100毫秒内返回数据。我试过Count(*),Count(SomeField)还有很多其他的方法,但是需要很多时间。如何在几毫秒内从cte中获得总行数?任何聚合函数对我都不起作用。是否有其他方法来计算rowcotal,如@@rowcount。提前感谢您的帮助。

如果您在内部查询中查找总行数,您可以将其作为列添加到您可以使用
COUNT()
PARTITION BY()
进行选择

这将为您提供“t”中的总行数,作为
t的第一列


我不知道这是获得您想要的结果的最快方法,但它对我来说适用于000条返回的记录,并防止额外的select查询单独查找计数。

您不能在数据的接收端将其删除吗,在应用程序中?我尝试了所有可能的解决方案,但无论是计算结束时的记录总数还是递归CTE内部的记录总数,都要花费大量时间。我通过重新组织查询解决了这些问题-CTE的分页设计只返回所需的唯一字段和总行数;其他表(没有1-N关系的左联接)稍后联接。这并不总是可行的,在很大程度上取决于查询结构。另一种选择是根本不使用总行数(页面数)(用户不喜欢这样)或使用近似总行数(用户通常不会注意到),就像google这样的服务。您是否尝试在第一个CTE中包含一个
count(*)over()作为总行数?
?如果您的CTE是递归的,那么可能不是。如果CTE不是递归的(或者即使它是递归的,但在更深层次上只创建一行),那么您应该能够创建简单的查询来查找所需的行数,然后可以对其进行优化。CTE不可能比单个查询更快地找到所有行,而对于总计数,它只需要这样做。
With t(fields) as
(select COUNT(*) OVER (PARTITION BY 1) AS TotalRows,
        field1,field2.......
        ROW_NUMBER() OVER (order by some column) as row...
from some table ...