有没有办法在没有对源执行计数(*)的情况下找出查询考虑了多少行?
示例:
Create table test (col1 int , col2 int)
Insert into test select 1,2 union select 2,3
Select avg(col1) from test
如果我使用@@ rowsaffected,则返回查询返回的行数,即1.但我想查找查询所考虑的行数。
(在我原来的情况下,源是一个包含许多表的视图。)
答案 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。