查询考虑的行数

时间:2011-09-06 08:43:12

标签: sql sql-server tsql sql-server-2008

有没有办法在没有对源执行计数(*)的情况下找出查询考虑了多少行?

示例:

 Create table test (col1 int , col2 int)

  Insert into test select 1,2 union select 2,3

  Select avg(col1) from test 

如果我使用@@ rowsaffected,则返回查询返回的行数,即1.但我想查找查询所考虑的行数。

(在我原来的情况下,源是一个包含许多表的视图。)

2 个答案:

答案 0 :(得分:2)

SELECT AVG(col1),
       COUNT(*),/*Number of rows*/
       COUNT(col1), /*Number of non null rows that were used in the Avg*/
       SUM(1) /*Avoids use of COUNT!*/
FROM   test  

关于COUNT花费很长时间的评论,它应该为您的AVG查询准确添加其他工作。如果你试试

SET SHOWPLAN_TEXT ON
GO

SELECT AVG(high)
FROM master..spt_values

GO

SET SHOWPLAN_TEXT OFF

返回

  |--Compute Scalar(DEFINE:([Expr1003]=CASE WHEN [Expr1004]=(0) THEN NULL ELSE [Expr1005]/CONVERT_IMPLICIT(int,[Expr1004],0) END))
       |--Stream Aggregate(DEFINE:([Expr1004]=COUNT_BIG([master].[dbo].[spt_values].[high]), [Expr1005]=SUM([master].[dbo].[spt_values].[high])))
            |--Clustered Index Scan(OBJECT:([master].[dbo].[spt_values].[spt_valuesclust]))

如果匹配的行没有匹配,您会看到它已经使用COUNT(或实际为COUNT_BIG)以返回NULL

答案 1 :(得分:1)

好的,让我们做一些模拟,看看它是否真的花了16分钟来计算(*)。

测试查询:

 select count(*) cnt, avg (price) avg from MY_TABLE

其中MY_TABLE有超过1,500,000条记录,上述查询需要1分24秒,后续运行只需1秒,因此您要么有更多记录,要么还有其他内容。

进一步的测试:

从MY_TABLE运行选择平均(价格)平均值:1m25sec

从MY_TABLE运行select count(*)cnt需要:4秒

在testw

之间重新安装了SQL Server

在带有2GB RAM和2.2 GHz CORE 2 Duo和Windows 7 32的DELL Vostro 1500上测试,但是,SQL Server 2000。