0

我们正在优化我们的数据库。我们有大部分使用 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 毫秒内返回数据。我尝试了 Coun(*),Count(SomeField) 和许多其他的方法,但花了很多时间。我怎样才能在一些毫秒内从 cte 获得总行数,任何聚合函数都不适合我。有没有其他方法可以像@@rowcount 一样计算rowtotal。提前感谢您的帮助。

4

1 回答 1

1

如果您在内部查询的总行数之后,您可以使用 and 将此作为列添加到您的选择COUNT()PARTITION BY()

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 ...

这应该让您计算 't' 中的总行数作为t

我不知道这是获得所需结果的最快方法,但它适用于我返回的 000 条记录,并防止额外的选择查询单独查找计数。

于 2013-09-06T11:05:41.830 回答