查询的总行数

时间:2010-12-14 12:50:34

标签: sql sql-server tsql query-optimization

我有一个非常大的查询,它应该只返回前10个结果:

从.....

中选择前10名ProductId

问题是我还想要符合条件的结果总数而没有“前10名”,但同时它被认为是无法返回所有行的(我们谈论的是大约10万个结果。) p>

有没有办法获得上一个查询影响的总行数,无论是在其中还是在后面而不再运行它?

PS:请不要有10万行的临时表:))

4 个答案:

答案 0 :(得分:4)

将计数转储到变量中并返回

declare @count int
select @count = count(*) from ..... --same where clause as your query

--now you add that to your query..of course it will be the same for every row..
select top 10 ProductId, @count as TotalCount from .....

答案 1 :(得分:2)

假设您已经使用了ORDER BY子句(正确定义了“TOP 10”结果),那么您也可以使用相反的排序顺序添加ROW_NUMBER调用,并选择返回的最高值

例如,以下内容:

select top 10 *,ROW_NUMBER() OVER (order by id desc) from sysobjects order by ID

最后一列的值为2001,2000,1999等,降序。以下内容:

select COUNT(*) from sysobjects

确认sysobjects中有2001行。

答案 2 :(得分:0)

我想你可以用工会选择

来破解它
select top 10 ... from ... where ...
union
select count(*) from ... where ...

为了逃避这种类型的黑客攻击,您需要在计数查询中添加假列,以便返回与主查询相同数量的列。例如:

select top 10 id, first_name from people
union
select count(*), '' as first_name from people

我不建议使用此解决方案。使用两个单独的查询是如何完成的

答案 3 :(得分:0)

一般来说 - 推理如下:

如果(!),查询规划器可以使用TOP 10只返回10行,那么RDBMS甚至不知道满足完整标准的确切行数,它只是得到TOP 10.

因此,当您想要查找满足条件的所有行的计数时,您第二次没有运行它,而是第一次。

说过正确的索引可能会使两个查询执行得非常快。

修改
MySQL有SQL_CALC_FOUND_ROWS,如果没有应用LIMIT,则返回查询将返回的行数 - 在MS SQL中搜索等效的分析SQL和CTE变体,请参阅this forum(即使不确定)这两种方式都有资格只运行一次,但请随时查看 - 并告诉我们。)