Количество строк, рассматриваемых запросом - PullRequest
0 голосов
/ 06 сентября 2011

Есть ли способ узнать, сколько строк рассматривается запросом, не выполняя подсчет (*) для источника?

пример:

 Create table test (col1 int , col2 int)

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

  Select avg(col1) from test 

Если я использую @@rowsapted возвращает число строк, возвращаемых запросом, которое равно 1. Но я хотел бы узнать количество строк, рассматриваемых запросом.

(В моем исходном случае источником является представление, содержащеемного таблиц.)

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011
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 голос
/ 06 сентября 2011

ОК, давайте проведем несколько симуляций и посмотрим, действительно ли это займет 16 минут для подсчета (*).

Тестирование запроса:

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

, где MY_TABLE имеет более 1 500 000 записей, вышеуказанный запрос занимает 1 м 24 с и только 1 с для последующих запусков, поэтому у вас либо много других записей, либо происходит что-то еще.

ДАЛЬНЕЙШИЕ ИСПЫТАНИЯ:

выполнение выберите среднее (цена) среднее из MY_TABLE занимает: 1м25сек

выполнение счетчика выбора (*) cnt из MY_TABLE занимает: 4сек

SQL Server был переустановлен между testw

Протестировано на DELL Vostro 1500 с 2 ГБ оперативной памяти и 2,2 ГГц CORE 2 Duo и Windows 7 32, но с SQL Server 2000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...