|
Posted by bbcworldtour on 05/11/07 12:17
(Pardon me for asking a very basic question. I have come back to SQL
Server after five years of Oracle, and my memory is a tad rusty).
I have a bit of SHOW_PLAN output that I believe that I understand, but
I would appreciate your comments if I am wrong.
I have a requirement to produce a list of the primay key values in a
table along with the total count of rows:
Given this table and contents:
create table taCountDemo (ID char(01) primary key, someData
varchar(50));
insert into taCountDemo (ID,somedata)
select 'a', 'aaaa'
union
select 'b', 'bbbb';
the results should be:
ID counter
---- -----------
a 2
b 2
(don't wonder why - there's a SAS application on top which means that
ordinary rules of logic don't apply)
This is the query that I'm using:
select ID
, cnt.counter
from taCountDemo
cross join
(select counter
from ( select count(*) as counter
from taCountDemo
) as i
) as cnt;
The SHOW_PLAN output is like this:
|--Nested Loops(Inner Join)
|--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(int,
[Expr1009],0)))
| |--Stream Aggregate(DEFINE:([Expr1009]=Count(*)))
| |--Clustered Index Scan(OBJECT:([master].[dbo].
[taCountDemo]. )
|--Clustered Index Scan(OBJECT:([master].[dbo].
[taCountDemo].)
My understanding of this is that the count(*) is only executed ONCE,
and that the nested loop then combines the result (EXPR1006) with all
keys obtained by scanning the primary key index. Or in other words
that the single-"row" result of the count(*) is chosen as the "table"
that drives the loop.
Is that correctly understood?
Thanks for your input
Bo Brunsgaard
Navigation:
[Reply to this message]
|